PHP извлекает уникальное случайное значение из базы данных - PullRequest
2 голосов
/ 05 июля 2011

Я работал с PHP-программой викторины, и я немного растерялся, выбирая уникальное случайное значение из базы данных. В настоящее время вот мой сценарий.

<?php $num = 1;
    $sql = "SELECT * FROM questions ORDER BY RAND() LIMIT ".$num;
    $sql_exec = mysql_query($sql, $connection);
    if(isset($_POST['start']) || isset($_SESSION['xy'])){
        while($row = mysql_fetch_array($sql_exec)){
            if(!in_array($row['qid'], $_SESSION['xy'])){
                echo $row['qid']." -".$row['question']."<br />";
                if(isset($_POST['num'])){
                    $_SESSION['xy'][] .=  $row['qid'];
                }
            }else{
                // WHAT WILL I PUT HERE
            }
        }
    } ?>

<form action="<?php $_SERVER[PHP_SELF]; ?>" method="post">
    <input type="hidden" name="num" value="1" />
    <input type="submit" name="start" value="Start" <?php if(isset($_POST['start']) || isset($_SESSION['xy'])) echo "disabled"; ?> />
    <input type="submit" name="submit" value="Continue" />
    <input type="submit" name="destroy" value="Destroy" />
</form>

Я поместил идентификатор каждой строки в массив сеанса, чтобы я мог записать все предыдущие вопросы и что я могу сравнить, если новый вопрос уже задан, используя in_array.

Проблема в том, что если новые данные выборки уже находятся в массиве, программа останавливается, поскольку у меня все еще нет другого значения,

[идея-01] Я подумываю над тем, чтобы добавить новый оператор select в else, но я знаю, что это неправильно, потому что оно внутри цикла, и нет уверенности в том, что значение будет уникальным.

[идея-02] С записями массива идентификаторов строк, которые я имею в сеансе, я подумываю поставить условие where для выбора выше

WHERE qid != $_SESSION['xy']

Проблема в том, что я должен зациклить этот сеанс, чтобы сравнить каждое значение с утверждением. Также вопрос состоит из 20 пунктов и может быть расширен в будущем.

1 Ответ

1 голос
/ 05 июля 2011

Я думаю, что вам нужна функция сравнения mysql.

$mysql_query="SELECT * FROM questions WHERE question NOT IN (".implode(",",$_SESSION["anwsered_questions"]).") ORDER BY RAND();";

Убедитесь, что в $ _SESSION ["anwsered_question"] хранятся только числовые значенияэтот запрос будет уязвим для инъекций MySQL

Также: не используйте ORDER BY RAND (), см. http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/ для получения дополнительной информации.

...