[英]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.