SQL语句在Perl下失败,但可以从命令行运行

时间:2017-02-22 12:57:07

标签: 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执行失败:您的SQL语法出错;   查看与您的MariaDB服务器版本对应的手册   在conexion.pl第32行第1行'[0]'附近使用的正确语法。

任何想法我做错了什么?

2 个答案:

答案 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]);