Некоторое время назад я ерзал с помощью SQLite, пытаясь перенести некоторые из моих сайтов, чтобы использовать его вместо MySQL. Меня повесили на отсутствие функции для подсчета результатов, таких как mysql_num_rows()
PHP. После небольшого поиска я обнаружил этот список писем , в котором говорится (как я понимаю), что SQLite не обладает такой функциональностью, потому что он неэффективен. В нем говорится, что это плохая форма для написания кода, который должен знать, сколько строк возвращается.
Обычно я использую mysql_num_rows
для проверки пустых результатов возврата. Например:
$query = "SELECT * FROM table WHERE thing = 'whatever'"; $results = mysql_query($query); if (mysql_num_rows($results)) { while ($row = mysql_fetch_array($results)) { echo "<p>$row[whatever]</p>"; } } else { echo "<p>No results found</p>"; }
Яростное отвращение к концепции mysql_num_rows()
в сообществе SQLite заставляет задуматься, насколько это ужасно эффективно для обычного MySQL в PHP.
Есть ли лучший, более приемлемый способ проверки размера набора результатов MySQL в PHP, кроме mysql_num_rows()
?
EDIT: я не просто использую mysql_num_rows
для получения счета. Я бы использовал для этого запрос COUNT
. Я использую его, чтобы проверить, есть ли какие-либо результаты перед выводом всего. Это полезно для чего-то вроде отображения результатов поиска – не всегда гарантируется, что будут результаты. В мире SQLite я должен отправить один запрос COUNT
, проверить, есть ли что-то, а затем отправить запрос SELECT
чтобы получить все.
У вас уже есть что-то, что говорит вам, есть ли у вас результаты в mysql_fetch_array()
. Он возвращает false, если больше нет строк для извлечения (из php.net ).
$query = "SELECT * FROM table WHERE thing = 'whatever'"; $results = mysql_query($query); if($results) { $row = mysql_fetch_array($results); if($row) { do { echo "<p>{$row[whatever]}</p>"; } while($row = mysql_fetch_array($results)); } else { echo "<p>No results found</p>"; } } else { echo "<p>There was an error executing this query.</p>"; }
Независимо от того, действительно ли вы используете то, что вы выбрали SEL, все строки все еще возвращаются. Это ужасно неэффективно, потому что вы просто отбрасываете результаты, но вы все еще делаете свою базу данных для выполнения всей вашей работы. Если все, что вы делаете, это подсчет, вы делаете всю эту обработку для ничего. Ваше решение – просто использовать COUNT (*) . Просто поменяйте COUNT (*), где у вас будет оператор SELECT, и вы хорошо пойдете.
Однако это в основном относится к людям, использующим его в качестве полной замены для COUNT . В вашем случае использование не очень плохое. Вам просто нужно вручную подсчитать их в своем цикле (это предпочтительное решение для пользователей SQLite).
Причина заключается в базовом API SQLite. Он не возвращает сразу весь результат , поэтому он не знает, сколько результатов есть.
Как объясняется в списке рассылки, который вы нашли. Неэффективно возвращать количество строк, потому что вам нужно выделить много памяти для хранения всего (оставшегося) набора результатов. Что вы можете сделать, это просто использовать логическое значение для проверки, если у вас есть что-то выходное.
$query = "SELECT * FROM table WHERE thing = 'whatever'"; $results = mysql_query($query); $empty_result = true; while ($row = mysql_fetch_array($results)) { echo "<p>$row[whatever]</p>"; $empty_result = false; } if ($empty_result) { echo "<p>No results found</p>"; }