Avatar billede haolan Nybegynder
29. juli 2007 - 01:39 Der er 18 kommentarer og
1 løsning

Kontrol af SQL insert

Hej eksperter

Når jeg opretter noget i MySQL fra en php fil og trykker opdatér vil det samme data blive oprettet i databasen igen eller hvis jeg arbejder videre med noget andet, trykker tilbage og trykker forsøg igen når jeg kommer til oprettelsessiden vil det igen blive oprettet..

Hvordan afhjælper jeg dette problem?

Håber i forstår hvad jeg mener.. Er lidt træt PT.. :P
Avatar billede w13 Novice
29. juli 2007 - 01:44 #1
Redirecter du fra oprettelsessiden? Hvis du sender brugeren videre (med PHP) ligeså snart SQL er udført, skulle det løses.
Avatar billede haolan Nybegynder
29. juli 2007 - 01:46 #2
har bare min formular for neden og min SQL for oven..

altså fx

<?
if($_POST['knap'])
  //UDFØR SQL
?>

<form...>

<input type='text' name='blabla'>
<input type='submit' name='knap' value='hej'>
</form>
Avatar billede haolan Nybegynder
29. juli 2007 - 01:46 #3
God nok i meget grove træk.. men det er den stil jeg har stillet det op i
Avatar billede haolan Nybegynder
29. juli 2007 - 02:07 #4
Grunden til jeg gør på den måde er at jeg bruger samme formular til at udfylde flere ting..

Dvs. når en formular er udfyldt og man trykker submit udføres SQL INSERT for det udfyldte og samtidig vises der en ny formular, som er næste step osv. indtil der ikke er flere steps, antallet af steps er alt afhængig af hvor mange elementer brugeren har valgt at ville oprette.
Avatar billede olebole Juniormester
29. juli 2007 - 02:12 #5
<ole>

<?
if(isset($_POST['knap']) && $_POST['knap']=="hej") {
  //UDFØR SQL

  Header("Location: ".$_POST["retPage"]);
}
?>

<form...>
<input type="hidden" name="retPage" value="<?=$_SERVER["PHP_SELF"]?>">
<input type='text' name='blabla'>
<input type='submit' name='knap' value='hej'>
</form>

- ellers vil du altid have samme problem med F5 og Back-knappen. Det er f.eks. også dén metode, Eksperten bruger  ;o)

/mvh
</bole>
Avatar billede wanze Nybegynder
29. juli 2007 - 02:17 #6
Ellers kan du jo tjekke om indholdet allerede eksisterer, eller du kan smide en unixtime med og se, hvornår brugeren sidst tilføjede noget. På den måde undgår du også at brugerne fylder din database op med junk/spam. :)
Avatar billede haolan Nybegynder
29. juli 2007 - 02:24 #7
hmm får bare et problem med mine headers :S

Man er logget ind på siden, og den er en del af et simpelt CMS system, så derfor er formularen includet ind i en side, hvor den allerde har en header.

Kan ikke rigtig se hvordan man skal lave det anderledes :S
Avatar billede haolan Nybegynder
29. juli 2007 - 02:28 #8
har min index2.php, som er bygget op som hovedelement:

<?
session_start();

$get_site = "blabla"; //TRÆK NUVÆRENDE SITE UD FRA $_GET['sid']


?>

<div class="output_area">
<?

    if($site_type == 'file')
        include($site_content);
    else
        nl2br($site_content);

?>
</div>

Formularen bliver derved includet..

Inde i selve formularfilen bliver der så includet den SQL fil der udfører INSERT:

if($_POST['insert_da']) {
    include('sql/insert_da.php');
    if($sql_status == true) {
        echo udført;   
    }
}
Avatar billede haolan Nybegynder
29. juli 2007 - 02:29 #9
derved er headers already send.... Nogen forslag til hvordan jeg ellers kan stille det op?
Avatar billede olebole Juniormester
29. juli 2007 - 02:37 #10
Du kan vel lægge koden op lige efter 'session_start();'
Avatar billede haolan Nybegynder
29. juli 2007 - 02:43 #11
kunne jeg godt.. Men så får jeg bare en masse SQL-værk til at ligge øverst i min index2.php, som jo også bruges til at vise alle de andre sider, som ikke har noget med den formular at gøre..

Men hvis det er den eneste løsning, må det jo blive sådan..
Avatar billede windcape Praktikant
29. juli 2007 - 03:12 #12
Du bør alligevel _ALTID_ foretage _ALLE_ logiske serverside operations _FØR_ noget som helst output (dvs.. HTML i dit tilfælde).

Alt andet giver kun problemer.
Avatar billede wanze Nybegynder
29. juli 2007 - 14:59 #13
Hvis du indsætter ob_start(); i starten af din fil, så bliver der ikke sendt noget data, før hele siden er blevet gennemført. Så vil du ikke få headerproblem.
Avatar billede olebole Juniormester
30. juli 2007 - 00:29 #14
Output-buffering (ob_start og ob_flush) er en panikløsning, der ofte bruges til at redde dårlig kodestil - hvilket helt klart ville være tilfældet her. Det sløver serverens performance dramatisk (æder serverens hukommelse) og bør derfor undgåes, når det overhovedet kan lade sig gøre.

Derimod har windscape helt ret i sin kommentar. Dén er udtryk for god og sund kodestil  ;o)
Avatar billede haolan Nybegynder
31. juli 2007 - 20:34 #15
Jeg synes bare aldrig jeg kan få det til at hænge sammen når det skal stå i toppen.. Så forsvinder ligesom idéen ved at bruge include i sine filer.. Og at samle det hele i én fil bliver også noget elendigt rod. :S
Avatar billede haolan Nybegynder
31. juli 2007 - 20:58 #16
Min måde at programmere på er som oftest at dele en del ting op i mapper.

Fx har jeg et bibliotek til functions, hvor jeg gemmer alle functions i hver sin fil med funktionens navn.
Jeg har også en mappe til forms, hvor jeg ligger alle mine formularer ind.

Øverst i min kode har jeg altid et tjek på om en bruger er logget ind, hvis ikke, så er der exit og header location;

Længere nede på samme side fremkommer opbygningen af mit site i divs og i den div hvor indholdet skal være tjekker jeg på om den side den forsøger at åbne er en ren tekst fil den kan hente direkte fra databasen eller om det er en .php fil den skal finde et andet sted.

Hvis det er en fil bliver den includet og på den måde får jeg sat alle sitets funktioner ind på siden alt efter hvad man nu har trykket sig frem til i menuen.

Mange af de funktioner har MySQL oprettelser, og lign.. Derfor bliver selve oprettelserne også includet midt på den side der vises.

Efter kommentarerne på denne har jeg pillet mit MySQL insert kald ud i en fil for sig selv, som herefter sender brugeren videre til en anden side med header location. Og denne fil indeholder ren php, kode og derved ingen udskrifter.. MEN opstår der fejl i databasen vil den jo meget gerne have lov at udskrive en fejlmeddelse på den side den opstår på, og når den gør det bryder den min header og sitet sendes ikke videre, hvordan jeg undgår dette og får givet brugeren en pæn fejlmeddelse på den næstkommende side har jeg ingen idé om..

Men kom endelig med kommentarer til min måde at kode på, udfra det jeg har skrevet om det, det er jo den eneste måde man lærer af sine fejl :)

Spørg endelig hvis i vil vide mere om min kodestil.

--> Olebole smid svar for points, det er din metode jeg har brugt til at løse mit problem, som dette spørgsmål gik ud på :)
Avatar billede haolan Nybegynder
31. juli 2007 - 20:59 #17
opretter lige et nyt spørgsmål til det med kodestil, da det jo må være pointsberrettiget at komme med konstruktiv kritik :)
Avatar billede haolan Nybegynder
31. juli 2007 - 21:00 #18
Avatar billede olebole Juniormester
01. august 2007 - 13:39 #19
Du får et svar  ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester