2011-12-14 6 views
1

До недавнего времени я использовал mysql_real_escape_string() для исправления большинства моих переменных перед выполнением SQL-запросов в моей базе данных. Друг сказал, что вместо этого я должен использовать подготовленные инструкции PDO, поэтому, прочитав немного о них, я перехожу к ним.Получить количество строк из оператора выбора Эффективно

До сих пор я столкнулся с одной проблемой при переключении, и это подсчет строк, возвращаемых оператором SELECT. Иногда в моем коде я запускал SQL-запрос, а затем подсчитывал количество строк, возвращаемых из инструкции SELECT. В зависимости от того, вернется ли результирующий набор, я буду принимать разные действия. Иногда мне нужно использовать набор результатов. MySQL дал мне перейти на mysql_fetch_assoc() после mysql_num_rows() без проблем. Однако PDO, похоже, не имеет ничего подобного mysql_num_rows().

Я читал ответы на SO, которые дали мне решение, либо использовать COUNT() в инструкции SQL, либо использовать функцию PHP count() в результирующем наборе. COUNT() будет работать нормально в SQL-заявлении, если мне не нужен набор результатов в некоторых местах, однако несколько человек упомянули, что использование count() в результирующем наборе довольно неэффективно.

Итак, мой вопрос: как мне это сделать, если мне нужно подсчитать количество выбранных строк (если они есть), а затем запустить скрипт с набором результатов? Использует ли count() в результирующем наборе единственный способ в этом случае, или есть более эффективный способ сделать что-то?

Ниже приведен краткий пример того, что похоже на мой предыдущий код SQL:

$query=mysql_query('SELECT ID FROM Table WHERE Name='Paul' LIMIT 1); 

if(mysql_num_rows($query)>0) 
{ 
    print_r(mysql_fetch_assoc($query)); 
} 
else 
{ 
    //Other code. 
} 

Спасибо.

EDIT

Я знаю, что вы используете fetchAll() заявление перед подсчетом набора результатов (что дает мне то, что мне нужно), но я просто пытаюсь выяснить, наиболее эффективный способ сделать вещи.

ответ

2
$stmt->rowCount(); 

http://php.net/manual/en/pdostatement.rowcount.php

строки должен быть извлечен (забуференная в память или итерация) для его работы. Это не редкость для вашего драйвера pdo для настройки этого автоматически.

+0

В руководстве указано, что он не работает для всех баз данных.Полагаю, это не помешает попробовать, я просто согласился с тем, что моя база данных, вероятно, не сработает с ней. Попробует. – Phillip

+0

Он сделал работу, спасибо за подсказку. – Phillip

1

Вам нужно будет использовать Count(). Вы можете запустить два запроса, как

SELECT COUNT(ID) FROM Table WHERE Name='Paul' 

один у вас есть получить счет, а затем выполнить запрос с выбора пункта

SELECT ID FROM Table WHERE Name='Paul' LIMIT 1 

Count() функция не неэффективна вообще, если вы используете его как COUNT(ID), потому что скорее всего, id является первичным ключом и имеет индекс. MYSQL даже не будет иметь доступ к таблице.

+0

Таким образом, было бы более эффективно выполнять два запроса, в отличие от одного запроса, а затем подсчитывать набор результатов? * EDIT * Я говорил, что функция PHP 'count()' была неэффективной, а не функцией SQL 'COUNT()'. – Phillip

+0

В этом случае в обоих случаях вы ограничиваете результат до 1 элемента. Так что это очень хорошо, по крайней мере, в некотором роде. – Jonathon

Смежные вопросы