[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Запрос к базе внутри цикла
AlmazDelDiablo
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
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)
я имел в виду делать не так

$i = 0;
while($i < count($test)) {
$i++;
}

А вот так

$i = 0;
$size = sizeof($test);
while($i < $size) {
$i++;
}

Показал чисто принцип... Надесь Вы поняли

Да, я именно так и сделал. Толькоу меня цикл 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 года "Программирование для профессионалов" =)

Спустя 2 часа, 48 минут, 23 секунды (25.02.2011 - 00:33) Arni написал(а):
Не положиш ты мускуль если это работает гдето в админке а не на главной частопосещаемого сайта. Если Ооооочень сильно надо запросы в цыкле то.

Верная дорога сюда

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 человек, чтобы положить мускул. Очередь мускула забьется настолько, что он автоматически заблокирует все и остановит процесс.

Спустя 1 час, 11 секунд (25.02.2011 - 10:26) glock18 написал(а):
count и sizeof не могут работать по-разному, потому что это алиасы одной функции, мануал читайте сначала, кто решит поспорить

Спустя 33 минуты, 47 секунд (25.02.2011 - 11:00) Evilsoul написал(а):
Хорошо, да бы не создавать в новь тему, я здесь продолжу.
Я как-то уже задавал такой вопрос.
как здесь избавится от запроса в цикле:
    $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 ()

Спустя 29 минут, 1 секунда (25.02.2011 - 11:47) Evilsoul написал(а):
inpost
оп-оп-оп, интересно, сейчас немного занят в течении часика попробую smile.gif

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

Спустя 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 \ и т.д.
-------

Правильно я тебя понял?

Спустя 16 минут, 37 секунд (28.02.2011 - 19:08) inpost написал(а):
Evilsoul
Ну это уже тебе стоит самому подумать =)
Запрос№1...
while()
$ids[] = $row['id'];
Запрос№2 к фотографиями: WHERE `id` IN (".implode(',',$ids).")

Спустя 14 минут, 30 секунд (28.02.2011 - 19:23) Zerstoren написал(а):
Я заметил, что много кто упускает замечательное условие IN
На моем проекте оно мне смогло с экономить 70% ресурсов)

Спустя 10 минут, 10 секунд (28.02.2011 - 19:33) Evilsoul написал(а):
inpost
Значит правильно понял, завтра попробую smile.gif

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


_____________
Блог | VK | GitHub | Twitch
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.