За последние 24 часа нас посетили 17923 программиста и 1610 роботов. Сейчас ищут 917 программистов ...

Ошибка с PDO. Пишет SQLSTATE[HY093]

Тема в разделе "Прочие вопросы по PHP", создана пользователем Oleg_php, 1 авг 2012.

  1. Oleg_php

    Oleg_php Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    80
    Симпатии:
    0
    Есть методы в классах.

    Код (Text):
    1. class PDO_MSQL
    2. {
    3.          private static $instance;       // ссылка на экземпляр класса        
    4.  
    5.         //
    6.         // Получение единственного экземпляра (одиночка)
    7.         //
    8.         public static function Instance() {
    9.             if (self::$instance == null)
    10.                 self::$instance = new PDO_MSQL();
    11.  
    12.             return self::$instance;
    13.         }
    14.  
    15.        
    16.         //
    17.         // Конструктор
    18.         //
    19.         public function __construct()
    20.         {
    21.             global $dbh;
    22.             $this->dbh = $dbh;
    23.         }
    24.  
    25.        
    26.     ......
    27.     //
    28.     // Вставка строки 
    29.     //
    30.     public function Insert($table, $object)
    31.     {
    32.        $columns = array();
    33.        $values = array();
    34.    
    35.         foreach ($object as $key => $value)
    36.         {
    37.             $columns[] = $key;
    38.            
    39.             if ($value === null)
    40.             {
    41.                 $values[] = 'NULL';
    42.             }
    43.             else
    44.             {
    45.                 $values[] = "'$value'";
    46.             }
    47.         }
    48.        
    49.        $columns_s = implode(',', $columns);
    50.        $values_s = implode(',', $values);
    51.  
    52.        // Подготавливаем строку для Insert
    53.        $this->dbh->prepare("UPDATE $table SET $columns_s")->execute(array($values_s));      
    54.        }
    55.    
    56.        .....
    57. }
    и Метод класса M_Structure

    Код (Text):
    1.  
    2. class M_Structure extends M_Base {    
    3.     private static $instance;       // ссылка на экземпляр класса
    4.     private $msql;                  // драйвер БД
    5.     private $dbh;
    6.    
    7.    
    8.     //
    9.     // Получение единственного экземпляра (одиночка)
    10.     //
    11.     public static function Instance(){
    12.         if (self::$instance == null)
    13.             self::$instance = new M_Structure();
    14.  
    15.         return self::$instance;
    16.     }
    17.    
    18.     //
    19.     // Конструктор
    20.     //
    21.     public function __construct(){
    22.         global $dbh;
    23.         $this->msql = PDO_MSQL::Instance();
    24.         $this->dbh = $dbh;        
    25.     }  
    26.    
    27.     .......  
    28.    
    29.     //
    30.     // Добавление новой страницы
    31.     public function AddStructure($title,$description,$keywords,$date,$text,$translit){
    32.        
    33.             // Прибавляем еденицу к сорту
    34.             $Sort_Last = $Sort_Last['s_sort']+1;
    35.            
    36.             // Объект вставки
    37.             $object = array();
    38.             $object['s_title=?'] = $title;
    39.             $object['s_description=?'] = $description;
    40.             $object['s_keywords=?'] = $keywords;
    41.             $object['s_date=?'] = $date;
    42.             $object['s_text=?'] = $text;
    43.             $object['s_translit=?'] = $translit;
    44.             $object['s_sort=?'] = $Sort_Last;  
    45.            
    46.             $this->msql->Insert('Structure', $object);
    47.     }
    48.    
    49.     .....
    50. }
    При выполнениии всегда пишет ошибку
    Код (Text):
    1.  
    2. Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in (Путь до фаила / PDO_MSQL.php)
    Аргументы передаются в равном соотноошении.
    В чём может быть ошибка?
     
  2. ваяс

    ваяс Активный пользователь

    С нами с:
    8 июн 2012
    Сообщения:
    99
    Симпатии:
    0
    Вы используете параметризированые запросы, а параметров нет. Подставьте
    Код (Text):
    1. ?
     
  3. Oleg_php

    Oleg_php Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    80
    Симпатии:
    0
    Как параметров нет. Они передаются в ассоциативный массив после foreach'ем я делю их на строки таблицы и значения которые надо вставить.
     
  4. ваяс

    ваяс Активный пользователь

    С нами с:
    8 июн 2012
    Сообщения:
    99
    Симпатии:
    0
    $columns_s Что у вас сюда приходит??
     
  5. Professor

    Professor Активный пользователь

    С нами с:
    2 янв 2008
    Сообщения:
    121
    Симпатии:
    0
    Адрес:
    г. Одесса, Украина
    Код (Text):
    1. var_dump($columns_s);
    2. var_dump($columns_s);
    перед
    Код (Text):
    1. // Подготавливаем строку для Insert
    2.        $this->dbh->prepare("UPDATE $table SET $columns_s")->execute(array($values_s));  
    Сделайте пожалуйста, и покажите результат
     
  6. Oleg_php

    Oleg_php Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    80
    Симпатии:
    0
    Всё решено. НАписал метод в итоге:

    Код (Text):
    1.  
    2. public function Insert($table, array $object)
    3.     {
    4.        $columns_s = implode(',', array_keys($object));
    5.        
    6.        //
    7.        // Подготавливаем строку для INSERT
    8.        $ResultInsert = $this->dbh->prepare("INSERT INTO $table SET $columns_s")->execute(array_values($object));
    9.        
    10.        //
    11.        // Возвращаем значение
    12.        return ($ResultInsert == true) ? (true) : false;
    13.     }
    Может кому пригодится. А в $object это ассоциативный массив с ключём строки таблицы и со значением которое надо вставить.
     
  7. Professor

    Professor Активный пользователь

    С нами с:
    2 янв 2008
    Сообщения:
    121
    Симпатии:
    0
    Адрес:
    г. Одесса, Украина
    Конечно же надо было
    Код (Text):
    1. var_dump($columns_s);
    2. var_dump($values_s);
    Но сути это не меняет. У тебя скорее всего было разное количество элементов в массиве