2016-09-02 15 views
0

私は、製品に関連する情報を含むデータベース内に格納された製品テーブルを持っています。最大量の行を取得するストアドプロシージャがあります。クエリはmysqlで動作しますが、php sqlの呼び出しでは機能しません

私はそのストアドプロシージャをPHPから呼び出すときはいつでも、私は同じクエリをmysqlコンソールで実行している間、それは私に行を返す間falseを返します。

PHPコード:

$resVal=$mysqli->query('CALL get_max_quant_rows("'.$company.'","'.$type.'","'.$limit.'")'); 
$countVal=$resVal->fetch_row(); 
$countVal=$countVal[0]; 
$results = $mysqli->query('CALL get_max_quant_rows("'.$company.'","'.$type.'","'.$limit.'")'); 
var_dump('CALL get_max_quant_rows("'.$company.'","'.$type.'","'.$limit.'")'); 
var_dump($results); 

上記のクエリのvar_dumpの出力に含まは私を与える:私はあなたのクエリののvar_dumpを示している

string(72) "CALL get_max_quant_rows("1471941595186287666657bc0bdb1c25d","Cakes","1")" bool(false) 

値であることを示すこととして、ストアドプロシージャ内を完全に移動します。

SQL console

私は、コンソール内の同じクエリを実行したとき、それが走り、それが私に与えたこの動作の考えられる理由を、PEができresults.What?

ストアドプロシージャ:

DELIMITER $$ 

USE `dboxyz`$$ 

DROP PROCEDURE IF EXISTS `get_max_quant_rows`$$ 

CREATE PROCEDURE `get_max_quant_rows`(company VARCHAR(8000),product_type VARCHAR(8000),limiter INT) 
BEGIN 
DECLARE emptyCheckFirst BIT; 
DECLARE emptyCheckSecond BIT; 
SET emptyCheckFirst=`dboxyz`.isNullOrEmpty(company); 
SET emptyCheckSecond=`dboxyz`.isNullOrEmpty(product_type); 
IF (emptyCheckFirst=0 AND emptyCheckSecond=0) 
THEN 
    SELECT p1.id,p1.price,p1.product_code,p1.product_name,p1.quantity,p1.amount,p1.companyId FROM products p1 
INNER JOIN (SELECT product_code,MAX(quantity) max_quantity FROM products WHERE companyId=company AND `type`=product_type 
GROUP BY product_code) p2 ON p1.product_code=p2.product_code AND p1.quantity=p2.max_quantity LIMIT limiter; 
END IF; 
IF emptyCheckFirst=1 AND emptyCheckSecond=1 
THEN 
    SELECT p1.id,p1.price,p1.product_code,p1.product_name,p1.quantity,p1.amount,p1.companyId FROM products p1 
INNER JOIN (SELECT product_code,MAX(quantity) max_quantity FROM products 
GROUP BY product_code) p2 ON p1.product_code=p2.product_code AND p1.quantity=p2.max_quantity LIMIT limiter; 
END IF; 
    END$$ 

DELIMITER ; 

更新:DB同期のうち

コマンドによって与え エラー。あなたは今

DELIMITER $$ 

USE `dboxyz`$$ 

DROP FUNCTION IF EXISTS `isNullOrEmpty`$$ 

CREATE FUNCTION `isNullOrEmpty`(xx VARCHAR(8000)) RETURNS BIT(1) 
BEGIN 
    DECLARE somevariable VARCHAR(8000); 
    SET somevariable=xx; 
    IF (somevariable IS NOT NULL AND LEN(somevariable)>0) 
    THEN 
    RETURN 0; 
    ELSE 
    RETURN 1; 
    END IF; 
    END$$ 

DELIMITER ; 
+1

を、その後、クエリが失敗しました。 DBが** WHY **失敗したことを教えてもらう: 'if($ result === false){die(mysqli_error($ mysqli)); } ' –

+0

これをmysqlでタグ付けしたので、' dbo'ビジネスは何ですか?これはMSSQLであり、mysqlにはisnullorempty関数がありません。 –

+0

@MarcBは私の質問を更新しました。 –

答えて

1

MySQLのストアドプロシージャが複数の結果セットを返すことができ、このコマンドを実行することはできません、それはすべての結果は、前と同じ接続を使用して、別のクエリを実行クリアする理由です。

だけnext_resultを使用して、別のクエリを実行します。あなたはfalseを取得する場合

$results = $mysqli->query("CALL stored_procedure()");  

$mysqli->next_result(); 

$results2 = $mysqli->query("CALL another_stored_procedure()");  
関連する問題