【问题标题】:PHP +MySQL + Stored Procedure, how to obtain result of single "out" valuePHP + MySQL + 存储过程,如何获取单个“out”值的结果
【发布时间】:2014-10-14 13:40:10
【问题描述】:

我知道我的问题与this question 非常相似。这实际上更像是一个后续/持续的问题。

$db = new mysqli($host, $user, $pass, $database);

if($db->connect_errno > 0){
    die('Unable to connect to database [' . $db->connect_error . ']');
}
$db->query("SET @email  = " . "'" . $db->real_escape_string($recipient) . "'");
$db->query("SET @FormID   = " . "'" . $db->real_escape_string($list) . "'");
$db->query("SET @FieldName  = " . "'" . $db->real_escape_string($fieldName) . "'");
$db->query("SET @SubID  = " . "'" . $db->real_escape_string($action) . "'");
$db->query("SET @result = 2"); 

$rs = $db->multi_query("CALL EmailListCheck(@email, @FormID, @FieldName,@SubID, @result);SElect @result as result1");
if( $rs ) {
  $results = 0;
  do {
    if ($result = $db->store_result()) {
      printf( "<b>Result #%u</b>:<br/>", ++$results );
      while( $row = $result->fetch_row() ) {
        foreach( $row as $cell ) echo $cell, "&nbsp;";
      }
      $result->close();
      if( $db->more_results() ) echo "<br/>";
    }
  } while( $db->next_result() );
}

当我运行上面的代码时,我会收到以下结果集:

Result #1:
2 45 test_654@test.net 
Result #2:
0 

Result #1 它返回存储过程的中间部分。 SP 本身中的一个 select 语句,我需要禁止该语句。

我需要结果 #2 的返回值来继续我的脚本并确定如何继续。如何将 Result #2 中的值转换为可以使用的变量。

我也尝试关注这个example。当我尝试运行这部分代码时,它会返回 “获取失败:(2014) 命令不同步;你现在不能运行这个命令”

if(!$db->query("CALL EmailListCheck(@email, @FormID, @FieldName,@SubID, @result)"))
die("CALL failed: (" . $db->errno . ") " . $db->error);

// Fetch OUT parameters 
if (!($res = $db->query("SELECT @result AS result")))
    die("Fetch failed: (" . $db->errno . ") " . $db->error);
$row = $res->fetch_assoc();

// Return result
if($row['result'] == TRUE) {
    Echo 'WORKS';
}
else {
    return false;
} 

最后,我需要从存储过程中返回单个 OUT 值,但到目前为止一直没有成功。

【问题讨论】:

  • 在第一次查询后调用store_result()fetch_XXX函数,然后忽略结果。
  • @Barmar 谢谢。一直试图让它工作几个小时,这最终为我指明了正确的方向。

标签: php mysql stored-procedures mysqli


【解决方案1】:

根据@Barmar 评论中的建议,我添加了以下代码:$db->next_result();

完整代码如下。不确定这是否是最佳做法,但目前可行。

    if(!$db->query("CALL EmailListCheck(@email, @FormID, @FieldName,@SubID, @result)"))
die("CALL failed: (" . $db->errno . ") " . $db->error);

$db->next_result();

// Fetch OUT parameters 
if (!($res = $db->query("SELECT @result AS result")))
    die("Fetch failed: (" . $db->errno . ") " . $db->error);
$row = $res->fetch_assoc();

// Return result
if($row['result'] == TRUE) {
    Echo 'WORKS';
}
else {
    return false;
} 

【讨论】:

    猜你喜欢
    • 2012-07-26
    • 2010-09-08
    • 2011-06-23
    • 2011-07-24
    • 2016-03-27
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多