使用 PDO 准备好的语句插入致命错误 [重复]

Posted

技术标签:

【中文标题】使用 PDO 准备好的语句插入致命错误 [重复]【英文标题】:INSERT using PDO prepared statements fatal error [duplicate] 【发布时间】:2015-10-28 23:53:27 【问题描述】:

我正在尝试使用这样的准备好的语句插入值:

$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO user_table (first_name, last_name) VALUES (:tname, :tname2)";
$stmt = $dbh->prepare($sql);
$stmt -> bindParam(':tname', 'John');
$stmt -> bindParam(':tname2', 'Smith');
$stmt -> execute();

但是,这会引发致命错误:“php 致命错误:无法通过第 53 行 /Applications/MAMP/htdocs/live/test_create.php 中的引用传递参数 2”这是指这一行:$stmt -> bindParam(':tname', 'John');

是什么导致了这个问题?

【问题讨论】:

那个空间应该在那里吗?还是格式错误? @Script47 哪个空间? $stmt -> bindParam(':tname', 'John'); $stmt -> bindParam(':tname2', 'Smith'); $stmt -> execute() 我看到了,$stmt 变量后面的一堆空格。 @Script47 抱歉,仍然不确定您说的是哪些空间。在'John' 之前还是在其他地方?我尝试了上面的代码,但产生了同样的错误。 检查我的答案。哦,这张图片会告诉你我对空间的意思。 i.imgur.com/bcm4uMk.png 【参考方案1】:

使用bindParam时,必须通过引用传递。

请改用bindValue,因为您在此处尝试使用它的方式。

更多关于bindValue vs bindParam here

如果您坚持使用bindParam,则必须将其作为变量提供。所以你会使用$var1="John" 然后$stmt->bindParam(':tname',$var1);

【讨论】:

我只是没学到什么新东西。 我实际上打算使用像$thisthing 这样的变量,但正在做另一个测试以使其更简单(这不起作用)。您的解决方案正是我所需要的。感谢您提供有关bindParambindValue 的额外信息。 不用担心...尽管阅读该链接,因为它表明如果您使用bindParam,您实际上可以更改变量的值(在绑定之后,但在执行之前) ,而不影响执行的查询。

以上是关于使用 PDO 准备好的语句插入致命错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO准备语句给出“无效语法”错误[重复]

PDO - 使用准备好的语句[重复]

如何使用准备好的语句将表单数据插入 PDO?

在 pdo 准备好的语句中执行多插入或许多不同的插入更好/更快吗?

在查询中使用 PDO 准备好的语句和 LIMIT 时出错 [重复]

如何查看准备好的 PDO SQL 语句 [重复]