24. maj 2006 - 02:31Der er
31 kommentarer og 1 løsning
Auto-ID fejl ved INSERT
Hej, jeg har nu siddet i temmelig lang tid og prøvet at finde løsningen på et problem. Jeg har en MySQL database der kører fint. Når jeg skal tilføje noget bruger jeg:
$sql = "INSERT INTO lager values ('', '$_POST[navn]', '$_POST[varenummer]', '$_POST[lokation]', '$_POST[pris]', '$_POST[genbestil]', '$_POST[beskrivelse]')"; if (mysql_query($sql, $conn)) { echo "Tilføjet til lager!"; } else { echo "FEJL!!!"; }
Det har virket uden problemer, indtil jeg lavede en række med Id (auto_increment) som Primary. Når jeg nu prøver at indsætte i databasen, lykkedes det ikke. Jeg mener man bare burde bruge '' og så indsættes Id automatisk, men det virker ikke?
Hvis jeg fjerner Id i tabellen ( og '', før '$_POST[navn]'), virker det dog helt fint!
Hvad gør jeg galt? Hvad skal jeg indsætte for at den automatisk giver et Id? Kan det have noget med hvordan Id er sat op? Den er: Id int(11) No auto_increment
Derudover skal din ID række være af typen primary,unique eller index, før du kan sætte key på den. Og det er kun key som kan have auto-increasement. Læs om det i MySQL's dokumentation.
tdafoobar >> Det er langtfra korrekt ... faktisk tvætimod!
Du hverken må eller kan bruge gåseøjne i et array-kald, når dette i forvejen er escaped. Det vil udløse en parse-error!
Jeg vil anbefale dig at lære lidt mere PHP, inden du råder _så_ skråsikkert - og læse i dokumentationen og/eller evt. teste, hvis du ikke er sikker! ;o)
Derudover skal du nok lige læse lidt i MySQL's dokumentation og få styr på, hvad det mon var, du skulle have skrevet her: "Derudover skal din ID række være af typen primary,unique eller index, før du kan sætte key på den"
"Du hverken må eller kan bruge gåseøjne i et array-kald, når dette i forvejen er escaped. Det vil udløse en parse-error!" a, hva ?.
$array[key] vil give behalde det som om at key er en konstant, og så udløse en error fordi at den ikke er definere (hvis du har høj nok error reporting). For at bruge string keys fra POST data skal der bruge $array['key']
Hvis du mener at det er INDE i et string, er det jo yderst ukorrekt php at gøre det, i sådan et tilfælde bruger man concatenating. Jeg tror du har misforstået hvad jeg mente.
Med "Derudover skal din ID række være af typen primary,unique eller index, før du kan sætte key på den", mente jeg at du ikke kan sætte auto-increasement på et ikke indexkey rækker (men kan måske godt være lidt ukorrekt). Hans problem er fordi at han's "id" ikke er af de 3 typer jeg nævnte, og derfor ikke kan tildeles autoincreasment.
Det eneste jeg forholder mig til er det spørgeren har problemer med. Når man ikke kender spørgerens nivau, så er der ikke nogen grund til at forvire mere end nødvendig ved at skrive sætningen om.
Jeg gætter på at følgende er sakset fra phpmyadmin "Id int(11) No auto_increment" og ud fra det kan man jo ikke se om den har fået en type. Men hvis den tabellen er oprettet i phpmyadmin, så mener jeg da den plejer at brokke sig hvis man sætter autoincrement et sted hvor man ikke må.
Altså burde hamzter kunne fjerne '', og få den til at virke.
"Det eneste jeg forholder mig til er det spørgeren har problemer med. Når man ikke kender spørgerens nivau, så er der ikke nogen grund til at forvire mere end nødvendig ved at skrive sætningen om."
På den måde lærer vi ham jo ikke noget som helst, og sørger for at nettet bliver ved med at have fejlagtigt kode (phpbb,phpnuke, og jeg skal komme efter dig) i de næste mange hundrede år. Vi er her ikke kun for at svare, men også for at gøre folk klogere.
Nej, du må have misforstået et eller andet. Alle steder er array-kaldene escaped af gåseøjne - og så udløser det en fejl at bruge gåseøjne i kaldet.
Der er absolut ingen fejl i at gøre, som det blev vist - og du kan ikke 'proppe' en konstant ind i kaldet, når det er escaped (som du kan, når kaldet står 'frit i luften'). Derfor er det ikke af den grund mere sikkert at bruge konkatenering og gåseøjne i kaldene. At du så måske bedre kan lide den kodestil (hvad jeg iøvrigt selv kan), berettiger ikke til - ovenikøbet understreget med versaler - at skrive man skal bruge gåseøjne i kaldene.
Det var, hvad du kommenterede på. Din kommentar var lodret forkert - og det er der ingen grund til at prøve at bortforklare. Er du i tvivl, tester du bare :)
En primary key er i sig selv en indeksering. En kollonne skal ikke først indekseres, før man kan gøre den til en primary key. Det må bero på en misforståelse.
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in c:\Apache\htdocs\test2.php on line 5
$string2 = "foo ".$array[key]." bar"; // giver fejl
header("Location: index.php");
?>
Notice: Use of undefined constant key - assumed 'key' in c:\Apache\htdocs\test2.php on line 5
Warning: Cannot modify header information - headers already sent by (output started at c:\Apache\htdocs\test2.php:5) in c:\Apache\htdocs\test2.php on line 7
Vil ikke mene der er en fejl, men kan da godt ændre mit ordvalg næste gang. Derudover mener jeg stadig at man SKAL kode ordenlig :-) Altid. Men mon ikke eksemplerne vil lade spørgerne vælge selv.
Hvorfor overhovedet påpege det forkete i at skrive at noget giver fejl, når det giver en notice ?. Hvis jeg havde skrevet "// forkert" istedet for "// giver fejl" , havde du så været tilfreds ? fordi det er forkert at lave kode som giver notices. Derudover er det sidste eksempel et glimrende eksemple på hvorfor man netop skal være opmærksom på denne fejltype.
"As in Perl, you can access a value from the array inside double quotes. However, with PHP you'll need to enclose your array between curly braces." Example 4. Accessing an array inside double quotes:
"Prøv nu at læse, hvad der faktisk står:" Ja, var jo netop det jeg sagde. At det virker, men det anbefales at bruge eksemple 4 som er {} ?-) Tror du liiige overså min pointe der.
print "blabla $a[key] blabla<br>"; // blabla noget blabla print "blabla ".$a[key]." blabla<br>"; // blabla andet blabla print $a[key]; // andet
?> Kan godt se hvad du mener, men dette er nu stadigvæk en fejl i php, ifølge mig og mange andre udviklere. Burde du også selv kunne se
Derudover er det jo yderst slack kode. Jeg forstår simplehen ikke hvorfor du brokker dig over at jeg kræver at folk koder ordenlig, selvom det halv-ordenlige virker. Hvis vi bliver ved på den måde, kommer vi jo aldrig væk fra osCommerce , phpnuke og andre skrækkelige kode eksempler.
Men du mener måske at ordvalg står højere en god kode skik ? Bare fordi at php har så mange måder at kode dårligt på , behøver man nødvendigvis ikke finde den korrekt.
Det frarådes ingen steder, men hvis du bruger gåseøjne i array-kaldet, er der ikke andre muligheder end at bruge 'tuborger' - og det er derfor, hvad der vises i eksemplet.
Der er pokkers til forskel på, at skrive, man 'SKAL' bruge den syntaks, du foretrækker - og så at fraråde andet, fordi du finder den kodestil sloppy. Det er ikke uden grund, man på dansk både har ordet 'bør' og 'skal'.
Der er ikke tale om en _fejl_ i PHP - så havde den været rettet forlængst, uanset hvad du og andre måtte mene.
Hvis du finder det sloppy kode, så skriv dog det ... jeg bruger som sagt også selv konkatenering. Det andet er noget lodret vrøvl!
Wow, det var da godt nok en bunke svar der var kommet! Tak for interessen.
ID er sat som Primary Key, så det er ikke der problemet er. Jeg ved godt koden ikke er specielt sikker, og det skal jeg til at lave om på, men vil først have det her til at virke...:)
Jeg har prøvet at fjerne '' men det virker stadig ikke?
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.