【问题标题】:How to call 2 stored procedures using mysqli如何使用 mysqli 调用 2 个存储过程
【发布时间】:2016-07-17 04:01:17
【问题描述】:

基本上我有一个带有 2 个选择下拉框的表单,我想用 2 个通过 php 返回所有值的存储过程填充选择。但是,似乎只有第一个选择框被填充,而第二个没有。 我已经测试了这两个存储过程,它们都可以正常工作。

<div class="form-group row">
  <label class="col-sm-2 form-control-label">Name</label>
  <div class="col-sm-10">
    <select class="form-control" name="pokemonName" style="width:30%;">
      <?php          
        require_once '../database/connection.php';
        $sqlNames = "CALL sp_selectAllPokemonName";
        $names = $con->query($sqlNames);
        while ($name = $names->fetch_assoc()){
          echo "<option value= '".$name['pokemonName']."'>".$name['pokemonName']."</option>";
        }
      //  $names->close();
      //  $con->close();
      ?>
    </select>
  </div>
</div>

<div class="form-group row">
  <label class="col-sm-2 form-control-label">Hour</label>
  <div class="col-sm-10">
    <select class="form-control" name="hour" style="width:30%;">
      <?php 
        // query doesn't work here
        require_once '../database/connection.php'; 
        $sqlHours = "CALL sp_selectAllHour";
        $hours = $con->query($sqlHours);
        while ($hour = $hours->fetch_assoc()){
          echo "<option value= '".$hour['Id']."'>".$hour['Id']."</option>";
        }
      ?>
    </select>
  </div>
</div>

连接.php

<?php
    require 'credentials.php';
    include '../ChromePhp.php';
    // Create connection
    //$con = mysqli_connect($servername, $username, $password, $dbname); // Procedural
    $con = new mysqli($servername, $username, $password, $dbname);

    // Check connection
    if ($con->connect_errno) {
        echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
        ChromePhp::warn('something went wrong!');
    }
?>

【问题讨论】:

  • mysqli 一次支持多个分号分隔的查询。
  • @Iceman,我知道这一点,但对我来说,这在逻辑上应该可行。我不明白为什么不是。在我从程序上切换到 OOP mysqli 之前它工作了

标签: php html mysqli


【解决方案1】:

这是摘自我的PDO tutorial,但原理适用于任何API:

任何程序员一开始都会偶然发现关于存储过程的一件事:每个存储过程总是返回一个额外的结果集:一个(或多个)带有实际数据的结果,一个只是空的。这意味着如果您尝试调用一个过程然后继续执行另一个查询,则会出现“在其他无缓冲查询处于活动状态时无法执行查询”错误,因为您必须先清除多余的空结果。

所以你必须使用mysqli_next_result 进入那个额外的结果集

只需致电$con-&gt;next_result() 即可解决问题。请注意,只有在从结果集中获取所有数据后才能调用它。

【讨论】:

  • 这成功了!我不可能在这么短的时间内自己偶然发现这一点。谢谢!
猜你喜欢
  • 2014-06-05
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多