2012-12-05 63 views
1

我试图从MySQL调用存储过程并取回两个OUT参数(@eset和@leng)。我想将这两个参数回显给JavaScript,其中我有一个XMLHttpRequest等待结果。通过PHP调用MySQL存储过程时出错

我得到这个错误:

Strict standards: mysqli::next_result(): There is no next result set. 

这里是我的代码:

<?php 


//get the q parameter from URL 
$q=$_GET["q"]; 
$eset= ""; 
$length= 0; 

// Opens a connection to a MySQL server 

$db= new mysqli('localhost', 'db_name', 'pass'); 
if (!$db) { die('Not connected : ' . mysql_error());} 

// Set the active MySQL database 

$db_selected = $db->select_db('db_name'); 
if (!$db_selected) { 
    die ('Can\'t use db : ' . mysql_error()); 
} 

// Select all the rows in the markers table 

$db->multi_query("CALL mst2($q, @eset, @leng);SELECT @eset as eset;SELECT @leng as length"); 
$db->next_result();   // flush the null RS from the call 
$eset=$db->store_result();  // get the RS containing the id 
//echo $eset->fetch_object()->eset, "\n"; 
$length= $db->store_result(); 
//echo $length->fetch_object()->leng, "\n"; 
$response= $eset.$length; 
//$eset->free(); 
//$length->free(); 


    //$response=str_shuffle($q); 

//output the response 
echo $response; 
?> 

回答

0

我假设你的存储过程的第一个参数是VARCHAR,所以第一个问题是你正在传递查询中不带引号的$q变量。它应该是这样的:

$db->multi_query("CALL mst2('$q', @eset, @leng); SELECT @eset as eset; SELECT @leng as length"); 

而且,你不需要进行两次,选择通话,这样做只有一次:

SELECT @eset AS eset, @leng AS leng; 

不用说,用户输入不应该是可信的。您应该使用准备好的语句:

if (($stmt = $db->prepare("CALL mst2(?, @eset, @leng)"))) { 
    $stmt->bind_param("s", $q); 
    $stmt->execute(); 
    $stmt->close(); 

    if (($res = $db->query("SELECT @eset AS eset, @leng AS leng"))) { 
     list($eset, $leng) = $res->fetch_array(); 
     $result = $eset.$length; 
     echo $result; 

     $res->free(); 
    } 
}