4

我正在执行的 sql 语句出现语法错误,但在我的一生中我找不到任何错误。

我创建了自己的数据库类,该类具有制作准备好的语句并执行它们的功能,我认为我的实现没有问题,因为我以前从未遇到过任何问题。但是,以防万一出现问题,我也将展示代码。

准备:

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 服务器版本相对应的手册,以在第 1 行的 'condition, service, value,rated_by, date_rated) VALUES (1, 5, 5, 5, 5, 3, '18',' 附近使用正确的语法'

如果有人能发现我的语法错误,或者可能发现其他可能导致这种情况的错误,那就太棒了。谢谢你的帮助。

4

3 回答 3

7

条件是 MySQL 中的保留字。可能就是这样。

根据9.2 Schema Object Names,要使用保留字作为标识符,它们必须被引用。使用反引号或在启用ANSI_QUOTES SQL 模式的情况下使用双引号。如果保留字跟在限定名称中的句点之后,则不需要引用。

于 2013-10-02T17:28:40.373 回答
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())";
于 2013-10-02T17:30:13.617 回答
3

Condition是 MySQL 中的保留字。您应该始终在 `table` 和 `column` 名称中使用反引号(“`”)以避免类似的错误。看起来你)在 sql 查询的末尾还有一个额外的

保留字列表

于 2013-10-02T17:32:59.067 回答