php - PDO + MySQL : PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064

标签 php mysql pdo

我知道这可能最终会在某个地方出现拼写错误,但我已经尝试调试我的语法两天,并且我搜索了许多讨论板和堆栈溢出问题,但无济于事。

当我尝试执行以下操作时

 try {
        $cnnxn = new PDO("mysql:host=$db_host;dbname=$db_name", $db_username, $db_password);
    } catch (PDOException $e) {
        die("ERROR: " . $e->getMessage());
    }



    $query1 = "INSERT INTO reply_statistics (reply_id, assignment_id, cat1, cat2, cat3, cat4, cat5, cat6, cat7, cat8) VALUES (:replyid, :assid, :cat1, :cat2, :cat3, :cat4, :cat5, :cat6, :cat7, :cat8)
                ON DUPLICATE KEY 
              UPDATE reply_statistics SET `cat1`=:cat1, `cat2`=:cat2, `cat3`=:cat3, `cat4`=:cat4, `cat5`=:cat5, `cat6`=:cat6, `cat7`=:cat7, `cat8`=:cat8  WHERE `reply_id`=:replyid";

    $query2 = "UPDATE replies SET status=:status, corrected_reply=:correply, score=:score WHERE id=:replyid";

    $cnnxn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $cnnxn->exec("SET NAMES utf8");
    $query = $cnnxn->prepare($query1);
    $query->bindParam(':replyid', $replyid);
    $query->bindParam(':assid', $assid);
    $query->bindParam(':cat1', $cat1);
    $query->bindParam(':cat2', $cat2);
    $query->bindParam(':cat3', $cat3);
    $query->bindParam(':cat4', $cat4);
    $query->bindParam(':cat5', $cat5);
    $query->bindParam(':cat6', $cat6);
    $query->bindParam(':cat7', $cat7);
    $query->bindParam(':cat8', $cat8);
    $query->execute();

    if ($query !== false)
                {
                    $statusreport = "OK";
                }

if($statusreport == "OK"){
  $query = $cnnxn->prepare($query2);
  $query->bindParam(':replyid', $replyid);
    $query->bindParam(':correply', $correply);
    $query->bindParam(':status', $status);
    $query->bindParam(':score', $score);
    $query->execute();

        if ($query !== false)
                {
                    echo "<div class=\"alert alert-success\">Tallennettu.</div>";
                }

}


$cnnxn = null;

我明白了

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 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 'SET `cat1`='0', `cat2`='0', `cat3`='0', `cat4`='0', `cat5`='0', `cat6`='0', `cat' at line 3' in /[CENSORED]/do-review.php:56 Stack trace: #0 /[CENSORED]/do-review.php(56): PDOStatement->execute() #1 {main} thrown in /[CENSORED]/do-review.php on line 56

它连接良好,变量设置得很好,但在 INSERT -- ON DUPLICATE KEY UPDATE 子句上失败。

关于表结构:reply_id是唯一的,但还有一个单独的id列,该列是一个自增的主键。

最佳答案

您必须将 ON DUPLICATE 参数集视为完全独立命名的参数,即使您可能使用相同的变量将数据绑定(bind)到它们。而且查询语法有点奇怪。

$query1 = "INSERT INTO reply_statistics 
               (reply_id, assignment_id, 
                cat1, cat2, cat3, cat4, 
                cat5, cat6, cat7, cat8) 
           VALUES (:replyid, :assid, 
                   :cat1, :cat2, :cat3, :cat4, 
                   :cat5, :cat6, :cat7, :cat8)
          ON DUPLICATE KEY UPDATE 
                  `cat1`=:cat1a, `cat2`=:cat2a, 
                  `cat3`=:cat3a, `cat4`=:cat4a, `cat5`=:cat5a, 
                  `cat6`=:cat6a, `cat7`=:cat7a, `cat8`=:cat8a ";


$query = $cnnxn->prepare($query1);

$query->bindParam(':replyid', $replyid);
$query->bindParam(':assid', $assid);
$query->bindParam(':cat1', $cat1);
$query->bindParam(':cat2', $cat2);
$query->bindParam(':cat3', $cat3);
$query->bindParam(':cat4', $cat4);
$query->bindParam(':cat5', $cat5);
$query->bindParam(':cat6', $cat6);
$query->bindParam(':cat7', $cat7);
$query->bindParam(':cat8', $cat8);
// parametes for the ON DUP set of params
$query->bindParam(':cat1a', $cat1);
$query->bindParam(':cat2a', $cat2);
$query->bindParam(':cat3a', $cat3);
$query->bindParam(':cat4a', $cat4);
$query->bindParam(':cat5a', $cat5);
$query->bindParam(':cat6a', $cat6);
$query->bindParam(':cat7a', $cat7);
$query->bindParam(':cat8a', $cat8);

关于php - PDO + MySQL : PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36719725/

相关文章:

php - 使用 PHPExcel 从 MYSQL 生成 excel 文件

php - 为已经存在的客户创建一个客户地址 - Magento

java - 如何获取与使用 JPA 映射的其他实体具有多对多关系的实体成员列表?

mysql - php 5.x 7.x,ssl pdo 错误 : Peer certificate CN =`someName' did not match expected CN ='someIP'

javascript - 自动完成数据库中的多个值

symfony - date_default_timezone_get() : It is not safe to rely on the system's timezone settings

php - 导入/导出 XLS-MySQL

php - 下拉列表中的 if 语句取决于数据库值和用户登录

mysql - 显示重复的行号

php - PHP代码不允许代码下面的字段填写数据