Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL语句在Perl下失败,但可以从命令行运行_Mysql_Perl - Fatal编程技术网

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]'