簡體   English   中英

SQL 語法錯誤.. (bindValue?)

[英]Mistake in SQL syntax.. (bindValue?)

我正在嘗試創建一個更新查詢,並且我正在將一些設置內容循環到名為 $str 的 var 中,但我似乎無法讓它工作。

       if (is_numeric($id)) {
           if (!empty($values) && !empty($table_name)) {
               $str = '';
               $sql = "UPDATE `$table_name` SET :update_values WHERE `$column_name` = :id";

               // Its one because we dont use ID like that
               $i = 1;

               foreach ($values as $key => $value) {
                   if ($key != $column_name) {
                       // Exclude the last one from having a comma at the end
                       if ($i == count($values) - 1) {
                           $str .= "$key='" . $value . "'";
                       } else {
                           $str .= "$key='" . $value . "', ";
                           $i++;
                       }
                   }
               }
               $query = $this->dbh->prepare($sql);
               $query->bindValue('update_values', $str, PDO::PARAM_STR);
               $query->bindValue(':id', $id, PDO::PARAM_INT);
               $query->execute();
               return true;  
           } else {
               return false;
           }
       } else{
           return false;
       }
   }

輸出:

致命錯誤:未捕獲的 PDOException:SQLSTATE[42000]:語法錯誤或訪問沖突:1064 您的 SQL 語法有錯誤; 檢查與您的 MariaDB 服務器版本相對應的手冊,在第 1 行的 ''note_name=\\'yeet\\', note_date=\\'2020-02-20\\', note_desc=\\'asdasdasdasdadsasdads' 附近使用正確的語法

我犯了什么明顯的錯誤嗎?

同樣對於我的生活,我不知道值前面的反斜杠是什么意思。

在 MySQL 中,標識符不能作為提供。

對列的引用必須出現在 SQL 語句的文本中,不能通過綁定參數提供。 這適用於表名、列名、函數名。

沒有解決方法; 這是一個設計限制。 這有幾個原因。 最直接的原因之一是了解 SQL 語句是如何准備的,提出執行計划所需的信息,必須在准備時知道表和列(用於語義檢查和特權檢查。實際可以推遲到執行時間。

綁定占位符用於提供,而不是標識符

根據給出的代碼,MySQL 看到的是

 UPDATE `mytable` SET 'a string value' WHERE `id_col` = 42

而 MySQL 對'a string value'猶豫不決。


我們可以(並且應該)對值使用綁定參數。

我們可以動態生成如下所示的 SQL 文本:

    UPDATE `mytable`
       SET `col_one` = :val1
         , `col_two` = :val2
     WHERE `id_col` = :id 

在將 SQL 文本准備到語句后,我們可以綁定值:

         $sth->bindValue(':val1', $value_one , PDO::PARAM_STR );
         $sth->bindValue(':val2', $value_two , PDO::PARAM_STR );
         $sth->bindValue(':id'  , $id        , PDO::PARAM_INT );

然后執行

暫無
暫無

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

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