Как можно контролировать переменную связывания параметров в PHP

0

Я выбираю список идентификаторов экзаменов из своей базы данных, а затем использую случайный для выбора из списка вопросов. Если нет подходящих вопросов, я хочу выбрать другой случайный идентификатор и попробовать еще раз. Вот код, который у меня есть сейчас; это работает, но не возвращает никаких вопросов для некоторых экзаменов.

$query = $connect->prepare("SELECT * FROM exam WHERE level=? AND flag=?");
$query->bind_param("si",$level,$flag);
$query->execute();
$result = $query->get_result();
$resultCount= $result->num_rows;
if($resultCount>0)
{
    while($row=$result->fetch_assoc())
    {   
        $list[]=$row['id'];
   }
    $indexRand=array_rand($list, 1);
    $query->close();
}
$query2 = $connect->prepare("SELECT * FROM questions WHERE exam_id=?");
$query2->bind_param('i', $list[$indexRand]);
$query2->execute();
$question_result = $query2->get_result();
$resultCount2= $question_result->num_rows;
if($resultCount2>0)
{  
    while($questions_rows=$question_result->fetch_assoc())
    {   
        $list2[]=$questions_rows;
    }
}
  • 0
    извините мой английский не так хорошо :)
  • 0
    и спасибо за ответы :)
Теги:
mysqli

2 ответа

0

Если я правильно понимаю, вы можете сделать это в одном запросе к базе данных.

SELECT q.*
  FROM questions q
  LEFT JOIN (
    SELECT e.id
    FROM exams e
    LEFT JOIN questions q ON (e.id = q.exam_id)
    WHERE level = ? AND flag = ? AND q.id IS NOT NULL
    ORDER BY RAND()
    LIMIT 1
  ) i ON (q.exam_id = i.id)
  WHERE i.id = q.exam_id

Вы присоединяетесь к подзапросу как таблица в вашем запросе. Подзапрос выбирает один случайный элемент из таблицы экзаменов и сам включается в таблицу вопросов, чтобы убедиться, что некоторые вопросы существуют. Демо здесь: http://sqlfiddle.com/#!9/b394af/1

  • 0
    извините, когда я запускаю этот код каждый раз, покажу мне только один тип строк exam_id из таблицы вопросов
  • 0
    брат, можешь ли ты мне помочь больше, пожалуйста, я хочу, чтобы при каждом запуске моего кода показывались идентификаторы, которые были в таблице вопросов, например exan_id, но когда я каждый раз, когда я запускаю твой код, просто показываю мне один результат вместо случайных результатов
Показать ещё 3 комментария
0

Я хотел бы попробовать что-то вроде этого (опуская первую часть кода):

[...]

if($resultCount>0)
{
  while($row=$result->fetch_assoc())
  {   
    $list[]=$row['id'];
  }
  $query->close();
}

list2 = [];
while(count($list2) == 0){
  $query2 = $connect->prepare("SELECT * FROM questions WHERE exam_id=?");
  $query2->bind_param('i', $list[$array_rand($list, 1)]);
  $query2->execute();
  $question_result = $query2->get_result();
  if($question_result->num_rows > 0)
  {  
    while($questions_row = $question_result->fetch_assoc())
    {   
      $list2[] = $questions_row;
    }
  }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню