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

任何想法,我究竟做错了什么?

+0

您能打印'$ sql_hash_update'并与我们分享结果吗?另外,如果您使用的是准备好的语句,为什么在构建SQL时使用变量替换? – Mureinik

+0

@Mureinik我自己得到变量。我将尝试连接变量而不是像PHP那样添加它们。 – prgrm

+0

@PathikVejani:请删除您的评论;这是误导。 – Borodin

您使用单引号,因此该语句

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

使用双引号,而不是单引号

my $sql_hash_update = "UPDATE user SET hash = $hash , updated = 1 WHERE id = $row[0]"; 
+1

@Borodin我想你想想第四个被删除的答案。那个完全错了。这个答案在技术上没问题,所以最好在声明中使用占位符。 – dgw

+1

@dgw:也许你是对的。感谢您指出了这一点。 – Borodin

+0

@Borodin它已经为我工作,单引号认为它是一个字符串 – PravinS