Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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
DBD::mysql::st执行失败:未知列_Mysql_Sql_Perl_Mariadb_Dbi - Fatal编程技术网

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

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

当我从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) =?
如果您在
使用警告
下运行此操作,您将收到以下消息:

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) =?/; 
      
      故事的寓意:

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

      • 始终
        严格使用;使用警告


      非常感谢您不仅给出了正确而且非常有启发性的答案。这个解释可能有助于防止我将来犯类似的错误。另一个选项(或与单引号/single
      q
      )是指定
      @
      字符串作为参数,如
      $domain
      <代码>在这两种情况下都找到(?,AR_电子邮件)
      ,然后传递参数
      '@','@',$domain
      以执行。非常感谢您不仅给出了正确而且非常有启发性的答案。这个解释可能有助于防止我将来犯类似的错误。另一个选项(或与单引号/single
      q
      )是指定
      @
      字符串作为参数,如
      $domain
      <在这两种情况下,代码>定位(?,AR_email),然后传递参数
      '@','@',$domain
      以执行。