2012-01-04 2 views
1

Мой Perl довольно ржавый, поэтому, пожалуйста, простите. Попытка написать запрос с использованием переменной. Попробовали переформатировать, просто не может показаться, что это правильно. Вот мой код, не уверен, что я делаю неправильно.MySQL Запрос с переменной в Perl

my $d_var = "$3\n"; 
my $query="SELECT id FROM `accounts` WHERE (`accounts`.`named` = ?) LIMIT 1"; 
my $st_h = $db_h->prepare($query); 
$st_h->bind_param(1, '$d_var'); 
    $st_h->execute; 
    my $row = $st_h->fetchrow_array(); 
+0

Когда вы говорите, что не можете получить его правильно, вы имеете в виду, что он не разбирает? Выполняется ли запрос, но не возвращает результаты? Что происходит? (Добро пожаловать в SO!) Кроме того, вы пытались удалить одиночные кавычки из '$ d_var' в' bind_param() '? –

+0

Да, я пробовал $ d_var в разных обозначениях. Ошибки менялись, поскольку я пытался заставить его работать.Последняя ошибка: Невозможно вызвать метод «bind_param» по неопределенному значению в строке new.pl 31, <$log> строка 2. – user1130364

+0

Под первой строкой, помещенной в 'die '\ $ d_var, не определено", если не определено $ d_var; ' , –

ответ

1

Пожалуйста двойная проверка:

  1. $ 3 содержит что-то разумное
  2. конкатенации значение $ 3-х и "\ п" (с помощью интерполяции) является правильным
  3. ("\ п" в поле?)
  4. как "не интерполировать =>my $st_ht->bind_param(1, $d_var);

(я не понимаю DBI Docs как это делает Крис Ledet.)

На 2 мысли:

Этот фрагмент кода:

my $v = "nix nix 1001"; 
    print "$v\n"; 
    print '$v\n', "\n"; 
    if ($v =~ m/(nix) (nix) (\d+)/) { 
    print 'found: ', $3, "\n"; 
    $sth = $dbh->prepare('SELECT * FROM sample01.csv WHERE GRUPPE=?'); 
    $sth->bind_param(1, $3); 
    $sth->execute; 
    while(my @row = $sth->fetchrow_array()) { 
     print '|', join('|', @row), "|\n"; 
    } 
    } else { 
    print "no match\n"; 
    } 

и выход:

DBI: 1.616 DBD::CSV: 0.33 
|00000089-6d83-486d-9ddf-30bbbf722583|2011-09-17 16:25:09|1001| 
|000004c9-92c6-4764-b320-b1403276321e|2011-11-09 13:52:30|2000| 


nix nix 1001 
$v\n 
found: 1001 
|00000089-6d83-486d-9ddf-30bbbf722583|2011-09-17 16:25:09|1001| 

должна иллюстрировать:

  1. 'не интерполировать, ваш' $ d_var 'будет передавать это имя переменной буквально в DBI
  2. действительный матч не нуждается в «\ п» к «работе»
  3. последовательности пар для bind_param этого числа, значение
+0

Вы ARE, MAN. Теперь это исправлено. Замена d_var на $ 3 в поиске устраняет проблему. У меня недостаточно очков для дайте вам преимущество, но, безусловно, заслуживающее внимания. – user1130364

+0

@ user1130364: Спасибо за отзыв, я рад, что мы решили проблему. –

+0

Забавно, как четыре других ответы пропустили проблему интерполяции. Upvote для того, чтобы заметить реальную проблему, а не просто указывать на стилистические проблемы. – frezik

0

Что это значит?

my $st_ht->bind_param(1, '$d_var'); 

Там нет переменной вводится, так почему my?

+0

Я изменил код (что вы говорите имеет смысл), получив еще одну ошибку. Ошибка: использование неинициализированного значения $ row в print на строке new.pl 35, <$log> строка 9. – user1130364

0

У меня есть распечатка 3 долларов до выполнения и есть данные, содержащиеся в строке.

У меня есть d_var = "$ 3 \ n", поскольку переменная $ 3 генерируется строкой Regex и не работает без \ n.

Пробовал, что Крис предложил выше, однако не работал.

0

Помимо того, что Дэн сказал (удалив одинарную цитату), вы привязали свой параметр к возможному объекту дескриптора объекта $st_ht->bind_param(...) он должен быть $st_h->bind_param(...).

1

Не знаете, почему вы даже используете bind_param. На мой взгляд, гораздо проще просто передать дополнительные значения в execute.

my $d_var = "$3\n"; 
my $query = 'SELECT id FROM accounts` WHERE (`accounts`.`named` = ?) LIMIT 1'; 
my $st_h = $db_h->prepare($query); 
$st_h->execute($d_var); 
my $row = $st_h->fetchrow_array(); 

Вы рассматривали включить в DBIx::Class?