как рандомизировать поиск вопроса из базы данных?

.i имеет следующий код:

<? session_start(); $host = 'localhost'; $user = 'root'; $pw = ''; $db = 'pmdb'; mysql_connect($host,$user,$pw); mysql_select_db($db); $result = mysql_query("SELECT * FROM questions WHERE QuizID=1"); $num_rows = mysql_num_rows($result); $_SESSION['totalquestions']=$num_rows; while($row = mysql_fetch_assoc($result)) { $array[] = $row; } //Start the form echo '<form method="post" action="result.php">'; for($i=0; $i<=($num_rows-1); $i++) { //Render a question + the answer choices echo $array[$i]['Title']."<br />\n"; for ($j=1;$j<=4;$j++) { echo "<input type=\"radio\" name=\"ans$i\" value=\"$j\">". $array[$i]['Answer'.$j]."<br />\n"; } } //End the form echo "<input type=\"submit\" value=\"submit\" id=\"submit\">\n</form>"; ?> 

. приведенный выше код отображает все вопросы и их соответствующие варианты ответов, которые извлекаются из базы данных. мой вопрос в том, как вы производите выборку вопросов и показываете только 5 за раз, и после нажатия следующей кнопки будут отображены следующие пять. Заранее спасибо!

Вы можете использовать LIMIT m,n для ограничения количества полученных результатов и смещения результатов на заданную сумму.

Теперь вы можете сделать что-то вроде:

  SELECT * FROM questions WHERE QuizID=1 LIMIT $page,5; 

Где вы вычисляете $page на основе переменной $_GET . Но это не решит вашу случайность.

Вы всегда можете засеять RAND ($ key) с помощью заданного ключа, который вы сохраняете на своей сессии, чтобы вы могли ORDER BY RAND($key) и использовать описанную выше технику ограничения.

Вероятно, самым простым для реализации было бы получить весь набор результатов, перетасовать его и кешировать. Затем используйте php для отображения только определенного фрагмента кеша.

Поскольку это связано с разбиением на страницы. Позвольте мне сказать вам, LIMIT m, n может быть не так быстро, как кажется. Узнайте, как улучшить его и узнать больше об эффективном разбиении на страницы с использованием MySQL

 SELECT * FROM questions WHERE QuizID=1 ORDER BY RAND() LIMIT 5 

Вы получите 5 случайных строк. Это не очень эффективно для очень большой таблицы, но я предполагаю, что это не ваше дело.

Потенциальным подходом было бы:

  1. Извлеките идентификаторы вопросов из базы данных при обнаружении нового пользователя / по 1-му вопросу через ORDER BY RAND() LIMIT 5 в SQL.

  2. Сохраните их в $_SESSION .

  3. Итерируйте идентификаторы вопроса в $_SESSION , загрузив полные данные вопроса из БД через идентификатор.

Попробуй это :

вот код для получения результатов:

  $total = @mysql_num_rows(mysql_query("SELECT * FROM questions WHERE QuizID=1")); $per_page = 5; $page = $_GET['page']; $query = "SELECT * FROM questions WHERE QuizID=1 , id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT " . mysql_real_escape_string($per_page) ." OFFSET " . mysql_real_escape_string($page * $per_page) . ""; 

вот код для «следующей страницы»:

  if($total >= ($page * $per_page)) { echo '<a href="?page='.$page+1.'" >Next Page</a>'; } 

возможно, вам нужно что-то изменить в моем коде, потому что я не пробовал его, чтобы увидеть, работает ли он.

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

Один из способов борьбы с этим – создать рандомизированный массив чисел, соответствующий ключевому полю в таблице question . Затем он сохраняется на сервере на постоянной основе и связан с ключом, который передается обратно клиенту (возможно, идентификатор сеанса).

Затем, когда пользователь обращается к странице, появляется идентификатор сеанса; это используется для идентификации рандомизированного массива; $page_num используется как индекс в массиве:

  $question_ids = array_slice($randomized_array, ($page_num - 1)*5, 5); 

Затем вы займете свои вопросы, используя:

  $ids_for_query = array_map('mysql_real_escape_string', array_values($question_ids)); mysql_query("SELECT * FROM questions WHERE id IN (".implode(',', $ids_for_query ).")");