[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Обход условий php
hecby
Сегодня заметил интересную вещь в пхп. Мне нужен был цикл, который выбирал бы из базы десять случайных записей и записывал их в массив, случайное число (id) генерируется в цикле и принимается если удовлетворят двум условиям - не равно конкретному числу (напр. 1) и не равно idу, который уже извлечен из базы данных. Тоесть цикл крутится до тех пор, пока нужное число не найдено, или после 100 оборотов (во избежание бесконечного цикла). Суть в том, что в базе есть три записи, одна из которых не удовлетворяет первому условию - выбрать можно только 2. Вследствие ошибки в ограничении скрипт требовал три записи (ограничение состоит в том, чтобы выбрать 10 записей, если их в базе больше 10, или количество записей если меньше, в этом и была ошибка, нужно было количество -1 ). Так вот, скрипт исправно крутился, но с условиями творились чудеса, видно было, что они срабатывают, но в результате в массиве все равно оказывалась "запрещенная" запись. Как только я стал требовать на одну запись меньше, все заработало, и ни одного случая обхода условий замечено не было. Изощренная фантазия нарисовала картину - компилятор видит, что цикл не сможет остановиться и не обращает внимания на условия... Может быть такое чудо?



Спустя 24 минуты, 1 секунда (20.10.2011 - 16:15) imbalance_hero написал(а):
hecby
Врядли.
ORDER BY RAND() LIMIT 10 - так ты выбирал 10 случайных?

Спустя 24 секунды (20.10.2011 - 16:15) Michael написал(а):
Цитата
Может быть такое чудо?

чудес не бывает, сынок. А вот логические ошибки в алгоритмах случаются, это да. А так - код в студию.

Спустя 28 минут, 5 секунд (20.10.2011 - 16:43) hecby написал(а):
Свернутый текст
$k=0;
$d=1;
$uss=1; //ид, который выбирать нельзя
while($k<=$d)
{
$zap1=mysql_query("SELECT max(id) FROM game_user");
$zap2=mysql_fetch_array($zap1);
$p=$zap2[0];
if($p>10)
$d=9;
else
$d=$p-2;//беда кроется здесь, вначале было $d=$p-1;
$r=1;
$z=0;
while($r==1)
{
$c=0;
$px=mt_rand(1, $p);
$e=count($users);
for($i=0; $i<=$e; $i++)
{
if($px==$users[$i][0])
{
echo(err);
$r=1;
$c=1;
}
}

if($px==$uss)
{
$r=1;
$c=1;
}
if($c==0)
$r=0;
$z++;
if($z>=100)
$r=0;
}
$zap5=mysql_query("SELECT id, level, nick FROM game_user WHERE id='$px' AND zdorovye=zdorovye2");
$zap6=mysql_fetch_array($zap5);
if($zap6[0]!='')
{
$users[$k][0]=$zap6[0];
$users[$k][1]=$zap6[1];
$users[$k][2]=$zap6[2];
$k++;
}
}
//Если нужно закомментирую непонятные места, order by rand - где-то читал, что могет выдать одинаковые, поэтому боялся использовать, нужны только уникальные


 ! 

М
Выделяйте код тегами !
Winston

Спустя 9 минут, 4 секунды (20.10.2011 - 16:52) imbalance_hero написал(а):
hecby
Он выдаст как раз то, что тебе надо. Я выше же показал, как сделать надо. Сделай и проверяй.

Спустя 2 минуты, 58 секунд (20.10.2011 - 16:55) hecby написал(а):
Эт я понимаю, мне хочется все-таки этот, я его немного оптимизирую, меня интересует "чудо" с обходом условий

*тут было заявление, что человек не умеет пользоваться ORDER BY RAND()*

Спустя 2 минуты, 15 секунд (20.10.2011 - 16:57) imbalance_hero написал(а):
Нельзя, нельзя в цикле использовать запросы, это правило плохого тона.
Если можно сделать 1 запрос, не надо из-за этого делать 100 запросов.

А если не знаешь, как работает - то в справочники и читай, пробуй. Пойми, если у тебя есть кучка навоза, украсив её вишенкой, она такой же кучей и останется.

Спустя 4 минуты, 35 секунд (20.10.2011 - 17:02) hecby написал(а):
Вы меня конечно извините, я не собираюсь никого учить, я наткнулся на нестандартную ситуацию и решил спросить у знающих людей, не нужно мне помагать оптимизировать код, к тому же ранд в запросе работает медленней чем мой вариант, о правилах плохого тона: запрос выполнится не больше чем десять раз, в ид таблицы разрывов нет и не будет.

Спустя 2 минуты, 48 секунд (20.10.2011 - 17:05) imbalance_hero написал(а):
"или после 100 оборотов". smile.gif Ага, 100 оборотов, какие тут "не больше чем десять раз" smile.gif

Спустя 2 минуты, 38 секунд (20.10.2011 - 17:07) imbalance_hero написал(а):
Сообщением выше ты написал, что не умеешь пользоваться ORDER BY RAND(), А тут на тебе, уже умный, но не собираешься учить smile.gif

Спустя 7 минут, 4 секунды (20.10.2011 - 17:15) hecby написал(а):
На американском форуме - задаешь вопрос, получаешь ответ, на израильском - задаешь вопрос, тебе отвечают вопросом, на русском - задаешь вопрос и тебе долго обьясняют, почему ты идиот... Вот и я попал в такую ситуацию... Вопрос следующий меня тревожил: почему $d=$p-2; работает, а $d=$p-1; работает, но не выполняет условие, точнее при тестировании видно, что проверка значения несколько раз срабатывает, заставляя цикл генерить новое значение, но все-таки один раз пропускает его, причем каждый раз количество выполнения условий разное, вот это и странно, база тут не при чем, поскольку, как видно в коде, запрос к базе пойдет, когда сгенерированное число пройдет проверку, а оно как-то раз умудряется ее проскочить, если вследствие $d=$p-1; цикл становится бесконечным

Спустя 3 минуты, 12 секунд (20.10.2011 - 17:18) Winston написал(а):
Цитата (hecby @ 20.10.2011 - 17:15)
На американском форуме - задаешь вопрос, получаешь ответ,

Задавайте вопросы на американских форумах wink.gif

Спустя 4 минуты, 3 секунды (20.10.2011 - 17:22) imbalance_hero написал(а):
Согласен с предыдущим оратором. Если я сделаю за тебя, то ты должен будешь заплатить мне деньги. Наш форум для нормальных и профессиональных советов.

Спустя 2 минуты, 53 секунды (20.10.2011 - 17:25) hecby написал(а):
Хорошо товарищи, давайте профессиональные советы кому-нибудь другому, если сумеете, потому как больше похожи на бабок у подьезда, чем на профессионалов. Спс за помощь, закрывайте тему

Спустя 1 минута, 31 секунда (20.10.2011 - 17:26) m4a1fox написал(а):
Чер! Надо себе снипет сделать, по поводу экстрасенсорных способностей здешних обитателей!!!!! Фуууух код покажи, пожалуйста!

Спустя 1 минута, 13 секунд (20.10.2011 - 17:27) imbalance_hero написал(а):
За ваши деньги любой каприз!

Спустя 13 минут, 22 секунды (20.10.2011 - 17:41) hecby написал(а):
код есть, там где большой красный знак восклицания
Быстрый ответ:

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