#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.
}
}
}