Неверный номер параметра: количество связанных переменных не соответствует количеству токенов

Я только учусь использовать PHP PDO и имею следующую проблему:

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

Ошибка относится к этому коду:

if( $this->_query->execute() ){

Вот мой код:

public function query($dbUse='', $sql, $params = array(), $datatypes = array(), $orderby='', $limit=''){
$this->_error = false; //always first initialize to false

/* Check which DB will be used */
$this->_pdo = $this->_pdoPostgres;

$FlagSelectWithCount = ( substr($sql, 0, 6) == 'SELECT' ? true : false );

if( $FlagSelectWithCount ){ // received SELECT statement
if( $this->_query = $this->_pdo->prepare( "SELECT COUNT(*) as computedrow FROM ( {$sql} ) AS X", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL) ) ){

$x = 1;
if( count($params) ){
foreach($params as $param){
$this->_query->bindValue($x, $param);
$x++;
}
}

if( $this->_query->execute() ){
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);

foreach ($this->_results as $obj){
$this->_count = $obj->computedrow;
}

if($this->_count){
if( $this->_query = $this->_pdo->prepare( $sql . $orderby , array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL) ) ){

$x = 1;
if( count($params) ){
foreach($params as $param){
$this->_query->bindValue($x, $param);
$x++;
}
}
if( $this->_query->execute() ){
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
}else {
$this->_error = true;
}
}
}
else{
$this->_count = 0;
}

//$rows = $this->_query->fetchColumn();
//$this->_count = count($rows); //for select

} else {
$this->_error = true;
}
}
}
else{

if( $this->_query = $this->_pdo->prepare( $sql ) ){

$x = 1;
if( count($params) ){

foreach($params as $param){
$this->_query->bindValue($x, $param, $datatypes[$x-1]);

$x++;
}
}
//$this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//$this->_pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

if( $this->_query->execute() ){
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
$this->_count = $this->_query->rowCount();
} else {
$this->_error = true;
}
}
}
/*
if( substr($sql, 0, 6) == 'SELECT' ){
$sql = "SELECT COUNT(*) FROM ( {$sql} ) AS X";
}

//$sql = "SELECT * FROM user_profile WHERE user_name='husni'";
if( $this->_query = $this->_pdo->prepare( "SELECT COUNT(*) FROM ( {$sql} ) AS X", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL) ) ){
//echo "SELECT COUNT(*) FROM ( {$sql} ) AS X";
$x = 1;
if( count($params) ){
foreach($params as $param){
$this->_query->bindValue($x, $param);
$x++;
}
}

if( $this->_query->execute() ){

$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
echo $rows = $this->_query->fetchColumn();
echo ' tryCount'.count($rows);
$this->_count = count($rows); //for select
//echo ' countReturned--'.$this->_count = $this->_query->rowCount(); //for other than select
//echo '--';
} else {
$this->_error = true;
}
}
*/

return $this;
}

-1

Решение

Это означает, что у вас меньше вопросительных знаков (неназванных токенов) в вашем $ SQL строка, чем элементы в $ пары массив передан в вашу функцию.

Вы можете добавить этот тест в ваш код, который будет выводить сообщение, когда они не равны:

if (substr_count($sql, "?") != count($param)) {
printf ("Error: SQL has %d tokens, while %d parameters were provided.",
substr_count($sql , "?"), count($param));
}

Тест не является пуленепробиваемым, потому что у вас могут быть вопросительные знаки в строковых литералах: они будут ошибочно подсчитаны.

Но это может служить своей цели в отладке вашего кода.

NB: Вы можете написать свои циклы, используя $x =>

как это:

foreach($params as $x => $param){
$this->_query->bindValue($x+1, $param);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector