for( $i = 1; $i <= count($race_list); $i++ ) {
$query = $db->query( "SELECT * FROM `".$sql['pref']."_player_race`
WHERE `player_id` = (SELECT `player_id` FROM `".$sql['pref']."_player`
WHERE `player_name` = '".$db->safe($user['nickname'])."') AND `race_id` = '$i'"
);
//$all_info[$i]['race_id'] = $i;
$all_info[$i]['race_name'] = $race_list[$i];
if( $db->num_rows( $query ) != TRUE ) {
$all_info[$i]['level'] = '0';
} else {
$result = $db->get_assoc( $query, $i-1 );
for( $j = 1; $j < count($xp_list); $j++ ) {
if( $result['race_xp'] < $xp_list[$j]['config_value'] ) {
continue;
} else {
$all_info[$i]['level'] = $j;
}
}
}
//echo '<pre>';
//print_r( $db->get_assoc( $query, $i-1 ) );
//echo '</pre>';
}
Данные мозго-насильтсвенные меры с запросами внутри цикла связаны с тем, что в базе может находиться записей меньше, чем должно быть в $all_info, но при этом быть они в этом массиве должны быть. Только в ['level'] там будет нолик. Одним запросом я, увы, не придумал как это реализовать. Возможно, вы мне доскажите? Так как это планируется подключать к игровому серверу, а там не очень хорошо, когда много запросов.
Спустя 16 минут, 43 секунды (24.02.2011 - 17:12) Oyeme написал(а):
Один запрос ,потом php обрабатывай как хочешь.(работа с массивами)
Используй IN
Используй IN
WHERE race_id IN (1,2,3,4,5...)
Спустя 9 минут, 17 секунд (24.02.2011 - 17:21) Snus написал(а):
AlmazDelDiablo
Никогда не делай запросы в цикле. Ты так однажды положешь свой мускул.
Никогда не делай запросы в цикле. Ты так однажды положешь свой мускул.
Спустя 5 минут, 33 секунды (24.02.2011 - 17:27) Dron19 написал(а):
Snus, это раз, а во вторых могу добавить, что код довольно таки кривой.
Спустя 6 минут, 7 секунд (24.02.2011 - 17:33) Dron19 написал(а):
по скорости он будет очень медленный. Потому что каждый раз в цикле будет вызываться функция count, плюс ко всему она медленней sizeof, лучше бы создали переменную и в нее занесли число эл. с помощью sizeof и проверили на скорость старый вариант и новый. У меня при 5000 пустых элементов нормальный способ, который я вам говорю в два раза быстрей
Спустя 24 минуты, 45 секунд (24.02.2011 - 17:58) AlmazDelDiablo написал(а):
Цитата (Oyeme @ 24.02.2011 - 18:12) |
Один запрос ,потом php обрабатывай как хочешь.(работа с массивами) Используй IN WHERE race_id IN (1,2,3,4,5...) |
Либо я не правльно понял логику, либо вы не о том. При таком запросе:
$query = $db->query( "SELECT * FROM `".$sql['pref']."_player_race`
WHERE `player_id` = (SELECT `player_id` FROM `".$sql['pref']."_player`
WHERE `player_name` = '".$db->safe($user['nickname'])."') AND `race_id` IN (1,2,3,4,5,6,7,8,9)"
);
$result = $db->get_assoc($query);
Все равно возвращается не полный массив $result. То есть в нем есть лишь те записи, которые есть в базе.
ПС: Всем остальным большое спасибо за советы, заменит count() на sizeof() и вынес его н отдельную переменную вне массива.
Спустя 6 минут, 28 секунд (24.02.2011 - 18:04) Dron19 написал(а):
я имел в виду делать не так
А вот так
Показал чисто принцип... Надесь Вы поняли
$i = 0;
while($i < count($test)) {
$i++;
}
А вот так
$i = 0;
$size = sizeof($test);
while($i < $size) {
$i++;
}
Показал чисто принцип... Надесь Вы поняли
Спустя 1 минута, 30 секунд (24.02.2011 - 18:06) AlmazDelDiablo написал(а):
Цитата (Dron19 @ 24.02.2011 - 19:04) |
я имел в виду делать не так
А вот так
Показал чисто принцип... Надесь Вы поняли |
Да, я именно так и сделал. Толькоу меня цикл for, a не while,
Спустя 7 минут, 39 секунд (24.02.2011 - 18:13) Dron19 написал(а):
это не важно. Если интересно, то можете посмотреть результаты, за сколько первый выполняется и второй. Вот код
<?php
$doli = microtime(1);
$i = 0;
$bb = range(0,50000);
$ttt = sizeof($bb);
while($i < $ttt) {
$i++;
}
$doli2 = microtime(1);
echo $doli2 - $doli . '<br>';
$doli = microtime(1);
$i = 0;
$bb = range(0,50000);
while($i < sizeof($bb)) {
$i++;
}
$doli2 = microtime(1);
echo $doli2 - $doli;
?>
Спустя 2 минуты, 35 секунд (24.02.2011 - 18:16) Dron19 написал(а):
первый - это правильный способ, если конечно хочется побыстрей
Спустя 9 минут, 56 секунд (24.02.2011 - 18:26) Snus написал(а):
AlmazDelDiablo
получаешь данные, а затем заполняешь пустые значения...
$query = $db->query( "SELECT * FROM `".$sql['pref']."_player_race`
WHERE `player_id` = (SELECT `player_id` FROM `".$sql['pref']."_player`
WHERE `player_name` = '".$db->safe($user['nickname'])."') AND `race_id` IN (1,2,3,4,5,6,7,8,9)"
);
$result = $db->get_assoc($query);
получаешь данные, а затем заполняешь пустые значения...
$cnt = sizeof($race_list);
for($i = 1; $i <= $cnt; $i++)
if(empty($all_info[$i]['level']))
$all_info[$i]['level'] = $i;
Спустя 2 часа, 25 минут, 26 секунд (24.02.2011 - 20:51) AlmazDelDiablo написал(а):
$xp_list = $db->arr_query( "SELECT * FROM `".$sql['pref']."_config` WHERE `config_id` <> 'version'" );
$cnt = sizeof( $xp_list );
$query = $db->query( "SELECT * FROM `".$sql['pref']."_player_race`
WHERE `player_id` = (SELECT `player_id` FROM `".$sql['pref']."_player`
WHERE `player_name` = '".$db->safe($user['nickname'])."')"
);
for( $i = 1; $i <= 9; $i++ ) {
$result = $db->get_assoc( $query );
$all_info[$i]['race_name'] = htmlspecialchars( $race_list[$i] );
//echo $i .' - '. $result['race_id'] .'<br>';
for( $j = 1; $j < $cnt; $j++ ) {
if( $result['race_xp'] < $xp_list[$j]['config_value'] ) {
continue;
} else {
$all_info[$result['race_id']]['level'] = $j;
}
}
if( empty( $all_info[$i]['level'] ) ) {
$all_info[$i]['level'] = '0';
}
}
Воть так заработало :) Спасибо большое ребят!
Спустя 52 минуты, 56 секунд (24.02.2011 - 21:44) inpost написал(а):
AlmazDelDiablo
count и sizeof - одинаковы по скорости. Когда-то какой-то "глупенький" в своей книге написал, что типо так быстрее, я проверил у себя - никакой разницы не было вне зависимости от размера массива, но Dron не хочет никого слушать, слишком самоуверенный...
Dron19
Ты лучше бы сам проверил, а не верил книжке 2006 года "Программирование для профессионалов" =)
count и sizeof - одинаковы по скорости. Когда-то какой-то "глупенький" в своей книге написал, что типо так быстрее, я проверил у себя - никакой разницы не было вне зависимости от размера массива, но Dron не хочет никого слушать, слишком самоуверенный...
Dron19
Ты лучше бы сам проверил, а не верил книжке 2006 года "Программирование для профессионалов" =)
Спустя 2 часа, 48 минут, 23 секунды (25.02.2011 - 00:33) Arni написал(а):
Не положиш ты мускуль если это работает гдето в админке а не на главной частопосещаемого сайта. Если Ооооочень сильно надо запросы в цыкле то.
Верная дорога сюда
http://php.net/manual/en/book.mysqli.php
Вам нужен Prepare an SQL statement for execution
Верная дорога сюда
http://php.net/manual/en/book.mysqli.php
Вам нужен Prepare an SQL statement for execution
Спустя 8 часов, 53 минуты, 4 секунды (25.02.2011 - 09:26) Snus написал(а):
Arni
Достаточно будет 50 человек, чтобы положить мускул. Очередь мускула забьется настолько, что он автоматически заблокирует все и остановит процесс.
Достаточно будет 50 человек, чтобы положить мускул. Очередь мускула забьется настолько, что он автоматически заблокирует все и остановит процесс.
Спустя 1 час, 11 секунд (25.02.2011 - 10:26) glock18 написал(а):
count и sizeof не могут работать по-разному, потому что это алиасы одной функции, мануал читайте сначала, кто решит поспорить
Спустя 33 минуты, 47 секунд (25.02.2011 - 11:00) Evilsoul написал(а):
Хорошо, да бы не создавать в новь тему, я здесь продолжу.
Я как-то уже задавал такой вопрос.
как здесь избавится от запроса в цикле:
Немного лирики: это я пройдя курс ТВИНа, решил попробовать свои силы и сделать галерею, это кусок для выбора галереи, в нем название, дата, опись, и изображения для предосмотра (в данном случаи я использую 4, можно больше можно меньше).
Я как-то уже задавал такой вопрос.
как здесь избавится от запроса в цикле:
$res = $paginator->countQuery("SELECT *,
DATE_FORMAT(`date`, '%d') AS `day`,
DATE_FORMAT(`date`, '%m') AS `month`,
DATE_FORMAT(`date`, '%Y') AS `year`
FROM `".IRB_DBPREFIX."galleries`
ORDER BY `id` DESC
");
$navigation = $paginator->createMenu();
while($row = mysql_fetch_assoc($res))
{
$row['date'] = $row['day'].' '.$month_string[$row['month']].' '.$row['year'];
$row['title'] = htmlspecialchars($row['title']);
$row['description'] = htmlspecialchars($row['description']);
$row['link'] = href('rem=gallery', 'num='.$GET['num'], 'id='.$row['id']);
$link = '<a style="border:0;" href="'.$row['link'].'" >';
$res2 = mysqlQuery("SELECT `subtitle`, `fname`
FROM `".IRB_DBPREFIX."images`
WHERE `".IRB_DBPREFIX."images`.`aid` = ". (int)$row['id'] ."
ORDER BY RAND()
LIMIT ".IRB_NUM_IMAGES_ON_PREV
);
$row['img'] = '';
for($i = 1; IRB_NUM_IMAGES_ON_PREV >= $i; $i++)
{
$row[$i] = mysql_fetch_assoc($res2);
$fname = !empty($row[$i]['fname'])?$row[$i]['fname']:'none.png';
$row['img'.$i] = "\t\t".$link."\n\t\t"
.'<img alt="'. $row[$i]['subtitle']
.'" style="border:0;" src="'
.IRB_HOST.'uploads/galleries/preview/small_'.htmlspecialchars($fname)
.'"/></a>'."\n";
$row['img'] .= $row['img'.$i];
}
$galleries .= parseTpl($tpl, $row);
}
Немного лирики: это я пройдя курс ТВИНа, решил попробовать свои силы и сделать галерею, это кусок для выбора галереи, в нем название, дата, опись, и изображения для предосмотра (в данном случаи я использую 4, можно больше можно меньше).
Спустя 18 минут, 39 секунд (25.02.2011 - 11:18) inpost написал(а):
WHERE `".IRB_DBPREFIX."images`.`aid` = ". (int)$row['id'] ." - твоя строчка.
А теперь множественный WHERE как выглядит? WHERE `aid` IN (6,16,22,35). Первым запросом в цикле создаёшь временную переменную с этими id, далее вторым запросом выбираешь WHERE IN ()
А теперь множественный WHERE как выглядит? WHERE `aid` IN (6,16,22,35). Первым запросом в цикле создаёшь временную переменную с этими id, далее вторым запросом выбираешь WHERE IN ()
Спустя 29 минут, 1 секунда (25.02.2011 - 11:47) Evilsoul написал(а):
inpost
оп-оп-оп, интересно, сейчас немного занят в течении часика попробую
оп-оп-оп, интересно, сейчас немного занят в течении часика попробую

Спустя 3 дня, 32 минуты, 46 секунд (28.02.2011 - 12:20) Evilsoul написал(а):
inpost
что-то не могу сообразить
, ведь запрос останется в цикле?
что-то не могу сообразить

Спустя 6 часов, 21 минута, 50 секунд (28.02.2011 - 18:42) inpost написал(а):
Evilsoul
за циклом, в цикле лишь формируется переменная (или массив).
за циклом, в цикле лишь формируется переменная (или массив).
Спустя 9 минут, 52 секунды (28.02.2011 - 18:52) Evilsoul написал(а):
То есть так:
1) Запрос к таблице галерей
2) цикл формирования галерей
3) теперь снова запрос только к таблице изображений
4) цикл формирования изображений галерей для предосмотра
когда два цикла отработали и накрутили нам нужных данных, мы их выводим, типа следующего:
-------
Дата
Название галереи 1
Описание
картинка 1 \ картинка 2 \ картинка 3 \ картинка 4 \ и т.д.
-------
Дата
Название галереи 2
Описание
картинка 1 \ картинка 2 \ картинка 3 \ картинка 4 \ и т.д.
-------
Правильно я тебя понял?
1) Запрос к таблице галерей
2) цикл формирования галерей
3) теперь снова запрос только к таблице изображений
4) цикл формирования изображений галерей для предосмотра
когда два цикла отработали и накрутили нам нужных данных, мы их выводим, типа следующего:
-------
Дата
Название галереи 1
Описание
картинка 1 \ картинка 2 \ картинка 3 \ картинка 4 \ и т.д.
-------
Дата
Название галереи 2
Описание
картинка 1 \ картинка 2 \ картинка 3 \ картинка 4 \ и т.д.
-------
Правильно я тебя понял?
Спустя 16 минут, 37 секунд (28.02.2011 - 19:08) inpost написал(а):
Evilsoul
Ну это уже тебе стоит самому подумать =)
Запрос№1...
while()
$ids[] = $row['id'];
Запрос№2 к фотографиями: WHERE `id` IN (".implode(',',$ids).")
Ну это уже тебе стоит самому подумать =)
Запрос№1...
while()
$ids[] = $row['id'];
Запрос№2 к фотографиями: WHERE `id` IN (".implode(',',$ids).")
Спустя 14 минут, 30 секунд (28.02.2011 - 19:23) Zerstoren написал(а):
Я заметил, что много кто упускает замечательное условие IN
На моем проекте оно мне смогло с экономить 70% ресурсов)
На моем проекте оно мне смогло с экономить 70% ресурсов)
Спустя 10 минут, 10 секунд (28.02.2011 - 19:33) Evilsoul написал(а):
inpost
Значит правильно понял, завтра попробую
Zerstoren
дело в том, что мало нормальной документации по MySql если в ПШП на php.net для того что бы понять как работает функция и что она возвращает достаточно знать 4-5 слов string, integer, bool, value, и т.д. то в sql запросах немного сложнее понять что выполняет оператор.
Значит правильно понял, завтра попробую

Zerstoren
дело в том, что мало нормальной документации по MySql если в ПШП на php.net для того что бы понять как работает функция и что она возвращает достаточно знать 4-5 слов string, integer, bool, value, и т.д. то в sql запросах немного сложнее понять что выполняет оператор.
_____________
Блог | VK | GitHub | Twitch