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

DBD::mysql::st execute failed: Unknown column

当我从 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);

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

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

您在将查询字符串分配给 $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;