2010-04-03 7 views
0

j'ai écrit une fonction très simple:syntaxe MySQL: Vous avez une erreur dans votre syntaxe SQL

function editCategory() { 
    $ID   = urlencode($_GET['id']); 
    $cname = mysql_fix_string($_POST['cname']); 
    $kabst = mysql_fix_string($_POST['kabst']); 
    $kselect = $_POST['kselect']; 
    $subsl  = $_POST['subsl']; 
    $kradio  = $_POST['kradio']; 
    $ksubmit = $_POST['ksubmit']; 

    if (isset($ksubmit)) { 
     $query = "UPDATE category SET name = '$cname', description = '$kabst', published = '$kselect', home = '$kradio', subcat = '$subsl' WHERE id = $ID "; 

     $result = mysql_query($query); 
     if (mysql_affected_rows() == 1) { 
      echo "ok"; 
     } 
     else{ 
      echo mysql_error(); 
     } 
    } 
} 

function mysql_fix_string($string) 
{ 
    if (get_magic_quotes_gpc()) 
     $string = stripslashes(($string)); 
    return mysql_real_escape_string($string); 
} 

Erreur:

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

Qu'est-ce qui ne va pas?

+2

Pourriez-vous s'il vous plaît renvoyer la requête SQL résultante et nous le donner? –

+0

@jasmine il veut dire 'echo $ query', avant d'appeler' mysql_query', donc nous pouvons voir à quoi ressemble la requête - pour savoir où se trouve l'erreur. –

+0

if (! $ Query) { die ('Requête invalide:'. Mysql_error()); } Je suis désolé, ce script m'a rendu fou: (( Seulement une page blanche ... –

Répondre

0

Voici un exemple d'une CRU très simple demande D, juste pour montrer comment passer un id:

<? 
mysql_connect(); 
mysql_select_db("new"); 
$table="test"; 
if($_SERVER['REQUEST_METHOD']=='POST') { //form handler part: 
    $name = mysql_real_escape_string($_POST['name']); 
    if ($id=intval($_POST['id'])) { 
    $query="UPDATE $table SET name='$name' WHERE id=$id"; 
    } else { 
    $query="INSERT INTO $table SET name='$name'"; 
    } 
    mysql_query($query) or trigger_error(mysql_error()." in ".$query); 
    header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']); 
    exit; 
} 
if (!isset($_GET['id'])) { //listing part: 
    $LIST=array(); 
    $query="SELECT * FROM $table"; 
    $res=mysql_query($query); 
    while($row=mysql_fetch_assoc($res)) $LIST[]=$row; 
    include 'list.php'; 
} else { // form displaying part: 

    if ($id=intval($_GET['id'])) { 
    $query="SELECT * FROM $table WHERE id=$id"; 
    $res=mysql_query($query); 
    $row=mysql_fetch_assoc($res); 
    foreach ($row as $k => $v) $row[$k]=htmlspecialchars($v); 
    } else { 
    $row['name']=''; 
    $row['id']=0; 
    } 
    include 'form.php'; 
} 
?> 

fichier form.php:

<form method="POST"> 
<input type="text" name="name" value="<?=$row['name']?>"><br> 
<input type="hidden" name="id" value="<?=$row['id']?>"> 
<input type="submit"><br> 
<a href="?">Return to the list</a> 
</form> 

Fichier list.php :

<a href="?id=0">Add item</a> 
<? foreach ($LIST as $row): ?> 
<li><a href="?id=<?=$row['id']?>"><?=$row['name']?></a> 
<? endforeach ?> 
+0

@Col. Shrapnel Votre exemple a résolu mon problème. J'ai appris à obtenir un identifiant de poste pas urlquery. Merci pour votre aide. –

+1

@jasmine bien qu'il puisse être passé via urlquery aussi. vous avez juste à le mettre là. Dans mon exemple ce serait '

"> 'mais je préfère utiliser urlquery pour contrôler le flux de mon application. –

6
$ID   = intval($_GET['id']); //using urlencode here is weird 
$cname  = mysql_real_escape_string($_POST['cname']); 
//and the same for the rest ALL. 
$kradio  = mysql_real_escape_string($_POST['kradio']); 

En outre,

$ksubmit = $_POST['ksubmit']; 
if (isset($ksubmit)) { 

est insensée. $ ksubmit serait toujours mis en il devrait être

if (isset($_POST['ksubmit'])) { 

Pour être sûr que vous avez toutes les variables, s'il vous plaît ajouter ces lignes en haut du script:

ini_set('display_errors',1); 
error_reporting(E_ALL); 
+0

Mieux encore 'si (true! = Vide ($ _ POST [ 'ksubmit'])) fonction' –

+0

mysql_fix_string ($ string) \t \t { \t \t si (get_magic_quotes_gpc()) \t \t $ string = stripslashes (($ string)); \t \t return mysql_real_escape_string ($ string); \t} Le même problème ... –

+0

@jasmine Mais vous êtes. 1. cette fonction est erronée. ça doit être mysql_real_escape_string et rien d'autre. 2. il doit être appliqué à tous les champs que vous avez inclus entre guillemets dans la requête, pas seulement deux. 3. Avez-vous la variable $ _GET ['id']? Voir l'addon à mon message. –

0

Sons comme une variable vide.

Et de faire quelque chose contre l'injection SQL, tout le monde peut pirater votre base de données. Avec un peu de chance, vous êtes celui qui tue votre base de données ... Utilisez mysql_real_escape_string() pour toutes les entrées de l'utilisateur dans vos requêtes.

+0

fonction mysql_fix_string ($ string) \t \t { \t \t si (get_magic_quotes_gpc()) \t \t $ string = stripslashes (($ string)); \t \t return mysql_real_escape_string ($ string); \t} c'est la même chose avec mysql_real_escape_string();) et « je ne suis pas » celui de tuer « ma » base de données –

+0

Et pourquoi protégez-vous seulement quelques paramètres contre l'injection SQL et laisser les autres vulnérables? Vous tuez toujours votre base de données, désolé pour les mauvaises nouvelles. –

+0

Je ne savais pas qu'il est nécessaire pour sélectionner et boutons radio. Merci pour les mauvaises nouvelles. –

1

Vous devez vous assurer que:

  • Pour les champs qui sont des chaînes (varchar/char) dans le DB:
    • les valeurs que vous êtes de passage sont correctement placées entre guillemets
    • le contenu des valeurs que vous transmettez doit être échappé: s'il y a un guillemet dans ce que l'utilisateur POSTE, il doit être échappé - voir mysql_real_escape_string
  • Pour les champs qui sont des nombres entiers dans le DB:
    • Vous devez transmettre des valeurs entier
    • qui peut être assuré en appelant intval sur les valeurs POSTée par l'utilisateur


Ici, vous devriez probablement:

  • Utilisez intval() sur $_GET['id']
  • Utilisez mysql_real_escape_string dans d'autres champs.
    • de la requête en juger, dans laquelle tous les domaines, à l'exception id sont jointes à guillemets simples, je dirais que vous devez utiliser mysql_real_escape_string sur tous les domaines - sauf id, bien sûr.


En sidenote:

  • Vous utilisez $_GET pour id
  • Et $_POST pour tout le reste.

Est-ce intentionnellement?

+0

fonction mysql_fix_string ($ string) \t \t { \t \t si (get_magic_quotes_gpc()) \t \t $ string = stripslashes (($ string)); \t \t return mysql_real_escape_string ($ string); \t} Mais le même problème avec intval() et mysql_real_escape_string –

Questions connexes