DBD :: mysql :: st выполнить не удалось: неизвестный столбец - PullRequest
0 голосов
/ 17 февраля 2020

Когда я выполняю приведенный ниже запрос с консоли 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 Ответ

2 голосов
/ 17 февраля 2020

Проблема здесь заключается в том, что интерполяция строк .

Вы используете двойные кавычки (") при назначении строки запроса для $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;

...