.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-му вопросу через ORDER BY RAND() LIMIT 5
в SQL.
Сохраните их в $_SESSION
.
Итерируйте идентификаторы вопроса в $_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 ).")");