簡體   English   中英

PDO + MySQL:PDOException,消息為“ SQLSTATE [42000]:語法錯誤或訪問沖突:1064

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

我知道這可能最終是一個錯字,但我嘗試調試語法兩天,並且搜索了很多討論區,並且堆棧溢出問題無濟於事。

當我嘗試執行以下命令

 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參數集視為完全單獨命名的參數。 而且查詢語法有點古怪。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM