我正在尝试执行脚本来更新数据库:
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服务器版本对应的手册 在conexion.pl第32行第1行'[0]'附近使用的正确语法。
任何想法我做错了什么?
答案 0 :(得分:5)
您使用的是单引号,所以此声明
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] );
这样就可以避免代码注入的风险,而且对于许多不同的prepare
来电,您只需要execute
次
占位符在SQL语法中允许表达式的任何地方都有效。这意味着,例如,您不能为表名提供占位符,因为您无法在普通的SQL语句中放置表达式
答案 1 :(得分:1)
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]);