2010-01-19 6 views
1

Hey, j'ai écrit du code pour extraire des informations de la base de données et vérifier si elles rencontraient les données $ _COOKIE. Mais je reçois le message d'erreur:Erreur SQL dans php

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

Mon code à ce jour est:

$con = mysql_connect("XXXX","XXXXX","XXXXXXX"); 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 
mysql_select_db("XXXXXX", $con); 
$id = $_COOKIE['id']; 
$ends = $_COOKIE['ends']; 
$userid = strtolower($_SESSION['username']); 
$queryString = $_GET['information_from_http_address']; 
$query = "SELECT * FROM XXXXX"; 
$result = mysql_query($query) or die(mysql_error()); 
    while($row = mysql_fetch_array($result)){ 
    if ($queryString == $row["orderid"]){ 
     $sql="UPDATE members SET orderid = ''WHERE (id = $id)"; 
     $sql="UPDATE members SET level = 'X'WHERE (id = $id)"; 
     $sql="UPDATE members SET payment = 'XXXX'WHERE (id = $id)"; 
     $sql="UPDATE members SET ends = '$ends'WHERE (id = $id)"; 
     if (!mysql_query($sql)) 
     { 
      die('Error: ' . mysql_error()); 
     } 
    } 
    } 

Toute aide serait appréciée, Merci.

+0

l'information qu'il sort de l'adresse Web est dans ce format: XXXXX-XXXXX-XXXXX – Crazyd22

Répondre

2
$sql="UPDATE members SET ends = '$ends'WHERE (id = $id)"; 

devrait être

$sql="UPDATE members SET ends = '$ends'WHERE (id = '$id')"; 

(IE ajouter le 'environ $ id)

+0

Ah ça fonctionne bien maintenant, merci! : D – Crazyd22

+0

Notez les autres réponses concernant les attaques par injection SQL si ces variables proviennent de n'importe où l'utilisateur peut toucher ... –

+0

Ceci serait correct pour tous les ID non-entiers – LukeP

1

Je ne suis pas sûr si c'est l'erreur, mais vous rendez-vous compte que votre code exécute seulement la dernière mise à jour? Nous assignons $sql 4 fois, et seulement en cours d'exécution après la quatrième assignement ...

+0

Tellement vrai, bon point! – Thomas

0

d'abord de vous garder variable sql écraser de $ alors que le

$sql="UPDATE members SET ends = '$ends'WHERE (id = $id)"; 

est en cours d'exécution.

Et je dirais que la variable $ id est pas ce que vous pensez qu'il est (peut-être vide comme requête comme celle-ci sans id.

$sql="UPDATE members SET ends = '$ends'WHERE (id =)"; 

jetterait une telle erreur retour

Essayez

$id = NULL; 

avant

$id = $_COOKIE['id']; 

si l'erreur est passée cela signifie que $ id n'est pas ce que vous pensez

+0

ah woops, j'ai enlevé cela et le même message d'erreur apparaît – Crazyd22

1

Si $ _COOKIE ['id'] n'a pas de valeur, alors $ id dans vos instructions SQL sera vide, laissant votre SQL qui ressemble à ceci:

UPDATE members SET ends = 'something' WHERE (id =)

qui, bien sûr, est SQL non valide.

1

Un seul des instructions SQL exécuteront, et c'est le dernier. Vous devez ajouter un peu d'espace avant la clause WHERE, comme ceci:

$sql="UPDATE members SET ends = '$ends' WHERE (id = $id)"; 

Méfiez-vous également des être attaques par injection SQL dans le cas où votre cookie est modifié par l'utilisateur final. Une autre chose à noter est votre colonne orderid. Est-ce un VARCHAR ou un autre identifiant unique? Si c'est un entier, alors le mettre à la chaîne vide ne fonctionnera pas. Vous pourriez vouloir repenser votre schéma ici.

EDIT: Une autre chose que vous devez faire est de vérifier que les cookies ont effectivement des valeurs. Sinon, vos chaînes SQL seront foiré. Avez-vous pensé à utiliser parameterized queries through PDO pour ne pas avoir à vous soucier de l'injection SQL?

+0

+1 Yep: soyez conscient de l'injection sql si l'utilisation peut toucher n'importe quoi ... –