Avatar billede mostcrazy Nybegynder
16. august 2008 - 15:11 Der er 26 kommentarer og
1 løsning

Mysql_query problem

Hey,

Nogen der kan gennemskue fejlen her?

if (isset($HTTP_POST_VARS['item'])) {
    mysql_query("INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('($HTTP_POST_VARS['item'])','($HTTP_POST_VARS['shop'])','($HTTP_POST_VARS['qty'])'") OR DIE(mysql_error());
}
Avatar billede w13 Novice
16. august 2008 - 15:13 #1
Hvad er problemet da?
Avatar billede w13 Novice
16. august 2008 - 15:14 #2
Du kan prøve:

if (isset($HTTP_POST_VARS['item'])) {
    mysql_query("INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('".$HTTP_POST_VARS['item']."','".$HTTP_POST_VARS['shop']."','".$HTTP_POST_VARS['qty']."'") OR die(mysql_error());
}
Avatar billede mostcrazy Nybegynder
16. august 2008 - 15:15 #3
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
Avatar billede mostcrazy Nybegynder
16. august 2008 - 15:17 #4
Dit forslag giver den her fejl når data bliver postet

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Avatar billede erikjacobsen Ekspert
16. august 2008 - 15:18 #5
eller

if (isset($HTTP_POST_VARS['item'])) {
    mysql_query("INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('{$HTTP_POST_VARS['item']}','{$HTTP_POST_VARS['shop']}','{$HTTP_POST_VARS['qty']}'") OR DIE(mysql_error());
}

men bruge hellere $_POST-variablen, og sørg for du ved "alt" om SQL-injektions inden du lægger på nettet til fri benyttelse.
Avatar billede w13 Novice
16. august 2008 - 15:20 #6
Hvis Eriks forslag også fejler, så prøv lige:

echo "INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('{$HTTP_POST_VARS['item']}','{$HTTP_POST_VARS['shop']}','{$HTTP_POST_VARS['qty']}'";

Så skulle vi se, hvordan din SQL-sætning bliver genereret.
Avatar billede mostcrazy Nybegynder
16. august 2008 - 15:22 #7
Erik det giver samme fejl om SQL-syntaks

Som jeg har forstået det, så er http_post_vars en mere effektiv og simple måde, at køre det på?

Det er kun meningen, at det er til mit eget brug, så umiddelbart burde injektion-problematikken ikke være så aktuel igen
Avatar billede mostcrazy Nybegynder
16. august 2008 - 15:26 #8
Det udløser en syntaks fejl
Avatar billede w13 Novice
16. august 2008 - 15:28 #9
Og hvad så med:

echo "INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('".$HTTP_POST_VARS['item']."','".$HTTP_POST_VARS['shop']."','".$HTTP_POST_VARS['qty']."'";

?
Avatar billede mostcrazy Nybegynder
16. august 2008 - 15:29 #10
same same
Avatar billede w13 Novice
16. august 2008 - 15:30 #11
Og det er ikke fordi du stadig har din mysql_query-linje som i virkeligheden er den, der giver syntaksfejl? For så er det jo klart, der ikke er nogen forskel.
Avatar billede erikjacobsen Ekspert
16. august 2008 - 15:32 #12
http_post_vars bliver fjernet fra PHP på et tidspunkt.

Vis os den kode, der går galt, og hvad fejlbeskeden er.
Avatar billede mostcrazy Nybegynder
16. august 2008 - 16:03 #13
Her kom SQL-sætningen

INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('ting','butik','12'

Koden er som følger:

<?
mysql_connect("serveren", "brugernavn", "adgangskode") or die(mysql_error());
mysql_select_db("db") or die(mysql_error());

if (isset($HTTP_POST_VARS['item'])) {
   
echo "INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('".$HTTP_POST_VARS['item']."','".$HTTP_POST_VARS['shop']."','".$HTTP_POST_VARS['qty']."'";
    //mysql_query("INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('{$HTTP_POST_VARS['item']}','{$HTTP_POST_VARS['shop']}','{$HTTP_POST_VARS['qty']}'") OR DIE(mysql_error());
}
?>
Avatar billede mostcrazy Nybegynder
16. august 2008 - 16:08 #14
med $_POST istedet, som udløser samme fejl i SQL'en som før (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1)

<?
mysql_connect("serveren", "brugernavn", "adgangskode") or die(mysql_error());
mysql_select_db("db") or die(mysql_error());

if (isset($_POST['item'])) {
   
echo "INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('".$_POST['item']."','".$_POST['shop']."','".$_POST['qty']."'";
    //mysql_query("INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('{$_POST['item']}','{$_POST['shop']}','{$_POST['qty']}'") OR DIE(mysql_error());
}
?>
Avatar billede erikjacobsen Ekspert
16. august 2008 - 16:43 #15
Du kan ikke få en SQL-fejl i den kode du viser her, når mysql_query sætningen er udkommenteret.
Avatar billede erikjacobsen Ekspert
16. august 2008 - 16:45 #16
Men hvis du ellers viste os den kode, der faktisk hører til fejlbesked, eller udskriften fra den kode du faktisk viser, så kunne vi måske nemmere se, at du bare mangler en højreparentes.
Avatar billede w13 Novice
16. august 2008 - 17:00 #17
Ja, du mangler jo faktisk bare en afsluttende parentes, således:

if (isset($HTTP_POST_VARS['item'])) {
    mysql_query("INSERT INTO ShoppingList (Item, Shop, Qty) VALUES ('{$HTTP_POST_VARS['item']}','{$HTTP_POST_VARS['shop']}','{$HTTP_POST_VARS['qty']}')") OR DIE(mysql_error());
}
Avatar billede dkfire Nybegynder
16. august 2008 - 17:23 #18
Kunne det ikke også tænkes at feltet Qty var en int og derfor ikke behøvede '' omkring værdien.
Avatar billede erikjacobsen Ekspert
16. august 2008 - 18:10 #19
Mysql - selv i nyere versioner - accepterer meget gerne '...' rundt om talværdier i talfelter.

Det ville jo være så kedeligt for udviklere, hvis alle systemer bare overholdt alle standarder :)
Avatar billede tmi Nybegynder
17. august 2008 - 06:16 #20
Det er en god idé altid at putte ' (singlequote) omkring alle variabler for at undgå SQL injections. Altså uanset om det er tal eller text
Avatar billede erikjacobsen Ekspert
17. august 2008 - 08:00 #21
'...' i sig selv beskytter ikke mod noget. Man skal som PHP udvikler være ganske meget oppe på tæerne for at følge med i standardindstillingerne for nye versioner af PHP, for ellers falder man i med alle ben en gang i fremtiden, og har en stribe af huller til sql-injection i sine scripts. Så har journalisterne noget skrive om ;)

Den "gode idé" er nok mere at bruge mysqli-metoder sammen med parameters/prepared statements (kært barn har mange navne...). Det er den fremtidsskrede metode, og den der vises her i spørgsmålet - altså opbygning af sql-sætninger ved streng-sammensætning - bør afgå en stille død. Det sker desværre ikke, da lærebøger i mange år har brugt den, uden at advare om problemet.
Avatar billede tmi Nybegynder
17. august 2008 - 09:37 #22
Magic quotes er som default slået til i php, så det er umuligt for brugeren at ændre på en forespørgsel via brugerinput (altså $_POST, $_REQUEST, $_GET eller $_COOKIE), blot værdierne er omklamret af singlequotes.

Fx hvis login-formularen består af et brugernummer og et password og nummeret ikke er omklamret kan du ændre forespørgslen uden brug af quotes, fx ved at sige dit brugernummer er: 1 OR 1 OR - som garanteret altid vil returnere sandt og logge dig ind som den først indsatte bruger (garanteret admin).

SQL forespørgsler uden brug af SQL lyder mildest talt besværligt, medmindre man kun lave ultra simple forespørgsler..
Avatar billede erikjacobsen Ekspert
17. august 2008 - 09:41 #23
"Magic quotes er som default slået til i php" - jah, ofte, endnu da.
Avatar billede tmi Nybegynder
17. august 2008 - 10:30 #24
Ja, det bliver slået fra i PHP 6 når den kommer, og det er jo komplet latterligt. Deres ene argument for at fjerne funktionen er performance, men eftersom det virker fint nu, samtidig med at computere bliver hurtigere og hurtigere hver dag, er det en rimelig dårlig grund, hellere være på den sikre side.
Argument nr. 2 er at det er irriterende at se \" i emails og andre steder - Aaahh!! Ja det er godt nok irriterende, men mon ikke det er mere irriterende at få hacked sin side? Så hellere være opmærksom på at fjerne dem, end at være opmærksom på at tilføje dem.
Tag .net som et rigtig godt argument til hvorfor de ikke skal fjernes:
http://newz.dk/microsoft-gaar-til-kamp-mod-sql-injection

Kunne ikke lige finde andre steder at brokke mig over det :-P
Avatar billede erikjacobsen Ekspert
17. august 2008 - 10:41 #25
Næh, argumentet er at det slet ikke er nok til at sikre mod sql-injection. Der er kun et sted at sikre det, og det er i "opbygningen" af sql-sætningen. Det var sikkert godt nok for 10 år siden, men det er en sovepude i dag. Og det er gevaldig langt væk fra moderne softwareudvikling. Det er det rigtige skridt i PHP 6, men faktisk mange år for sent.
Avatar billede tmi Nybegynder
17. august 2008 - 10:56 #26
Jeg kan gå med til at de fjerner det, hvis de giver os en sprintf der tilføjer slashes til alle variablerne, men problemet er jo ikke dig og mig, problemet er alle der lærer at programmere PHP der hjemme i fritiden, de har intet begreb om sikkerhed. PHP er jo gratis og følger med alle webhoteller. En ting er at disable det, men at fjerne det helt :-/
Hvis PHP vil aggere som moderne softwareudvikling skulle de starte med at få styr på variabel typerne, så man ikke bare kan sige if (array("test") == true) og andre mærkelige ting, der fjerner alt logisk sands
Avatar billede erikjacobsen Ekspert
17. august 2008 - 11:02 #27
Ja, det vil blive et problem - og webhoteller, der ikke beskytter deres kunder mod hinanden, vil også blive et problem.

Til gengæld bliver det nemmere at se, hvem der er amatører ;)

Og det eneste, der er galt, er en gammel og forkert beslutning, der fik lov til at leve alt for længe.
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