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
结合使用)是指定@
字符串作为参数,如$domain
。 LOCATE(?, AR_email)
在这两种情况下,然后传递参数'@', '@', $domain
执行。以上是关于DBD::mysql::st 执行失败:未知列的主要内容,如果未能解决你的问题,请参考以下文章
登录失败:Windows Server 2012 R2 上用于远程 PS 脚本执行的未知用户名或密码错误
无法执行 SELECT Login_Name FROM memberdirectory WHERE Login_Name = saviobosco(1054)“where 子句”中的未知列“savio