DBD::mysql::st 执行失败:未知列

Posted

技术标签:

【中文标题】DBD::mysql::st 执行失败:未知列【英文标题】:DBD::mysql::st execute failed: Unknown column 【发布时间】:2020-06-01 19:41:50 【问题描述】:

当我从 mysql 控制台执行以下查询时,它工作正常,但是当我包装到 perl/DBI 时,我得到:

DBD::mysql::st execute failed: Unknown column 'AR_email' in 'field list'

这里是查询:

my $q = "SELECT SUBSTRING(AR_email, LOCATE('@', AR_email) + 1) AS domain  
         FROM carrier 
         WHERE AR_email IS NOT NULL 
         AND SUBSTRING(AR_email, LOCATE('@', AR_email) + 1) =?"; 
my $sth=$dbh->prepare($q);
$sth->execute($domain);

知道如何解决这个问题吗?

【问题讨论】:

【参考方案1】:

这里的问题是无意的字符串插值

在将查询字符串分配给$q 时,您使用了双引号 ("),但它包含插入的 arobas (@)。

所以$q 实际上最终包含:

SELECT SUBSTRING(AR_email, LOCATE(', AR_email) + 1) AS domain
FROM carrier
WHERE AR_email IS NOT NULL
AND SUBSTRING(AR_email, LOCATE(', AR_email) + 1) =?

如果您在use warnings 下运行此程序,您将收到以下消息:

Possible unintended interpolation of @' in string

解决此问题的一种方法是将查询定义为文字字符串,例如:

my $q = q/SELECT SUBSTRING(AR_email, LOCATE('@', AR_email) + 1) AS domain  
         FROM carrier 
         WHERE AR_email IS NOT NULL 
         AND SUBSTRING(AR_email, LOCATE('@', AR_email) + 1) =?/; 

故事的寓意:

仅当您确实需要字符串插值时才使用双引号

总是use strict; use warnings;

【讨论】:

非常感谢您的回答不仅正确而且很有启发性。这种解释可能有助于防止我将来犯类似的错误。 另一个选项(或与单引号/单个q 结合使用)是指定@ 字符串作为参数,如$domainLOCATE(?, AR_email)在这两种情况下,然后传递参数'@', '@', $domain执行。

以上是关于DBD::mysql::st 执行失败:未知列的主要内容,如果未能解决你的问题,请参考以下文章

登录失败:Windows Server 2012 R2 上用于远程 PS 脚本执行的未知用户名或密码错误

无法执行 SELECT Login_Name FROM memberdirectory WHERE Login_Name = saviobosco(1054)“where 子句”中的未知列“savio

Sqoop 导入失败,“on 子句”中有未知列

“where 子句”中的未知列在程序中失败

PHP文件不在Windows机器中执行

我的内部连接不起作用 未知列