2013-10-02 4 views
2

У меня возникла синтаксическая ошибка с оператором sql, который я выполняю, но для жизни я не могу найти никакой ошибки.Синтаксис MySQL ERROR, я просто не вижу, где

Я создал свой собственный класс базы данных с функциональностью, чтобы делать подготовленные операторы и выполнять их, я не думаю, что есть проблемы с моей реализацией, поскольку у меня никогда не было никаких проблем с ней до этого. Но, на всякий случай, есть проблема, и я покажу код для этого.

Приготовьте:

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; 
} 

и выполнить:

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]; 
} 

Как я уже говорил, я никогда не испытывал проблем с помощью этого, так что я не думаю, что это проблема, но кто знает.

Теперь моя реализация:

$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(); 
    } 

Это точное сообщение об ошибке синтаксиса я получаю:

Синтаксическая ошибка или нарушение прав доступа: 1064 У вас есть ошибка в вашем SQL синтаксиса; проверьте руководство, соответствующее версии сервера MySQL, для правильного синтаксиса для использования рядом с «условием, сервисом, значением, рейтингу_by, date_rated». ВАЛЮТЫ (1, 5, 5, 5, 5, 3, '18', 'в строке 1 '

Если кто-то может обнаружить свою ошибку синтаксиса, или, возможно, найти что-то еще неправильно, что будет причиной этого, что было бы удивительным. Спасибо за любую помощь.

+4

'condition' зарезервированное слово в MySQL. Вы можете либо изменить имя столбца, либо указать его с помощью обратных ссылок. – andrewsi

+5

Также похоже, что у вас есть дополнительный ')' near' now() '. – Brian

+0

Посмотрите на это: http://stackoverflow.com/q/1563146/1267304 – DontVoteMeDown

ответ

7

Состояние в MySQL reserved word. это может быть . он

+2

Это * это * это ... –

+0

Да! Хороший лорд, не верю, что я опубликовал весь этот код. Спасибо, это стало очень большой головной болью. – 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()))"; 

Должно быть:

$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

Что вы изменили? –

+0

Вы также должны процитировать «условие». – andrewsi

+2

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

2

Condition является зарезервированным словом в MySQL. Вы всегда должны использовать backticks ("` ") в именах` table` и `column`, чтобы избежать подобных ошибок. Также похоже, у вас есть дополнительный ) в конце SQL запроса

List of Reserved Words

+1

Согласовано. Нисходящий голос без комментариев ужасен. У меня есть + 1'd, чтобы компенсировать это плюс вы _did_ ответьте на вопрос (ы) OP. – Brian

Смежные вопросы