1

MySQL からストアド プロシージャを呼び出して、2 つの OUT パラメータ (@eset と @leng) を取得しようとしています。これら 2 つのパラメーターを JavaScript にエコー バックして、結果を待っている XMLHttpRequest を用意します。

私はこのエラーが発生しています:

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;
?>
4

1 に答える 1

0

ストアド プロシージャの最初の引数が VARCHAR であると想定しているため、最初の問題は$q、クエリで引用符なしで変数を渡していることです。次のようになります。

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

また、SELECT 呼び出しを 2 回行う必要はありません。1 回だけ実行してください。

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();
    }
}
于 2012-12-06T10:28:05.183 に答える