Невозможно отобразить несколько запросов на одной странице - PullRequest
1 голос
/ 06 января 2012

Я недавно начал изучать подготовленные операторы и начал настраивать мои сценарии в новом стиле.

Однако я наткнулся на маленькую стенку и надеюсь, что кто-нибудь может указать мне правильное направление?

Вот моя структура SQL-запроса:

$query = "SELECT `results`, `Success`, `Failure`, `Counter`, `Grades`, `Classes`,
`Special_Id`, `SpecialCondition` FROM `Courses` INNER JOIN `Students` ON `id` = 
`Students_Id` JOIN `Conditions` ON `id` = `Special_Id`";

$stmt = $Mconn->prepare($query);
$stmt->bind_result($results, $success, $failed, $counter, $grades, $classes,
$specialId, $specialcondition);
$stmt->execute();
$stmt->store_result();

А вот один блок кода:

<?php

echo "<select = \"SpecialConditions\">";
if($stmt->num_rows == NULL){
  echo "No results found.";
}else{
  while($stmt->fetch()){

   echo "<option value=\"$specialId\">$specialcondition</option>";
}
}
echo "</select>";
?>

И еще один блок кода:

<?php
echo "<select = \"Grades\">";
if($stmt->num_rows == NULL){
  echo "No results found.";
}else{
  while($stmt->fetch()){

      echo "<option value=\"".$grades."\">".$grades."</option>";
  }
}
echo "</select>";

?>

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

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

Теперь я знаю, что соединение с БД работает, и я знаю, что возвращенные результаты на самом деле сохраняются, потому что, если я проверяю каждый блок на отдельной странице, он работает так, как должен.

Заранее благодарю за помощь.

Ответы [ 2 ]

4 голосов
/ 06 января 2012

Вы должны закрыть операторы , когда вы закончите с ними

$stmt->close();

Вы не можете начать другой подготовленный оператор, пока другой еще не выполнен, даже если вы получили всеего данных.

1 голос
/ 07 января 2012

Хорошо, наконец-то я получил его на работу.Все должно храниться в массиве и извлекаться, как кажется.По крайней мере, это единственный способ заставить его работать должным образом.

Вот окончательное решение на тот случай, если кому-то будет любопытно или ударит эту стену в будущем.Если вы знаете способ, который не требует этого метода, пожалуйста, сообщите мне.

Моя динамическая функция, которая соединяет и запрашивает базу данных:

<?php

function DB_Query(){
$databasefields = array();
$results = array();

@$Mconn = new mysqli(DBHOST, DBUSER, DBPWRD, DBNAME);

   if (!@mysqli_connect(DBHOST, DBUSER, DBPWRD, DBNAME)){
     die(DBERROR);
   }

$query = "SELECT `results`, `Success`, `Failure`, `Counter`, `Grades`, `Classes`,
`Special_Id`, `SpecialCondition` FROM `Courses` INNER JOIN `Students` ON `id` =
`Students_Id` JOIN `Conditions` ON `id` = `Special_Id`";

$stmt = $Mconn->prepare($query);
$stmt->execute();
$meta = $stmt->result_metadata();

while($field = $meta->fetch_field()){
$databasefields[] = &$row[$field->name];
}

call_user_func_array(array($stmt, 'bind_result'), $databasefields);
while($stmt->fetch()){
  $queried = array();
  foreach($row as $key => $vector){
       $queried[$key] = $vector;
  }

  $results[] = $queried;
}

 return $results;
}

$results = DB_Query();  // placed in DB include file
?>

А вот код, который я используюфактически отображать данные по отдельности или в нескольких блоках.Просто измените имя поля, чтобы оно соответствовало вашему.Функция является динамической и не требует жесткого кодирования любых результатов привязки, поэтому вы можете выбрать любое количество полей.

<?php
foreach($results as $row){
echo $row['grades'].'<br />';
}

Спасибо за помощь и надеюсь, что это поможет тем, ктостолкнулся с той же проблемой, что и я.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...