2014-02-11 3 views
0

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[07002]: [Microsoft][SQL Server Native Client 11.0]COUNT field incorrect or syntax error' in .../db.php:46 Stack trace: #0 .../db.php(46): PDOStatement->execute() #1 .../tests/testDb.php(12): ReportsDB->runSP('CALL ...', Array) #2 {main} thrown in .../db.php on line 46'PDOException' с сообщением 'SQLSTATE [07002]: [Microsoft] [Client Native SQL Server 11,0] COUNT поле неправильно или ошибка синтаксиса' в .../db.php: 46

Я получаю это ошибка на некотором коде, над которым я работаю. У меня возникают проблемы с отладкой этого сообщения об ошибке.

Вот что такое инкапсулирующая линия 46 (я выделим фактическую строку).

public function runSP ($sp, array $args) { 

    $returnParams = array(); 

    if ($sp) { 

     $s = explode(" ", $sp); 
     if ($s[0] != "CALL") { 
      $sp = "CALL " . $sp; 
     } 

     $stmt = $this->_db->prepare($sp); 

     if (sizeof($args) > 0) { 

      for ($i = 0; $i > sizeof($args); $i++) { 

       $stmt->bindParam($i, $args[$i]["value"], $args[$i]["type"]); 

       $t = explode("|", $args[$i]["type"]); 
       if ($t[1] == "PDO::PARAM_INPUT_OUTPUT") { 
        $returnParams[] = $args[$i]["value"]; 
       } 
      } 

Line 46  $stmt->execute(); 

      return $returnParams; 

    } else { 

    } 

} 

ответ

0

Я сделал это раньше и также имел ту же ошибку. Вот как я решаю свою проблему.

1.) Взгляните на ваш запрос. Убедитесь, что вы не вызываете имена столбцов, которые на самом деле не существуют на вашей таблице.

2.) Число имен столбцов и количество заполнителей должны совпадать.

3.) В вашем цикле for вместо инициализации счетчика ($ i) до 0 инициализируйте его 1. Таким образом, вы говорите, что на первой итерации цикла вы привязываете первое значение array ($ args [$ i-1] ["value"]) к первому заполнителю по вашему запросу. Так должно быть:

for ($i = 1; $i <= count($args); $i++){ 
      $stmt->bindParam($i, $args[$i - 1 ]["value"], $args[$i - 1]["type"]); 
} 

Надеюсь, это поможет. Это сработало для меня. Удачи.