выбрать несколько строк, используя MySQL в Perl - PullRequest
0 голосов
/ 30 марта 2019

Я выбираю 3 строки из MySQL

, но получаю только первую, которая - имя.я получаю только имя

$get = $dbh->prepare("select name, age, country from tble where me = ?");
$get->execute('john');
while(my @row = $get->fetchrow_array){
     $results = $row[0],$row[1],$row[3];
  }   

только получаю имя без других строк

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019

MySQL здесь - красная сельдь.Вы используете DBI правильно, но после извлечения данных из базы данных он работает неправильно.

Ваша проблема с этой строкой:

$results = $row[0],$row[1],$row[3];

Это очень похоже на выполнениеэтот код:

$x = 100, 200, 300;

Если вы напечатаете $x, вы увидите, что он содержит "100".У вас есть три элемента в правой части вашего оператора присваивания и только одна переменная в левой части, поэтому только одно из значений (первое) в конечном итоге присваивается переменной.

IЗдесь добавим, что если бы в вашем коде был включен use warnings (а у всех хороших программистов на Perl всегда включены use strict и use warnings), то вы бы получили предупреждение о «бесполезном использовании константы в void».context ", который бы указывал на то, что что-то не так.

Есть несколько подходов, которые можно использовать, чтобы исправить это.И какой из них вы выберете, зависит от того, что вы пытаетесь сделать.Очевидное решение состоит в том, чтобы преобразовать $results в массив:

@results = ($row[0], $row[1], $row[2]);

Обратите внимание, я также поставил круглые скобки вокруг вашего списка значений.Это необходимо для того, чтобы сообщить Perl, что это назначение списка.Конечно, это просто сложный способ записи:

@results = @row;

Другой вариант - взять три значения и превратить их в одну строку.Это не очень хороший выбор, если вы собираетесь использовать эти значения отдельно в другом месте вашего кода, но если вы просто хотите что-то распечатать, вы можете написать что-то вроде:

$results = "$row[0],$row[1],$row[2]";

Опять же, естьболее простой способ написать это:

$results = join ',', @row;
1 голос
/ 01 апреля 2019

Name, age и country не являются строками - они столбцы .

. Вы можете использовать selectcol_arrayref , чтобы получить только один столбец:

$name_ref = $dbh->selectcol_arrayref(
    q{
        SELECT name
        FROM tble
        WHERE me = ?
    },
    {},
    'john'
);

Но если вы хотите получить три столбца, вы должны использовать selectall_arrayref

my $rows = $dbh->selectall_arrayref(
    q{
        SELECT name, age, country
        FROM FROM tble
        WHERE me = ?
    },
    { Slice => {} },
    'john'
);

foreach my $row ( @$rows ) {
    print "$row->{'name'} aged $row->{'age'} from $row->{'country'}\n";
}
...