Mysql SQL语句在Perl下失败,但可以从命令行运行
我正在尝试执行脚本以更新数据库:Mysql SQL语句在Perl下失败,但可以从命令行运行,mysql,perl,Mysql,Perl,我正在尝试执行脚本以更新数据库: 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 execute失败:
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 execute失败:您的SQL语法有错误;
检查与您的MariaDB服务器版本对应的手册以了解
conexion.pl第32行第1行的“[0]”附近使用的正确语法
你知道我做错了什么吗?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]);
使用双引号而不是单引号
my $sql_hash_update = "UPDATE user SET hash = $hash , updated = 1 WHERE id = $row[0]";
您使用的是单引号,因此此语句
my $sql_hash_update = 'UPDATE user SET hash = $hash , updated = 1 WHERE id = $row[0]'
不会在SQL语句中插入$hash
和$row[0]
的值。相反,它们将保持原样,因此该语句不是有效的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语法中允许表达式的任何位置都有效。这意味着,例如,您不能为表名提供占位符,因为您不能将表达式放在普通SQL语句中您能打印“$SQL\u hash\u update”并与我们共享结果吗?另外,如果您使用的是预处理语句,那么在构造SQL时为什么要使用变量替换?@Mureinik我得到的是变量本身。我将尝试连接变量,而不是像添加PHP一样添加它们。@PathikVejani:请删除您的注释;“这是误导性的。”博罗丁我想你会想到被删除的第四个答案。那一个完全错了。这个答案在技术上是可以的,它应该更好地在语句中使用占位符。@鲍罗丁对我起了作用,单引号将其视为字符串。
my $sql_hash_update = 'UPDATE user SET hash = $hash , updated = 1 WHERE id = $row[0]'