语法错误。(绑定值?

我正在尝试创建一个更新查询,并且我正在将一些设置的内容循环到一个名为$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;

       }

   }

输出:


致命错误: 未捕获的 PDO异常: SQLSTATE[42000]: 语法错误或访问冲突: 1064 您的 SQL 语法中存在错误;检查与您的 MariaDB 服务器版本对应的手册,了解在第 1 行note_name=\'yeet'附近使用的正确语法,note_date=\'2020-02-20\',note_desc=\'asdasdadsdadsdasdad


我是否犯了任何明显的错误?


同样,对于我的生活,我不知道值前面的反斜杠是什么意思。


蝴蝶刀刀
浏览 83回答 1
1回答

慕雪6442864

在MySQL中,标识符不能作为值提供。对列的引用必须出现在 SQL 语句的文本中,它们不能通过绑定参数提供。这适用于表名、列名、函数名。没有解决方法;这是一个设计限制。这有几个原因。最直接的原因之一是了解SQL语句的准备方式,提出执行计划所需的信息,表和列必须在准备时知道(用于语义检查和特权检查)。实际值可以推迟到执行时间。绑定占位符用于提供值,而不是标识符。通过给定的代码,MySQL看到的是沿着以下路线的东西 UPDATE `mytable` SET 'a string value' WHERE `id_col` = 42而我的学习进度正在犹豫不决。'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 );然后执行
打开App,查看更多内容
随时随地看视频慕课网APP