2012-02-11 6 views
0

Я использую этот SP, я получаю оба результата при использовании workbench mysql.Ошибка параметра вывода 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. В чем разница между: count и @count?
  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