2016-01-08 3 views
1

Я столкнулся с этой ошибкой при вставке новых данных в базу данныхВнимание: PDOStatement :: Execute(): SQLSTATE [HY093]

Предупреждение: PDOStatement :: Execute(): SQLSTATE [HY093]: Invalid параметр номер: число связанных переменных не соответствует числу маркеров в /opt/lampp/htdocs/projectclasses/DB.php на линии 47

кода методов:

public function query($sql, $params = array()) 
{ 
    $this->_error = false; 
    if($this->_query = $this->_pdo->prepare($sql)) 
    { 
     if(count($params)) 
     {    
      foreach($params as $param) 
      { 
       $x = 1; 
       $this->_query->bindParam($x, $param);     
       $x++; 
      } 

     } 
     if($this->_query->execute()) 
     { 
      $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ); 
      $this->_count = $this->_query->rowCount(); 
     } 
     else 
     { 
      $this->_error = true; 
     } 
    } 
    return $this; 
} 

public function insert($table, $fields = array()) 
{ 
    if(count($fields)) 
    { 
     $keys = array_keys($fields); 
     $values = ''; 
     $x = 1; 
     foreach($fields as $field) 
     { 
      $values .= "?"; 
      if($x < count($fields)) 
      { 
       $values .= ", "; 
      } 
      $x++; 
     } 

     $sql = "INSERT INTO users (`". implode('` ,`', $keys) ."`) VALUES (".$values.")"; 
     if(!$this->query($sql, $fields)->error()) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

Вставка кода:

$user = DB::getInstance()->insert('users', array(
    'username' => 'Marco', 
    'password' => '123456', 
    'salt' => 'salt' 
)); 
+0

эхо переменная $ sql, что вы видите? – Clay

+0

Пользователи INSERT INTO ('username',' password', 'salt') VALUES (?,?,?) –

ответ

0

Execute может принимать массив параметров, а затем связывание их по отдельности.

Итак, первое, удалите это:

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

Вы, вероятно, нужно использовать array_values, чтобы сделать это реальный массив, как это (если массив имеет ключи, то он будет пытаться связать с помощью клавиш):

if($this->_query->execute(array_values($params))) 

Это пример из документации РНР:

<?php 
/* Execute a prepared statement by passing an array of insert values */ 
$calories = 150; 
$colour = 'red'; 
$sth = $dbh->prepare('SELECT name, colour, calories 
    FROM fruit 
    WHERE calories < ? AND colour = ?'); 
$sth->execute(array($calories, $colour)); 
?> 

Источник:http://php.net/manual/en/pdostatement.execute.php

+0

Спасибо Клейтон, я очень благодарен вам –

Смежные вопросы