SQL语句失败,但在命令行
问题描述:
我试图执行一个脚本来更新数据库的工作原理:SQL语句失败,但在命令行
my $sql_hash_update = 'UPDATE user SET hash = $hash , updated = 1 WHERE id = $row[0]';
my $sth_hash_update = $dbh->prepare($sql_hash_update);
$sth_hash_update->execute();
我得到的错误,这是不正确的语法,但这个工程SQL本身。
DBD :: mysql :: st执行失败:您的SQL语法错误; 检查对应于您MariaDB的服务器版本 在1号线附近使用“[0]”在conexion.pl线正确的语法手册32
任何想法,我究竟做错了什么?
答
您使用单引号,因此该语句
my $sql_hash_update = 'UPDATE user SET hash = $hash , updated = 1 WHERE id = $row[0]'
不会插值的值$hash
和$row[0]
纳入SQL语句。相反,他们会像原来那样,所以该语句不是有效的SQL
你可以简单地切换到双引号,这也插,但最好是使用占位符这样
my $sql_hash_update = 'UPDATE user SET hash = ?, updated = ? WHERE id = ?';
my $sth_hash_update = $dbh->prepare($sql_hash_update);
$sth_hash_update->execute($hash, 1, $row[0]);
这样,你避免代码注入的风险,随时随地的表达被允许在SQL语法,你需要prepare
一次为许多不同的execute
电话
占位符是有效的。这意味着,例如,您不能为表名提供占位符,因为您无法在普通SQL语句中放置表达式
答
Perl不插入单引号,因此$row[0]
未被扩展。 你想要双引号。
但是,您还应该传递$ row [0]作为绑定参数。
喜欢的东西:
my $sql_hash_update = 'UPDATE user SET hash = ? , updated = 1 WHERE id = ?';
my $sth_hash_update = $dbh->prepare($sql_hash_update);
$sth_hash_update->execute($hash, $row[0]);
您能打印'$ sql_hash_update'并与我们分享结果吗?另外,如果您使用的是准备好的语句,为什么在构建SQL时使用变量替换? – Mureinik
@Mureinik我自己得到变量。我将尝试连接变量而不是像PHP那样添加它们。 – prgrm
@PathikVejani:请删除您的评论;这是误导。 – Borodin