无法在同一页面上显示多个查询

时间:2012-01-06 17:29:24

标签: php mysql prepared-statement

我最近开始学习Prepared Statements并开始使用新样式配置我的脚本。

然而,我碰到了一堵小墙,我希望有人可以指出我正确的方向?

这是我的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 个答案:

答案 0 :(得分:4)

完成后,您必须close the statements

$stmt->close();

即使您已经提取了所有数据,也无法启动另一个准备好的声明,而另一个声明尚未完成。

答案 1 :(得分:1)

很好,我终于开始工作了。一切都需要存储在一个数组中,并通过它看起来提取。至少这是我让它正常工作的唯一方法。

这是最终的解决方案,以防万一有人好奇或将来撞到这堵墙。如果你知道一种不需要这种方法的方法,请告诉我。

我的动态函数连接并查询数据库:

<?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 />';
}

感谢所有的帮助,我希望这可以帮助那些遇到同样问题的人。