Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выбор случайного значения определённого поля
 
 автор: DOKERATOR   (04.08.2012 в 02:03)   письмо автору
 
 

Всем привет, мне нужно выбрать с бд случайное значение определённого поля, пытался так:

<?php
$query1 
"SELECT * FROM vika WHERE num=rand(1,4700)";
$result1=mysql_query($query1);
$n1=mysql_fetch_array($result1);
print 
$n1[vopros]; // тут вывожу то, что надо из поля, относящемуся к строке случайного поля
?>

не получается почему-то.
мне нужно выбрать случайное значение именно поля num, а потом вывести текст из поля, относящемуся к строке случайного поля...
как мне выбрать случайное значение поля num?
заранее спасибо!

  Ответить  
 
 автор: cheops   (04.08.2012 в 06:03)   письмо автору
 
   для: DOKERATOR   (04.08.2012 в 02:03)
 

Для этого традиционно используется конструкция ORDER BY RAND()
SELECT
  * 
FROM
  vika
ORDER BY RAND()
LIMIT 1

  Ответить  
 
 автор: Valick   (04.08.2012 в 09:39)   письмо автору
 
   для: cheops   (04.08.2012 в 06:03)
 

это при правильной организации бд, ну и небольшой по объему таблице
а вот слова "мне нужно выбрать случайное значение именно поля num" начинают терзать мутными сомненьями

  Ответить  
 
 автор: DoKeRaToR   (04.08.2012 в 11:43)   письмо автору
 
   для: Valick   (04.08.2012 в 09:39)
 

сделал так
 SELECT * FROM vika WHERE num ORDER BY RAND() LIMIT 1
, но теперь с обработчиком геморой...

  Ответить  
 
 автор: DoKeRaToR   (04.08.2012 в 11:39)   письмо автору
 
   для: cheops   (04.08.2012 в 06:03)
 

про это я знаю, но тогда будет выбираться вообще случайное значение строки, а мне нужно случайное значение определённого поля, например num
таблица состоит так:
num|otv|otv1|otv2|otv3|otv4|vopros|

num тут это номер вопроса, вот мне и нужно выбрать рандомно вопрос, а потом мне в обработчике надо ещё обращаться к строке для сверки ответов и т.д.

  Ответить  
 
 автор: Valick   (04.08.2012 в 11:50)   письмо автору
 
   для: DoKeRaToR   (04.08.2012 в 11:39)
 

ну вот об этом я и говорил...
у вас мухи с котлетами вперемешку
у вас и вопросы и ответы в одной таблице, а этого не должно быть
но в любом случае, у вас любая строка содержит вопрос, в чем проблема с предыдущим запросом?
выбрали строку случайно, запомнили num

  Ответить  
 
 автор: DoKeRaToR   (04.08.2012 в 12:02)   письмо автору
 
   для: Valick   (04.08.2012 в 11:50)
 

а как ещё?
например, реализовано так в таблице:
num|otvet|otvet1 |otvet2 |otvet3 |otvet4 |vopros |
1 |3 |кость |мясо |труба |ну и тут что-нибудь |а тут вопрос|

вот обработчик
 <?php
$query1 
"SELECT * FROM vika WHERE num ORDER BY RAND() LIMIT 1"//делаю случайную выборку
$result1=mysql_query($query1);
$n1=mysql_fetch_array($result1);//заношу в массив поля строки
$vopr="Внимание, вопрос: <br> $n1[vopros]<br> Варианты ответа:<br> 1) $n1[otvet1]<br> 2) $n1[otvet2]<br> 3) $n1[otvet3]<br> 4) $n1[otvet4]<br> Введите цифру ответа!"//заношу в переменную вопрос
print "$vopr"//вывожу вопрос
if (!empty($_POST['submit'])){ //если кнопка нажата, то выполняем следующее
if($sms=="$n1[otvet]"// если ответ юзера= ответу с таблицы, то
print "Молодчина, правильно=) Сейчас придумаем следующий вопросик!"
sleep(2).
print 
"$vopr"// выводим первое сообщение ,замираем скрипт на 2 секунды и выводим следующий вопрос
else 
print 
"Ответ невенрый!".
print 
"$vopr";// иначе выводим сообщение мол типа неверно и выводим новый вопрос с бд

?>

  Ответить  
 
 автор: DoKeRaToR   (04.08.2012 в 12:24)   письмо автору
 
   для: DoKeRaToR   (04.08.2012 в 12:02)
 

а, всё, спасибо, разобрался, переделал чуть обработчик, он работал правильно, но не совсем, сделал так:

<?php
if (!empty($_POST['submit'])){
if(
$sms=="$n1[otvet]")
print 
"<p class='b'><b>Молодчина, правильно=)</b></p><br>";
else
print 
"<p class='b'><b>Ответ невенрый!</b></p><br>";
}
$vopr="<p class='b'>Внимание, вопрос: <br> $n1[vopros]<br> Варианты ответа:<br> 1) $n1[otvet1]<br> 2) $n1[otvet2]<br> 3) $n1[otvet3]<br> 4) $n1[otvet4]<br> Введите цифру ответа!</p>";
print 
"$vopr";
?>

  Ответить  
 
 автор: DoKeRaToR   (04.08.2012 в 13:05)   письмо автору
 
   для: DoKeRaToR   (04.08.2012 в 12:24)
 

ещё вопрос: а как сделать, чтобы, например, команда print""; выполнялась через минуту? без использования sleep(60). надо, чтобы скрипт выполнялся, а когда пройдёт минута, то выполнить команду ptint "";

  Ответить  
 
 автор: Valick   (04.08.2012 в 13:09)   письмо автору
 
   для: DoKeRaToR   (04.08.2012 в 13:05)
 

никак, да и ненужно это
просто нужно фиксировать на сервере время вывода вопроса в браузер, и считать любой ответ неверным, если прошло более минуты

  Ответить  
 
 автор: DoKeRaToR   (04.08.2012 в 13:15)   письмо автору
 
   для: Valick   (04.08.2012 в 13:09)
 

а не подскажите как фиксировать время? мне нужно если ответили на вопрос (правильно), то вывести другой вопрос через минуту. а у меня, если обновить страницу, выводится новый и новый вопрос...
также, не подскажите как сделать чтобы обработчик принимал значения с формы ТОЛЬКО числа, т.е. только 1,2,3,4. а другие посты не трогал, а то если например написать в чат "всем привет", то обработчик считает это за ответ и начинает выводить мол "ответ неверный".
заранее огромное спасибо за помощь!!! :)

  Ответить  
 
 автор: Valick   (04.08.2012 в 13:30)   письмо автору
 
   для: DoKeRaToR   (04.08.2012 в 13:15)
 

у вас там не только "мухи с котлетами", но еще и "тараканы" :)
вы хотите написать универсальный скрипт всего-всего на свете?

фиксировать время, как и все остальные параметры относящиеся к пользователю, лучше всего в сессионной переменной
но у вас тут все смешалось "и кони и люди", поэтому ответ на вопрос
"как сделать чтобы обработчик принимал значения с формы ТОЛЬКО числа"
вам ничего не даст
ошибки у вас не в реализации, а в самой логике

  Ответить  
 
 автор: DoKeRaToR   (04.08.2012 в 13:51)   письмо автору
 
   для: Valick   (04.08.2012 в 13:30)
 

понятно...

  Ответить  
 
 автор: Valick   (04.08.2012 в 13:57)   письмо автору
 
   для: DoKeRaToR   (04.08.2012 в 13:51)
 

опишите словами как можно более подробно что вы хотите сделать

  Ответить  
 
 автор: DoKeRaToR   (04.08.2012 в 22:56)   письмо автору
 
   для: Valick   (04.08.2012 в 13:57)
 

подробно? мне нужно сделать что-то типо викторины. в базе есть порядка 5000 вопросов везде по 4 варианта ответа, естественно правильный только один из них. вывести как их я знаю, сверить ответы- тоже. вот нужно сделать. если в поле <input type="text" name="sms" size="20" maxlength="1500" id="sms"/> введена цифра от 1 до 4, то считать её за ответ на вопрос, а если это не те цифры или просто текст типа "привет", то не обрабатывать в обработчике. если введён неправильный ответ, то оставить вопрос на 30 секунд, а далее сменить его. а если правильный вопрос, то вывести мол "молодец, правильно, сейчас придумаем новый вопросик", далее через минуту вывести другой рандомный вопрос из базы. если никто не отвечает, то не выводить другой вопрос в течение 5 минут, т.е. поменять вопрос с выводом "никто не ответил на поставленный вопрос, сейчас будет другой вопросик=)". часть этого как реализовать я знаю, но всё, что связано с временем для меня тяжёлый вопрос... могу разобраться и сам, но это будет долго- 2,3 дня, так как придётся читать литературу php, js и т.д. на это времени особо нету. пишу викторину чисто для того, чтобы побольше попрактиковать, а не для продажи его кому-нибудь.. хочу разобраться со временем в данном случае, как его реализовать, чтобы всё работало. код не прошу за меня писать, главное хотя бы намёк дать на функции, которые надо использовать. благодарен вам за помощь и за то, что не оставили мой вопрос без внимания! спасибо!

  Ответить  
 
 автор: Valick   (05.08.2012 в 09:20)   письмо автору
 
   для: DoKeRaToR   (04.08.2012 в 22:56)
 

2-3 три дня это не долго, даже 2-3 недели это не долго, для того чтобы разобраться, усвоить и закрепить материал :)
для того чтобы отфильтровать цифры можно применить функцию intval(), а для пущей важности еще и trim() (которая нужна и без проверки числа)
в итоге получим условие
$sms=trim($sms);
if(intval($sms)>0 && intval($sms)<5){
тут обработчик викторины
}else{
тут обработчик чата
}

___
на викторину, я так понимаю, отвечают все кому не лень в реальном времени, а кто первый ответил, того и "тапки", как вы различаете пользователей пославших ответ? как вы ограничиваете пользователя от того чтобы он смог послать несколько (все четыре) ответа подряд?

  Ответить  
 
 автор: DoKeRaToR   (05.08.2012 в 09:42)   письмо автору
 
   для: Valick   (05.08.2012 в 09:20)
 

спасибо:)
ответивших пользователей я записываю в сессии и потом вывожу мол тот-то, тот-то ответил правильно или наоборот- неправильно. а на второй вопрос пока что ответ дать не могу, нужно посидеть и подумать над этим вопросом. думаю, через условие можно это сделать. скоро постараюсь чуть переписать викторину, чтобы было не 4 варианта ответа, а один, т.е. просто задавался вопрос и в конце дописывалось сколько букв в ответе. со временем сделать подсказки... но это всё со временем, нужно для начала хотя бы простую викторину реализовать, а уже потом заняться викториной потяжелее.

  Ответить  
 
 автор: DoKeRaToR   (05.08.2012 в 09:42)   письмо автору
 
   для: Valick   (05.08.2012 в 09:20)
 

спасибо:)
ответивших пользователей я записываю в сессии и потом вывожу мол тот-то, тот-то ответил правильно или наоборот- неправильно. а на второй вопрос пока что ответ дать не могу, нужно посидеть и подумать над этим вопросом. думаю, через условие можно это сделать. скоро постараюсь чуть переписать викторину, чтобы было не 4 варианта ответа, а один, т.е. просто задавался вопрос и в конце дописывалось сколько букв в ответе. со временем сделать подсказки... но это всё со временем, нужно для начала хотя бы простую викторину реализовать, а уже потом заняться викториной потяжелее.

  Ответить  
 
 автор: Lotanaen   (04.08.2012 в 15:04)   письмо автору
 
   для: DoKeRaToR   (04.08.2012 в 13:15)
 

видимо вам нужно ajax использовать, а что значит "другие посты не трогал"?

  Ответить  
 
 автор: Valick   (05.08.2012 в 09:33)   письмо автору
 
   для: Lotanaen   (04.08.2012 в 15:04)
 

может сразу это?

  Ответить  
 
 автор: DoKeRaToR   (05.08.2012 в 10:19)   письмо автору
 
   для: Lotanaen   (04.08.2012 в 15:04)
 

это в смысле другие сообщения не трогать...

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования