условию - посчитать строки mysql php




Как узнать, сколько строк возвращает запрос DBI Perl? (5)

В общем, я не уверен, почему люди так боятся исключений. Вы их поймаете и продолжаете.

my $sth = prepare ...
$sth->execute;
my $result = eval { $sth->fetchrow_arrayref->[1] };

if($result){ say "OH HAI. YOU HAVE A RESULT." }
else       { say "0 row(s) returned."         }

В этом случае, однако, ответ Павла лучше.

Кроме того, $sth->rows обычно не работают, пока вы не выберете каждую строку. Если вы хотите узнать, сколько строк соответствует, тогда вы должны спросить у механизма базы данных вопрос, на который вы хотите знать ответ; а именно select count(1) from foo where bar='baz' .

Я пытаюсь в основном выполнить поиск через базу данных с помощью Perl, чтобы узнать, есть ли элемент с определенным идентификатором. Этот поиск не может возвращать строки, но также может возвращать их.

У меня есть следующий код:

my $th = $dbh->prepare(qq{SELECT bi_exim_id FROM bounce_info WHERE bi_exim_id = '$exid'});
$th->execute();
if ($th->fetch()->[0] != $exid) {
        ...

В основном, это пытается увидеть, был ли ID возвращен, а если нет, продолжайте работу с скриптом. Но он бросает опорную ошибку Null массива на вещь $th->fetch()->[0] . Как я могу просто проверить, вернули ли строки или сейчас?


Единственный надежный способ узнать, сколько строк возвращает запрос SELECT, - это их выбор и подсчет. Как указано в документации DBI :

Как правило, вы можете полагаться только на количество строк после выполнения не-SELECT (для некоторых конкретных операций, таких как UPDATE и DELETE), или после извлечения всех строк инструкции SELECT.

Для операторов SELECT, как правило, невозможно узнать, сколько строк будет возвращено, кроме как путем их извлечения. Некоторые драйверы возвратят количество строк, которые приложение уже выбрало, но другие могут возвращать -1 до тех пор, пока все строки не будут извлечены. Поэтому использование метода rows или $ DBI :: rows с операторами SELECT не рекомендуется.

Однако, когда вы приступаете к нему, вы почти никогда не должны знать это заранее. Просто выполните цикл while ($sth->fetch) для обработки каждой строки или, для специального случая запроса, который будет возвращать только нуль или одну строку,

if ($sth->fetch) {
  # do stuff for one row returned
} else {
  # do stuff for no rows returned
}

Почему бы вам просто не «выбрать счетчик (*) ...» ??

my ($got_id) = $dbh->selectrow_array("SELECT count(*) from FROM bounce_info WHERE bi_exim_id = '$exid'");

Или помешать Маленьким столам Бобби :

my $q_exid = $dbh->quote($exid);
my ($got_id) = $dbh->selectrow_array("SELECT count(*) from FROM bounce_info WHERE bi_exim_id = $q_exid");

Или если вы собираетесь выполнить это много:

my $sth = $dbh->prepare("SELECT count(*) from FROM bounce_info WHERE bi_exim_id = ?");
....save $sth (or use prepare_cached()) and then later
my ($got_id) = $dbh->selectrow_array($sth, undef, $exid);

Драйвер DBD :: mysql имеет метод rows() который может возвращать количество результатов:

$sth = $dbh->prepare( ... );
$sth->execute;
$rows = $sth->rows;

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


my $th = $dbh->prepare(qq{SELECT bi_exim_id FROM bounce_info WHERE bi_exim_id = '$exid'});
$th->execute();
my $found = 0;
while ($th->fetch()) 
{
   $found = 1;
}

Ваш запрос ничего не вернет, если строка не существует, поэтому вы не можете отменить выборку.

Обновление : возможно, вы захотите переписать это как

my $found = $th->fetch();




dbi