Avatar billede hamzter Nybegynder
24. maj 2006 - 02:31 Der 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

Håber på lidt hjælp! På forhånd tak!
Avatar billede mixeren Nybegynder
24. maj 2006 - 02:44 #1
Når du bruger '' så sætter du et tomt indhold. Ingen ting er jo også noget. ;-)

Når id er sat til auto increment så skal du bare lade være med at angive noget.
Altså burde denne virke:

$sql = "INSERT INTO lager values ('$_POST[navn]', '$_POST[varenummer]', '$_POST[lokation]', '$_POST[pris]', '$_POST[genbestil]', '$_POST[beskrivelse]')";
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 02:56 #2
Undskyld mig , men den kode der er super farlig, og vil faktisk give fejl med der f.eks. er ' \ og andre teng i beskrivelsen.

Derudover SKAL du bruge '' i arrays, altså $_POST['navn'] IKKE $_POST[navn];

Kig på www.php.net/addslashes , www.php.net/mysql_real_escape_string , og sprintf() til at lave sql strings med.

Jeg vil anbefale jer begge 2 et hurtig kig i http://www.eksperten.dk/artikler/971
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 02:56 #3
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.
Avatar billede olebole Juniormester
24. maj 2006 - 03:24 #4
<ole>

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"

- det giver ikke mening i mit hovede  :)

/mvh
</bole>
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 06:49 #5
"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.
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 06:51 #6
$string = "foo $array['key'] bar"; // giver fejl
$string = "foo ".$array[key]." bar"; // giver fejl
$string = "foo ".$array['key']." bar"; // korrekt

Ikke skråsikkert råd, nærmere dårlig formulering kl. 3 om natten.
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 06:52 #7
$sql = sprintf"INSERT INTO lager VALUES ('%s','%s','%s','%s','%s','%s')",addslashes($_POST['navn'], etc...);

...er forresten er meget dejlig måde at lave SQL strings på ;)
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 06:53 #8
ups, typo.. glemte et ( ved sprintf() kaldet.
Avatar billede mixeren Nybegynder
24. maj 2006 - 07:15 #9
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.
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 07:20 #10
"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.
Avatar billede olebole Juniormester
24. maj 2006 - 07:32 #11
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.
Avatar billede olebole Juniormester
24. maj 2006 - 07:35 #12
$string = "foo ".$array[key]." bar"; // giver fejl

Det passer heller ikke - men det kan give uventede resultater. Det er ikke sikkert, men udløser ikke pr. definition en fejl.

"Vi er her ikke kun for at svare, men også for at gøre folk klogere."

- netop ... så lad os gøre det  ;o)
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 07:37 #13
<?php

$array['key'] = 'h4x';

$string1 = "foo $array['key'] bar"; // giver fejl
//$string2 = "foo ".$array[key]." bar"; // giver fejl
//$string3 = "foo ".$array['key']." bar"; // korrekt

?>

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

<?php

$array['key'] = 'h4x';

//$string1 = "foo $array['key'] bar"; // giver fejl
$string2 = "foo ".$array[key]." bar"; // giver fejl
//$string3 = "foo ".$array['key']." bar"; // korrekt

?>


Notice: Use of undefined constant key - assumed 'key' in c:\Apache\htdocs\test2.php on line 6

<?php

$array['key'] = 'h4x';

//$string1 = "foo $array['key'] bar"; // giver fejl
//$string2 = "foo ".$array[key]." bar"; // giver fejl
$string3 = "foo ".$array['key']." bar"; // korrekt

?>

Ingen fejl.
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 07:38 #14
Standard php5.1.2 configurering :-)
Avatar billede olebole Juniormester
24. maj 2006 - 07:39 #15
Lige min pointe!
    $string2 = "foo ".$array[key]." bar"; // giver fejl
- giver ingen fejl!
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 07:39 #16
<?php

$array['key'] = 'h4x';

$string1 = "foo $array[key] bar";

?>
Virker skam også, men frarådes af php.net , istedet anbefaler de at man bruger eksemple 4 fra http://dk.php.net/manual/en/function.array.php

Enig nu ?
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 07:40 #17
olebole, jeg mener at en "notice" også er en fejl.
Avatar billede olebole Juniormester
24. maj 2006 - 07:41 #18
Endnu engang min pointe. Det handler ikke om at 'mene'. En notice er en notice ... ikke en error. Det handler om simpelt engelsk
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 07:42 #19
Og her er et eksempel på hvorfor:

<?php

$array['key'] = 'h4x';

$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

- Headerfejl pga. noticen ;)
Avatar billede olebole Juniormester
24. maj 2006 - 07:42 #20
- og så er der pokkers til forskel på at fraråde - og så skrive: "man SKAL ..."
Avatar billede olebole Juniormester
24. maj 2006 - 07:43 #21
*ROTFLMAO* nu er du zq _for_ langt ude i dine kejtede forsøg på at bortforklare dine fejl  :D

Jeg opgiver her og håber på, du lærer at tage fejl
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 07:47 #22
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.
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 07:49 #23
(Og hvorfor er det tvetydigt at hvad jeg skriver selvfølgelig er min personlige mening/vudering.)
Avatar billede olebole Juniormester
24. maj 2006 - 07:54 #24
Jamen, hvis du pusher dine egne præferencer, så er det da seriøst dumt at skrive, at man SKAL gøre noget andet!

Det, der blev skrevet og det, du kommenterede på:
    $string1 = "foo $array[key] bar";
- _kan_ ikke give fejl.

Tag dig nu sammen og lad være med at være så desparat
Avatar billede olebole Juniormester
24. maj 2006 - 08:03 #25
Dette er også lodret forkert:

$array['key'] = 'h4x';

$string1 = "foo $array[key] bar";

?>
Virker skam også, men frarådes af php.net , istedet anbefaler de at man bruger eksemple 4 fra http://dk.php.net/manual/en/function.array.php

Prøv nu at læse, hvad der faktisk står:

"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:

$foo = array('bar' => 'baz');
echo "Hello {$foo['bar']}!"; // Hello baz!

- det er da ikke så svært!
Avatar billede olebole Juniormester
24. maj 2006 - 08:06 #26
- og er du stadig i tvivl, så prøv dette:

define("key", "tja");
$a["key"] = "noget";

print "blabla $a[key] blabla";
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 08:22 #27
"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.

---
<?php

define("key", "tja");
$a["key"] = "noget";
$a["tja"] = "andet";

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.
Avatar billede olebole Juniormester
24. maj 2006 - 08:36 #28
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!
Avatar billede hamzter Nybegynder
24. maj 2006 - 09:46 #29
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?
Avatar billede tdafoobar Nybegynder
24. maj 2006 - 09:53 #30
INSERT INTO lager(skriv,dine,kolloners,navne,her) VALUES ('$variable','$variable')

^^ sådan der. Og selvom du skulle have misforstået olebole's kritik, så skal du altså stadig bruge addslashes eller mysql_real_escape string for at

a) undgå SQL fejl med specialtegn som ' \ osv.
b) undgå SQL injections

Derfor kan du ikke bruge $_POST['key'] direkte alligevel. Så for at løse det sætter du en variabel.

$navn = mysql_real_escape_string($_POST['navn']); // og ja, her SKAL du bruge quotes uden om.
Avatar billede hamzter Nybegynder
24. maj 2006 - 11:59 #31
så virker det! Og så har jeg samtidig fået styr på hvordan man undgår at bruge _POST.

Tusind tak for hjælpen. Smid et svar, så får du point.
Avatar billede hamzter Nybegynder
08. november 2007 - 09:03 #32
lukker.. ;)
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