Решил усовершенствовать свой запрос на выборку данных из БД.
Вот он примитивный код с несложной проверкой.
$sql = mysql_query("Select * from table",$db);
if(!$sql)
{
echo "<p>Выборка данных не произведена. Сообщите админу код ошибки:</p>";
exit(mysql_error());
}
if(mysql_num_rows($sql) > 0)
{
$myrow = mysql_fetch_array($sql);
}
else
{
echo "<p>База данных пустая!</p>";
exit();
}
Можно ли как то усовершенстовать данный примитив, если да, то как и желательно ссылочку на статью, на литературу.
Заранее спасибо!
Спустя 2 минуты, 14 секунд (31.01.2011 - 16:08) Snus написал(а):
$query = "Select * from `table`";
$sql = mysql_query($query, $db) or die('<p>Выборка данных не произведена. Сообщите админу код ошибки:</p>'.mysql_error());
while ( $myrow = mysql_fetch_assoc($sql) ){
...
}
Спустя 2 минуты, 47 секунд (31.01.2011 - 16:11) @dmir@l написал(а):
+1 тема закрыта
Спустя 24 минуты, 42 секунды (31.01.2011 - 16:36) inpost написал(а):
@dmir@l
Оставь if(mysql_num_rows($sql) > 0), запись эта пригодится. Хочешь усовершенствовать, вместо * запиши все имена таблиц.
Оставь if(mysql_num_rows($sql) > 0), запись эта пригодится. Хочешь усовершенствовать, вместо * запиши все имена таблиц.
Спустя 14 минут, 51 секунда (31.01.2011 - 16:51) Snus написал(а):
inpost
А я бы сделал так
А я бы сделал так
$query = "Select * from `table`";
$sql = mysql_query($query, $db) or die('<p>Выборка данных не произведена. Сообщите админу код ошибки:</p>'.mysql_error());
$i = 0;
while ( $myrow = mysql_fetch_assoc($sql) ){
$i++;
...
}
if($i == 0) die('Пусто');
Спустя 2 минуты, 10 секунд (31.01.2011 - 16:53) linker написал(а):
Snus
Я бы так не делал.
Я бы так не делал.
Спустя 1 минута, 19 секунд (31.01.2011 - 16:54) Snus написал(а):
linker
Сколько людей - столько мнений. Мне вариант с mysql_num_rows не нравится.
Сколько людей - столько мнений. Мне вариант с mysql_num_rows не нравится.
Спустя 5 минут, 51 секунда (31.01.2011 - 17:00) linker написал(а):
Snus
Почему?
Почему?

Спустя 7 минут, 3 секунды (31.01.2011 - 17:07) Snus написал(а):
linker
А ты подумай логически. Ты предлагаешь считать строки из запроса, не зависимо пустой результат вернула БД или нет. А потом проверку проводить. Лишний процесс. Я предложил вариант более оптимальный. Передвигаем бегунок $i только в том случае, если БД вернула не пустой результат. А дальше проверяет $i, если 0 - значит никаких данных нет.
А ты подумай логически. Ты предлагаешь считать строки из запроса, не зависимо пустой результат вернула БД или нет. А потом проверку проводить. Лишний процесс. Я предложил вариант более оптимальный. Передвигаем бегунок $i только в том случае, если БД вернула не пустой результат. А дальше проверяет $i, если 0 - значит никаких данных нет.
Спустя 7 минут, 23 секунды (31.01.2011 - 17:14) linker написал(а):
Snus
Да, но если результат вернул 10 строк или больше? Каждая итерация цикла будет медленнее на время $i ++, что в совокупности даст задержку T(i) * n. По-моему, это несколько расточительно.
Да, но если результат вернул 10 строк или больше? Каждая итерация цикла будет медленнее на время $i ++, что в совокупности даст задержку T(i) * n. По-моему, это несколько расточительно.
Спустя 6 минут, 39 секунд (31.01.2011 - 17:21) Snus написал(а):
linker
Я же говорю - сколько людей - столько мнений. Можно подумать, что mysql_num_rows не затрачивает времени.
Я же говорю - сколько людей - столько мнений. Можно подумать, что mysql_num_rows не затрачивает времени.
Спустя 5 минут, 16 секунд (31.01.2011 - 17:26) linker написал(а):
Snus
Затрачивает конечно, но только один раз не зависимо от количества строк в возвращаемом результате.
Затрачивает конечно, но только один раз не зависимо от количества строк в возвращаемом результате.
Спустя 11 минут, 2 секунды (31.01.2011 - 17:37) Dron19 написал(а):
Цитата (linker @ 31.01.2011 - 14:26) |
Snus Затрачивает конечно, но только один раз не зависимо от количества строк в возвращаемом результате. |
Snus, правду говорят...
Спустя 8 минут, 1 секунда (31.01.2011 - 17:45) Snus написал(а):
linker
Dron19
Вы реальные цифры говорите, а не с потолка!
Вот вам пример реальный
Вот результат
Dron19
Вы реальные цифры говорите, а не с потолка!
Вот вам пример реальный
$start = microtime(1);
$query = "SELECT * FROM `doc`.`db_risk` LIMIT 50000";
$sql = mysql_query($query) or die(mysql_error());
$cnt = mysql_num_rows($sql);
while ( $row = mysql_fetch_assoc($sql) ){
}
echo '<p>'.$cnt.'<p>';
$end = microtime(1) - $start;
echo '<p>'.$end.'</p>';
$start = microtime(1);
$sql = mysql_query($query) or die(mysql_error());
$i = 0;
while ( $row = mysql_fetch_assoc($sql) ){
$i++;
}
echo '<p>'.$i.'</p>';
$end = microtime(1) - $start;
echo '<p>'.$end.'</p>';
Вот результат
50000
0.18717694282532
50000
0.18670797348022
Спустя 47 секунд (31.01.2011 - 17:46) linker написал(а):
Здесь еще есть один плюс - ты знаешь количество возвращенных строк еще до входа в цикл.
Спустя 2 минуты, 59 секунд (31.01.2011 - 17:49) Snus написал(а):
Вот тоже самое только LIMIT 100
100
0.00047802925109863
100
0.00037693977355957
Спустя 32 секунды (31.01.2011 - 17:50) Snus написал(а):
linker
А зачем?
А зачем?
Спустя 5 минут, 23 секунды (31.01.2011 - 17:55) Dron19 написал(а):
Интересно, а зачем ты цикл сделал проверяя mysql_num_rows, она тебе и так вернет результат, а во втором случае ты без него не посчитаешь? Скажи зачем ?

Спустя 3 минуты, 54 секунды (31.01.2011 - 17:59) Snus написал(а):
Dron19
М-да )
М-да )
Спустя 4 минуты, 6 секунд (31.01.2011 - 18:03) Dron19 написал(а):
Цитата (Snus @ 31.01.2011 - 14:59) |
Dron19 М-да ) |
что м-да?


Спустя 6 минут, 57 секунд (31.01.2011 - 18:10) Snus написал(а):
Dron19
Автору нужно было вывести данные из БД, но в случае, если таблица пуста - вывести сообщение об этом. Вот я на основании этого пример привел. А ты говоришь про подсчет строк.
Автору нужно было вывести данные из БД, но в случае, если таблица пуста - вывести сообщение об этом. Вот я на основании этого пример привел. А ты говоришь про подсчет строк.
Спустя 1 минута, 16 секунд (31.01.2011 - 18:11) Dron19 написал(а):
у тебя же тема зашла про подсчет строк, вот я и сказал, потому что там не нужен цикл
Спустя 2 минуты, 40 секунд (31.01.2011 - 18:14) @dmir@l написал(а):
мда)) так что посоветуете новичку???
мне с пояснениями желательно)))
так чтобы по простому, например:
запрос, если жива либо есть строки и результат тру, то в значение переменной кидаем весь результат как массив.) но так чтобы было понятно, и желательно покороче, попроще, не так как у меня)

так чтобы по простому, например:
запрос, если жива либо есть строки и результат тру, то в значение переменной кидаем весь результат как массив.) но так чтобы было понятно, и желательно покороче, попроще, не так как у меня)
Спустя 27 секунд (31.01.2011 - 18:14) Snus написал(а):
Dron19
Вот поэтому и написал М-да. Прочитай внимательно еще раз. Вопрос был использовать
или
Вот поэтому и написал М-да. Прочитай внимательно еще раз. Вопрос был использовать
if($i == 0) die('Пусто');
или
mysql_num_rows($sql);
Спустя 3 минуты, 40 секунд (31.01.2011 - 18:18) @dmir@l написал(а):
насколько я понимаю если мы используем mysql_num_rows($sql); то результ будет возвращать тру даже если внутри пустота?
Спустя 1 минута, 54 секунды (31.01.2011 - 18:20) Snus написал(а):
@dmir@l
mysql_num_rows($sql) вернет значение 0
mysql_num_rows($sql) вернет значение 0
Спустя 6 минут, 28 секунд (31.01.2011 - 18:26) @dmir@l написал(а):
Snus я понял!
я забиваю базу пустыми данными, mysql_num_rows($sql) возвращает мне 1 строку.
1 строка с пустыми данными.
Значит условие истина, выборка пошла..))здорово
я забиваю базу пустыми данными, mysql_num_rows($sql) возвращает мне 1 строку.
1 строка с пустыми данными.
Значит условие истина, выборка пошла..))здорово
Спустя 1 минута, 38 секунд (31.01.2011 - 18:28) Snus написал(а):
@dmir@l
Нет, mysql_num_rows($sql) считает кол-во строк из результата запроса mysql_query()
Нет, mysql_num_rows($sql) считает кол-во строк из результата запроса mysql_query()
Спустя 12 минут, 45 секунд (31.01.2011 - 18:41) @dmir@l написал(а):
а я могу написать таким образом:
<?php
$query = 'Select id,money oplata';
$sql = mysql_query($query,$db) or die('<p>База данных пустая!</p>');
if (mysql_num_rows($sql) > 0)
{
echo mysql_result($sql,1,2);
}
?>
Спустя 2 минуты, 46 секунд (31.01.2011 - 18:44) Snus написал(а):
@dmir@l
Конечно можешь, только работать этот кусок кода у тебя не будет.
Конечно можешь, только работать этот кусок кода у тебя не будет.
Спустя 2 минуты (31.01.2011 - 18:46) @dmir@l написал(а):
Snus
Почему?
Почему?
Спустя 3 минуты, 43 секунды (31.01.2011 - 18:49) Snus написал(а):
@dmir@l
$query = "SELECT `id`, `money` FROM `oplata`";
mysql_query($query) or die('<p>База данных пустая!</p>');mysql_query выполняет запрос, а не проверяет на "заполненность"
Спустя 40 секунд (31.01.2011 - 18:50) @dmir@l написал(а):
посоветуйте статьи, сайт, почитать про выборку данных из БД
Спустя 47 секунд (31.01.2011 - 18:51) @dmir@l написал(а):
ок я понял! спасибо!
Спустя 3 минуты, 8 секунд (31.01.2011 - 18:54) Dron19 написал(а):
Snus, значит я тебя не так понял, я на своей волне был

Спустя 3 часа, 32 минуты, 26 секунд (31.01.2011 - 22:26) inpost написал(а):
@dmir@l
mysql.ru
mysql.ru
Спустя 1 час, 20 минут, 15 секунд (31.01.2011 - 23:47) linker написал(а):
Snus
Твой тест невалидный. Моя метода. Создаем два скрипта:
a.php(мой вариант)
b.php(твой вариант)
Твой тест невалидный. Моя метода. Создаем два скрипта:
a.php(мой вариант)
<?phpи второй
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$h = mysql_connect('localhost', '', '');
mysql_select_db('pdfio3', $h);
$r = mysql_query("SELECT * FROM `sys_users`");
$s = microtime_float();
$c = mysql_num_rows($r);
while($d = mysql_fetch_assoc($r)) {}
$e = microtime_float();
echo ($e - $s) . " sec.";
?>
b.php(твой вариант)
<?phpЗаписей в таблице почти 23 тысячи. Запускаем два скрипта по несколько раз и получаем средний
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$h = mysql_connect('localhost', '', '');
mysql_select_db('pdfio3', $h);
$r = mysql_query("SELECT * FROM `con_costs`");
$s = microtime_float();
$i = 0;
while($d = mysql_fetch_assoc($r)) { $i ++; }
$e = microtime_float();
echo ($e - $s) . "sec";
?>
a.php - 0.0041739940643311 sec.как говорится почувствуй разницу.
b.php - 0.082695007324219 sec.
Спустя 13 часов, 31 минута, 38 секунд (1.02.2011 - 13:18) Snus написал(а):
linker
Ты забыл уточнить сколько у тебя данных в таблице sys_users и con_costs. Чтобы было справедливо делай выборку из одной и той же таблицы sys_users. Жду результатов. Потом покажу свои результаты.
Ты забыл уточнить сколько у тебя данных в таблице sys_users и con_costs. Чтобы было справедливо делай выборку из одной и той же таблицы sys_users. Жду результатов. Потом покажу свои результаты.
Спустя 12 минут, 6 секунд (1.02.2011 - 13:30) Snus написал(а):
По твоим "валидным" методам результаты:
test.php
test2.php
Вот и думай.
test.php
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
};
mysql_connect('xxx','xxx','xxx');
mysql_set_charset('utf8');
$query = "SELECT * FROM `doc`.`db_risk` LIMIT 50000";
$s = microtime_float();
$sql = mysql_query($query) or die(mysql_error());
$cnt = mysql_num_rows($sql);
while ( $row = mysql_fetch_assoc($sql) ){
}
echo '<p>'.$cnt.'<p>';
$e = microtime_float();
echo '<p>'.($e-$s).'</p>';
?>
50000
0.17970204353333
test2.php
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
};
mysql_connect('xxx','xxx','xxx');
mysql_set_charset('utf8');
$query = "SELECT * FROM `doc`.`db_risk` LIMIT 50000";
$s = microtime_float();
$i = 0;
$sql = mysql_query($query) or die(mysql_error());
while ( $row = mysql_fetch_assoc($sql) ){
$i++;
}
echo '<p>'.$i.'</p>';
$e = microtime_float();
echo '<p>'.($e-$s).'</p>';
?>
50000
0.16882801055908
Вот и думай.
Спустя 7 минут, 57 секунд (1.02.2011 - 13:38) Snus написал(а):
linker
И твой любимый mysql_num_rows() не покажет результатов, если выполнить mysql_unbuffered_query(). А для экономии памяти иногда приходится выполнять подобные запросы. Ты все еще будешь настаивать на преимуществах mysql_num_rows() ?
И твой любимый mysql_num_rows() не покажет результатов, если выполнить mysql_unbuffered_query(). А для экономии памяти иногда приходится выполнять подобные запросы. Ты все еще будешь настаивать на преимуществах mysql_num_rows() ?
Спустя 54 минуты, 10 секунд (1.02.2011 - 14:32) linker написал(а):
Прошу прощения, там в обоих примерах `con_costs`, не то скопипастил (тестировал на двух таблицах). В ней 23 тысячи записей.
Про mysql_unbuffered_query() конечно mysql_num_rows() тут не поможет, но и тут есть свои минусы. Предлагаю провести тут опрос, кто и как часто использует mysql_unbuffered_query(), думаю результат известен заранее.
Про mysql_unbuffered_query() конечно mysql_num_rows() тут не поможет, но и тут есть свои минусы. Предлагаю провести тут опрос, кто и как часто использует mysql_unbuffered_query(), думаю результат известен заранее.
Спустя 1 час, 16 минут, 59 секунд (1.02.2011 - 15:49) Snus написал(а):
linker
Еще раз проверь свои результат. Они у тебя явно врут.
Еще раз проверь свои результат. Они у тебя явно врут.
Спустя 1 месяц, 15 дней, 7 часов, 1 минута, 31 секунда (16.03.2011 - 22:51) alex12060 написал(а):
Я не понимаю, какая разница?
Снус, ты в своем начале просто создаешь в обоих случаях переменную неизвестного типа - память+время.
Цикл просчитал, и после этого, проврил результат, если нет ничего - фигня.
А значение кол-ва строк проще так проверить if (mnr == 0) die()
Все здесь упирается в написание кода.
Но все-же, твои результаты для меня - носенс.
Снус, ты в своем начале просто создаешь в обоих случаях переменную неизвестного типа - память+время.
Цикл просчитал, и после этого, проврил результат, если нет ничего - фигня.
А значение кол-ва строк проще так проверить if (mnr == 0) die()
Все здесь упирается в написание кода.
Но все-же, твои результаты для меня - носенс.
_____________
=)