2013-10-02 9 views
2

J'ai une erreur de syntaxe avec une instruction sql que j'exécute mais pour la vie de moi je ne trouve aucune erreur.Syntaxe MySQL ERREUR, je ne vois tout simplement pas où

J'ai créé ma propre classe de base de données avec des fonctionnalités pour faire des instructions préparées et les exécuter, je ne pense pas qu'il y ait un problème avec mon implémentation car je n'ai jamais eu de problème avec ça. Mais, au cas où il y aurait un problème, je vais montrer le code pour ça aussi.

Préparer:

public function prepare($index, $sql) { 
    if(isset(self::$PS[$index])){ 
     $ermsg = "Index [$index] is already in use."; 
     throw new Exception($ermsg, 1); 
    } 
    try{ 
     self::$PS[$index] = $this->dbh->prepare($sql); 
    } 
    catch(PDOException $e){ 
     return false; 
    } 
    return true; 
} 

et Execute:

public function execute($index, Array $param = array()) { 
    if(!isset(self::$PS[$index])){ 
     $ermsg = "Index [$index] is unavailable."; 
     throw new Exception($ermsg, 1); 
    } 

    foreach($param as $key => $val){ 
     if(is_int($key)) ++$key; 

     $type = $this->getValueType($val); 

     $bnd = self::$PS[$index]->bindValue($key, $val, $type); 

     if(!$bnd){ 
      $ermsg = "Paramater '$key' in [$index] failed to bind"; 
      throw new Exception($ermsg, 2); 
     } 

    } 

    try{ 
     $bnd = self::$PS[$index]->execute(); 
    } 
    catch(PDOException $e){ 
     $ermsg = "PDO-Error while executing prepared statement [$index] ".$e->getMessage(); 
     throw new Exception($ermsg, 3); 
    } 

    if($bnd === false){ 
     $ermsg = "Result error in prepared statement [$index]"; 
     throw new Exception($ermsg, 3); 
    } 

    return self::$PS[$index]; 
} 

Comme je l'ai mentionné, je ne l'ai jamais connu des problèmes en utilisant ce donc je ne pense pas que c'est le problème, mais qui sait.

Maintenant, ma mise en œuvre:

$sql = "INSERT INTO ratings (course_id, overall, design, condition, service, value, rated_by, date_rated) 
     VALUES (:course_id, :overall, :design, :condition, :service, :value, :rated_by, now()))"; 

    DBH::getInstance()->prepare('rateit', $sql); 


     $stmt = DBH::getInstance()->execute('rateit', array(
      ":course_id"=>$course_id, 
      ":overall"=>$overall, 
      ":design"=>$design, 
      ":condition"=>$condition, 
      ":service"=>$service, 
      ":value"=>$value, 
      ":rated_by"=>$log_user_id 
    )); 
    } 
    if($stmt) { 
     echo 'suc, Thanks! Your ratings have been added to the course.'; 
     exit(); 
    }else{ 
     echo 'err, There was an error rating the course. Please try again later'; 
     exit(); 
    } 

Voici le message d'erreur de syntaxe exacte que je reçois:

Erreur de syntaxe ou violation d'accès: 1064 Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'condition, service, valeur, rated_by, date_rated) VALEURS (1, 5, 5, 5, 5, 3,' 18 ',' à la ligne 1 '

Si quelqu'un peut repérer mon erreur de syntaxe, ou peut-être trouver quelque chose de mal d'autre qui serait la cause de ce qui serait génial. Merci pour toute aide.

+4

'condition' est un mot réservé dans MySQL. Vous pouvez soit changer le nom de la colonne, ou le citer en utilisant des guillemets. – andrewsi

+5

Il semble également que vous ayez un ')' près de 'now()'. – Brian

+0

Jetez un coup d'oeil à ceci: http://stackoverflow.com/q/1563146/1267304 – DontVoteMeDown

Répondre

7

Condition est un reserved word MySQL. cela pourrait être . il

+2

C'est * c'est * ça ... –

+0

Oui! Bon seigneur, je ne peux pas croire que j'ai posté tout ce code lol. Merci, cela devenait un très gros mal de tête. – codeguerrilla

3
$sql = "INSERT INTO ratings (course_id, overall, design, condition, service, value, rated_by, date_rated) 
    VALUES (:course_id, :overall, :design, :condition, :service, :value, :rated_by, now()))"; 

devrait être:

$sql = "INSERT INTO ratings (course_id, overall, design, `condition`, service, value, rated_by, date_rated) 
    VALUES (:course_id, :overall, :design, :condition, :service, :value, :rated_by, now())"; 
+0

Qu'avez-vous changé? –

+0

Vous devez également indiquer 'condition'. – andrewsi

+2

maintenant())) "; -> now())"; – bksi

2

Condition est un mot réservé dans MySQL. Vous devriez toujours utiliser des backticks ("` ") dans les noms` table` et `column` pour éviter les erreurs de ce genre. ressemble également vous avez un ) supplémentaire à la fin de la requête SQL

List of Reserved Words

+1

D'accord. Une downvote sans commentaire est horrible. J'ai +1 pour compenser cela plus vous avez répondu à la question de l'OP. – Brian

Questions connexes