Avatar billede impulze Nybegynder
17. april 2010 - 05:25 Der er 6 kommentarer og
1 løsning

Fejl i "SQL syntax" via UPDATE

Hej

Er ved at lave en lille shop i php/mysql, men der kommer en fejl når jeg vil lave en UPDATE på en vare, som er valgt fra en udtrækningsliste.

Selve udplukket for edit-filen ser sådan ud:
<form method="post" action="form.handle.php">
<input type="hidden" name="referer" value="edit_shop">
<input type="hidden" name="id" value="<?php echo $_GET['id']; ?>">
<input type="hidden" name="offset" value="<?php echo $_GET['offset']; ?>">

<div class="r">group</div> <input type="text" name="group" value="<?php echo $row['group']; ?>" style="width: 300px"><br>
<div class="r">product</div> <input type="text" name="product" value="<?php echo $row['product']; ?>" style="width: 300px"><br>
<div class="r">manufacturer</div> <input type="text" name="manufacturer" value="<?php echo $row['manufacturer']; ?>" style="width: 300px"><br>
<div class="r">stock</div> <input type="text" name="stock" value="<?php echo $row['stock']; ?>" style="width: 300px"><br>
<div class="r">costprice</div> <input type="text" name="costprice" value="<?php echo $row['costprice']; ?>" style="width: 300px"><br>
<div class="r">offer</div> <input type="text" name="offer" value="<?php echo $row['offer']; ?>" style="width: 300px"><br>
<div class="r">image</div> <input type="text" name="image" value="<?php echo $row['image']; ?>" style="width: 300px"><br>
<div class="r">date_created</div> <input type="hidden" name="date_created" value="<?php echo $row['date_created']; ?>" style="width: 300px"><br>
<div class="r">status</div> <input type="text" name="status" value="<?php echo $row['status']; ?>" style="width: 300px"><br>

<div class="r">description</div> <textarea name="description" rows="10" cols="0" style="width: 300px"><?php echo $row['description']; ?></textarea><br><br>

<div class="r">&nbsp;</div> <input type="submit" value="Send">
</form>


Og selve formlen ser sådan ud:
if ($_POST['referer'] == 'edit_shop') {
    mysql_query("UPDATE shop SET group='".$_POST['group']."', product='".$_POST['product']."', manufacturer='".$_POST['manufacturer']."', description='".$_POST['description']."', stock='".$_POST['stock']."', costprice='".$_POST['costprice']."', offer='".$_POST['offer']."', image='".$_POST['image']."', date_created='".$_POST['date_created']."', date_changed='".time()."', status='".$_POST['status']."' WHERE id=".$_POST['id']."") or die(mysql_error());
    header("Location: shop.list.php?offset=".$_POST['offset']);
}


Når jeg prøver på at lave en UPDATE, så ser fejlen sådan ud:
"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 'group='Harddisk', product='DiamondMax 22 750GB', manufacturer='Maxtor ', descrip' at line 1"


Synes selv at jeg har testet igennem fra start til slut for at se hvad der driller, men har ikke heldet med mig.

Håber der er nogen der kan hjælpe mig med at gennemskue dette.
Avatar billede Naddo Nybegynder
17. april 2010 - 06:19 #1
Hvad står der i description når du Submitter?

Står kolonne navnene helt rigtigt som i mysql databasen og er de af den type som du sætter dem ind med via php?

er ikke helt sikker, men hvis det er en int (tal) som du har sat den til i databasen skal der ikke ' ' uden om, det er kun hvis det er tekst eller datetime (og andre typer..).
Avatar billede Slettet bruger
17. april 2010 - 06:20 #2
Ser ud til at din kolonne "group" hører under de reserverede ord.
Problemet løses ved at smide ` rundt om "group" så det bliver til `group`
Du kan se listen over reserverede ord her: http://dev.mysql.com/doc/refman/5.1/en/reserved-words.html
Avatar billede RippieUK Nybegynder
17. april 2010 - 10:48 #3
Roxki: Jeg var ikke klar over reserved words i MySQL, tusinde tak for lige at gøre opmærksom på det. Er det forresten nødvendigt at have ". ." rundt om alle de $_POST['var1'] i mysql queries ? er ret sikker på jeg ikke har dem der. har dem dog alle andre steder i php koden :)

Impulze: Din php syntax ser ok ud ifølge http://www.meandeviation.com/tutorials/learnphp/php-syntax-check/syntax-check.php?Submit=Check+another+file :)
Avatar billede impulze Nybegynder
17. april 2010 - 12:49 #4
Godmorgen..
Ja jeg faldt i søvn efter jeg havde oprettet denne spørgsmål :P

Jeg har kigget jeres svar igennem og valgte at rette det som roxki gjorde mig opmærksom på, at "group" hører under de reserverede ord. Efter jeg rettede det til "groups", så virkede kørselen helt fint!

Jeg burde havde vidst at fejlen  var i den boldbane, men mange tak til jer alle sammen!

RippieUK:
Tak for dit link, den skal jeg huske til i fremtiden! :)
Avatar billede impulze Nybegynder
17. april 2010 - 12:50 #5
roxki, smider du lige et svar? :)
Avatar billede Slettet bruger
17. april 2010 - 13:54 #6
Du har får et svar her.
Avatar billede Slettet bruger
17. april 2010 - 14:06 #7
@RippieUK: Grunden til at der hele tiden bruges " . $variable . " er fordi det ikke altid er lige smart at bruge variabler direkte i PHP og iøvrigt virker det kun hvis det er imellem double quotes.
Derudover hvis du nu skriver dine variabler direkte ind uden at stoppe din streng med punktum, f.eks. " . $variable så kan det også være afgørende for om din variable virker korrekt.
Lad mig give dig et eksempel nu vi er igang:
<?php
mysql_query("UPDATE `users` SET `name` = '$_POST["name"]', `by` = '$_POST["by"]'");
?>

Double quotsne der skal få hhv. "name" og "by" inde i $_POST bracketsne vil ødelægge din SQL forspørgelse. Så tænker du sikkert, jamen så bruger jeg bare single quotes istedet, men det vil også ødelægge din SQL forspørgelse! Hvorfor? Se her:
<?php
// Dette er alt der kommer med da de første double qoutes i $_POST[] stopper din SQL-streng
mysql_query("UPDATE `users` SET `name` = '$_POST[");

// Så vi prøver med single quotes istedet
mysql_query("UPDATE `users` SET `name` = '$_POST['"));
// Dette er alt vi får med denne gang, da din single qoute inde i $_POST bracket-en stopper starten på din streng INDE i SQL forspørgelsen! SQL forspørgelsen går videre men du vil få fejl da der ikke er noget der hedder $_POST['
?>

Så for at komme uden om alle de ting så stopper man midlertidigt den streng man skal have variablen i og smider et punktum bagefter for at fortælle vi vil bygge videre på den.
Efter det punktum kan du så indsætte en variabel uden at være bange for at nogle quotes vil ødelægge alt andet.

Håber det gav mening! :-)
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

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