2009-07-22 2 views
3

Некоторое время назад я шутил с SQLite, пытаясь перенести некоторые из моих сайтов, чтобы использовать его вместо MySQL. Я повесил трубку на отсутствие функции для подсчета результатов, например, PHP mysql_num_rows(). После небольшого поиска я обнаружил this mail list, в котором говорится (как я понимаю), что SQLite не обладает такой функциональностью, потому что он неэффективен. В нем говорится, что это плохая форма для написания кода, который должен знать, сколько строк возвращается.Является ли mysql_num_rows эффективной и/или стандартной практикой?

Обычно я использую 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, чтобы получить все.

ответ

10

У вас уже есть что-то, что говорит вам, если у вас есть результаты в 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>"; 
} 
+1

Отлично - я не знал о ложном возвращении из mysql_query. – Andrew

+1

Да. Вот почему работает while ($ row = ...). –

0

Независимо от того, используете ли вы то, что вы выбрали SELECT ed, все строки по-прежнему возвращаются. Это ужасно неэффективно, потому что вы просто отбрасываете результаты, но вы все еще делаете свою базу данных для выполнения всей вашей работы. Если все, что вы делаете, это подсчет, вы делаете всю эту обработку для ничего. Ваше решение состоит в том, чтобы просто использовать COUNT (*). Просто обменяйтесь COUNT (*), где у вас будет ваш ВЫБЕРИТЕ заявление, и вы в порядке.

Однако это в основном относится к людям, использующим его в качестве полной замены для COUNT. В вашем случае использование не очень плохое. Вам просто нужно вручную подсчитать их в своем цикле (это предпочтительное решение для пользователей SQLite).

Причина заключается в базовом API-интерфейсе SQLite. Это doesn't return the whole result set сразу, поэтому у него нет способа узнать, сколько результатов есть.

+0

Я не просто подсчет, хотя - я циклически и выводит все выбранные строки, но только если они существуют – Andrew

0

Как описано в списке рассылки, который вы нашли. Неэффективно возвращать количество строк, потому что вам нужно выделить много памяти для хранения всего (оставшегося) набора результатов. Что вы можете сделать, это просто использовать логическое значение для проверки, если у вас есть что-то выходное.

$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>"; 
} 
Смежные вопросы