使用 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
这样的变量,但正在做另一个测试以使其更简单(这不起作用)。您的解决方案正是我所需要的。感谢您提供有关bindParam
和bindValue
的额外信息。
不用担心...尽管阅读该链接,因为它表明如果您使用bindParam
,您实际上可以更改变量的值(在绑定之后,但在执行之前) ,而不影响执行的查询。以上是关于使用 PDO 准备好的语句插入致命错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 pdo 准备好的语句中执行多插入或许多不同的插入更好/更快吗?