DBD::mysql::st执行失败:未知列
当我从mysql控制台执行下面的查询时,效果很好,但当我包装成perl/DBI时,我得到:DBD::mysql::st执行失败:未知列,mysql,sql,perl,mariadb,dbi,Mysql,Sql,Perl,Mariadb,Dbi,当我从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 I
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) =?
如果您在使用警告
下运行此操作,您将收到以下消息:
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) =?/;
故事的寓意:
- 仅当需要字符串插值时才使用双引号
- 始终
使用严格;使用警告;
- 这里的问题是无意中的字符串插值
将查询字符串分配给
$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) =?
如果您在使用警告
下运行此操作,您将收到以下消息:
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) =?/;
故事的寓意:
- 仅当需要字符串插值时才使用双引号
- 始终
严格使用;使用警告代码>
q
)是指定@
字符串作为参数,如$domain
<代码>在这两种情况下都找到(?,AR_电子邮件),然后传递参数'@','@',$domain
以执行。非常感谢您不仅给出了正确而且非常有启发性的答案。这个解释可能有助于防止我将来犯类似的错误。另一个选项(或与单引号/singleq
)是指定@
字符串作为参数,如$domain
<在这两种情况下,代码>定位(?,AR_email),然后传递参数'@','@',$domain
以执行。