Как получить 1 вопрос и 4 ответа из этого скрипта?

#php #mysqli

#php #mysqli

Вопрос:

Я создаю игру WebGL на Unity, но хочу сначала исправить свой php.

У меня есть 2 таблицы вопросов и ответов. У каждого вопроса есть 4 потенциальных ответа, и их нужно извлечь из моей базы данных. Таблица ответов совпадает с таблицей вопросов через questionId .

Вопросы:

  • Должен ли я лучше использовать объединение таблиц или я должен разделить их?
  • Должен ли я просто использовать оператор select только для таблицы вопросов, затем таблицу join для ответов и отправлять отдельно?
  • Должен ли я был создать таблицу ответов с 4 столбцами для разных ответов?

Текущий код:

 <?php

$query = ("select questiontable.questionId, questiontable.question, answertable.answerId,answertable.answer, answertable.questionId, questiontable.scoreValue
  FROM questiontable 
  inner join answertable on questiontable.questionId=answertable.questionId   ORDER BY RAND () LIMIT 1 ");
$result =mysqli_query($conn, $query) or die(mysqli_error($conn));

while ($row = mysqli_fetch_assoc($result)){
  $row_cnt = mysqli_num_rows($result);
  echo $row_cnt;    
  echo $row ['question'];
  echo $row ['answer'] ;
  echo $row ['answer'] ;
  echo $row ['answer'];
  echo $row ['answer'];
}
?>
  

Вот мои таблицы:

 CREATE TABLE `braingain`.`questionTable`
 ( `questionId` INT NOT NULL AUTO_INCREMENT , `question` VARCHAR(600) NOT NULL , `scoreValue` INT NOT NULL , `subject` VARCHAR(50) NOT NULL , PRIMARY KEY (`questionId`));

CREATE TABLE `braingain`.`answerTable`
 ( `answerId` INT NOT NULL  , `answer` VARCHAR(600) NOT NULL , 'questionId', isCorrect;
  

Запрос должен извлекать вопросы и 4 связанных ответа в массив.

Желаемый результат

Созданный массив должен выглядеть следующим образом:

 |         question               | answerA | answerB | answerC | answerD |
| WHICH IS THE CORRECT SPELLING? | APPLE   | APEL    | APPUL   | APPAL   |
  

Комментарии:

1. Ваше второе CREATE TABLE утверждение не является допустимым кодом SQL. Что касается вашего вопроса: это зависит. Если вам нужны данные в одной «транзакции» (как в вашем приведенном выше коде), я бы использовал ОБЪЕДИНЕНИЕ. В большинстве случаев вы не хотите, чтобы ответы были видны где-то в вашем HTML-коде, вы бы только показали вопрос (и загрузили его без объединения ответов) во внешнем интерфейсе и загрузили ответы как часть внутренней проверки.

2. (1.) Должен ли я лучше использовать объединение таблиц или я должен разделить их? * Как правило, запросы из объединенных таблиц выполняются быстрее. (2.) Должен ли я был создать таблицу ответов с 4 столбцами для разных ответов? * Если вы ожидаете, что каждый вопрос будет иметь фиксированное количество ответов, вы можете просто поместить ответы в ту же таблицу, что и вопросы. Но, если вы предполагаете, что количество ответов может отличаться для каждого вопроса, используйте отдельную таблицу для ответов. В этой новой таблице будет по одному варианту ответа на строку. Таким образом, таблица вопросов будет иметь отношение «один ко многим» к таблице ответов.

3. Но, если вы предвидите, что количество ответов может отличаться для каждого вопроса… Кроме того, анализировать данные было бы намного проще при разделении вопросов и ответов @programmer-man

Ответ №1:

Запустите два вложенных запроса,

 $output = array();
$answer_array = array('answerA','answerB','answerC','answerD');
$query = ("select * from questiontable ORDER BY RAND () LIMIT 1 ");
$result =mysqli_query($conn, $query) or die(mysqli_error($conn));

while ($row = mysqli_fetch_assoc($result)){
    $row_cnt = mysqli_num_rows($result);
    $output['question']=$row['question'];
    $query2 = ("select * from answerTable where questionId = ". $row ['questionId'] order by answerId);
    $result2 =mysqli_query($conn, $query2) or die(mysqli_error($conn));
    $i=0;
    while ($row2 = mysqli_fetch_assoc($result2)){
        $output[answer_array[$i]]=$row2['answer'];
        $i  ;
    }
}
print_r($output);
?>
  

Комментарии:

1. для массива ответов было бы полезно поместить их в переменную типа $answer_array = array(‘answerA’,’answerB’, ‘answerC’, ‘answerD’); $answerA_text= ‘answerA’ и т.д. Или это было бы глупо?

2. answerA, answerB и т.д. — это индексы выходного массива, содержащие текст ответов, а один индекс — это вопрос, содержащий текст вопроса в качестве желаемого выходного массива.

3. Приветствия! это сработало замечательно. мне просто нужно выяснить, как отобразить результат в соответствующих областях пользовательского интерфейса в Unity прямо сейчас!

4. Отлично! отметьте это как ответ:D Unity как в игровом фреймворке?

5. вот результат сейчас… Массив ([вопрос] => Что такое 9×4? [answerA] => 16 [answerB] => 360 [answerC] => 32 [answerD] => 36 ) почему выводится слово «Массив»?

Ответ №2:

Пожалуйста, взгляните на отступы, это делает код намного более понятным 🙂

 <?php
$query = ("
    SELECT
        questiontable.questionId,
        questiontable.question,
        answertable.answerId,
        answertable.answer,
        answertable.questionId,
        questiontable.scoreValue
    FROM
        questiontable 
    INNER JOIN
        answertable on questiontable.questionId = answertable.questionId
    ORDER BY RAND()
    LIMIT 1
");

$result = mysqli_query($conn, $query) or die(mysqli_error($conn));
$data = [];
$data[] = null;

$keys = [
    'question',
    'answerA',
    'answerB',
    'answerC',
    'answerD',
];

$return = [];
while ($row = mysqli_fetch_assoc($result)){
    if ($data[0] !== $row['question']) {
        $data = [];
        $data[] = $row['question'];
    }

    $data[] = $row['answer'];

    if (count($data) === 5) {
        $dataAssociative = array_combine($keys, $data);
        $return[] = $dataAssociative;
    }
}

var_dump($return);
?>
  

Комментарии:

1. Спасибо peeps. Попробую это, как только вернусь домой

Ответ №3:

хорошо, итак, у меня все работает с моим php и т.д. у меня он повторяет результат, как я хочу, вот код…

  <?php
    session_start();
    include 'dbconnect.php';

    $output = array();

    $answer_array = array('answerA','answerB','answerC','answerD'); //loads answers into array

    $query = ("select * from questiontable ORDER BY RAND () LIMIT 1 ");//sql query to get questions
    $result =mysqli_query($conn, $query) or die(mysqli_error($conn));

while ($row = mysqli_fetch_assoc($result)){
        $row_cnt = mysqli_num_rows($result);
        $output['question']=$row['question'];
        $query2 = ("select * from answerTable where questionId = '". ($row ['questionId'])."' order by rand()");//sql query to get answers for questions by questionId 
        $result2 =mysqli_query($conn, $query2) or die(mysqli_error($conn));
        $i=0;
        $question=$row ['question'];
        while ($row2 = mysqli_fetch_assoc($result2)){
        $output[$answer_array[$i]]=$row2['answer'];
        $i  ;
        $_POST = $output;
        }
                                          }
echo "</br> ";                                    
echo $_POST ['question'];
echo "</br> ";
echo $_POST['answerA'];
echo "</br>";
echo $_POST['answerB'];
echo "</br>";
echo $_POST['answerC'];
echo "</br> ";
echo $_POST['answerD'];
?>
  

теперь мне нужно сохранить результаты в unity, чтобы я мог назначить их кнопкам и т.д.
я извлекаю детали, но не уверен, как назначить, например, $_POST['answerA]; переменной в c #.
это мой код на c #…

 public class qNaDisplay : MonoBehaviour {
public Text questionDisplayText, answerAText, answerBText, answerCText, answerDText;
public Text questMessage, answerMessage;

private string question, a, b, c, d;


// Use this for initialization
void Start ()
{
    WWW questionURL = new WWW("http://localhost:8080/Project/PHP/questionRequest.php");
    question = questionDisplayText.text;
    a = answerAText.text;
    b = answerBText.text;
    c = answerCText.text;
    d = answerDText.text;
    StartCoroutine(qNaget(questionURL));
}

// Update is called once per frame
void Update () {

}
  

приватный IEnumerator qNaget (WWW questionURL)
{

     yield return  questionURL;
    Debug.Log(questionURL.text);
    if (questionURL.error != null)
    {
        print("There was an error getting the question "   questionURL.error);
    }
    else
    {
         Debug.Log (questionURL.text); // this is a GUIText that will display the scores in game.
    }
}
  

}