2012-02-11 9 views
0

私はこのSPを使用していますが、mysql workbenchを使用しているときに両方の結果を得ています。 PDO出力パラメータエラー

CREATE PROCEDURE SP(IN _start INT,IN _end INT,INOUT _count INT) 
BEGIN 

    SET _count = (SELECT COUNT(*) FROM tbl); 

    SET @qry = CONCAT('select * from tbl limit ', _start, ',', _end); 

    PREPARE stmt FROM @qry; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

END 

しかし、PDOを使用して、このエラー

$c=0; 
$stmt = $this->_dbc->getConnection()->prepare("CALL SP(0,10,:count)"); 
    $stmt->bindParam(":count",$c,PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT,0); 
    $stmt->execute(); 
    return $c; 
PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1414 OUT or INOUT argument 3 for routine db22.SP is not a variable or NEW pseudo-variable in BEFORE trigger 

を返す。しかし

$this->_dbc->getConnection()->prepare("CALL SP(0,10,**:count**)"); 

を変更するに

$this->_dbc->getConnection()->prepare("CALL SP(0,10,@count)"); 

にエラーを返さないのですが、常に取得していますカウントは0として

  1. カウントとカウントの違いは何ですか?
  2. pdoで正確なカウントを取得するにはどうすればよいですか?
+0

':count'はプリペアドステートメントのプレースホルダは、どんなライブラリによって記入されます/あなたがデータベースと話すために使用している言語。 '@ count'はデータベース側のサーバ変数です。 '@ count'が別のクエリによって以前に設定されていなかった場合、それはnullに評価されます。 –

+0

しかし、私はPHPマニュアルの準備文からの例に従っています。彼らは、mysqlカーソルから返された出力を取り出すためにプレースホルダだけを使用しています。 – DON

答えて

2

あなたは次の回避策を行うことができます:あなたはここで多くを見つけることができます

$dbh = $this->_dbc->getConnection() 
$stmt = $dbh->prepare("CALL SP(0,10,@count)"); 
$stmt->execute(); 

$sql = "SELECT @count AS count"; 
$stmt = $dbh->prepare($sql); 
$stmt->execute(); 

を:http://www.php.net/manual/en/pdo.prepared-statements.php#101993