Intereting Posts
MySQL Вставить: сначала проверить? Как я могу запросить raw через Eloquent? Лучший способ обработки хранения / отображения дат в разных часовых поясах в PHP? Как передавать данные во все виды в Laravel 5? Мне нужно знать, что предопределенная точка находится в море или на земле Загрузка объекта из сеанса PHP вызывает вызов конструктора? Как правильно построить SQL-запрос в PHP-скрипте? Imagemagick desaturate black / white? preg_match (): Ошибка компиляции: значение символа в \ x {} или \ o {} слишком велико при смещении 27 по строке 25 Переменная PHP, определенная в «родительском» файле, не распознанная в «обязательном» файле Многоязычный сайт в Zend Framework Длительный фоновый скрипт PHP блокирует другие страницы PHP до тех пор, пока он не будет завершен Получить строку часового пояса пользователя с помощью Javascript / PHP? Проверка того, является ли класс подклассом другого PHP отправить электронную почту foreach – отправить

PDO bindParam issue

Возможный дубликат:
Могут ли выражения PHP PDO принимать имя таблицы в качестве параметра?

У меня есть функция в моем классе, которая делает некоторые проблемы. Здесь функция

function insert($table,$column = array(),$value = array()) { $array1 = implode(",", $column); $array2 = implode(",", $value); try { $sql = $this->connect->prepare("INSERT INTO :table (:date1) VALUES (:date2)"); $sql->bindParam(':table',$table, PDO::PARAM_STR); $sql->bindParam(':data1',$array1, PDO::PARAM_STR); $sql->bindParam(':data2',$array2, PDO::PARAM_STR); $sql->execute(); } catch(PDOException $e) { echo $e->getMessage(); } } 

Я вызываю функцию с помощью:

 -> insert('coupons',array('categorie','name','link','code','id'),array('test11','test','test','test','NULL')); 

Ошибка, которую я получаю:

Предупреждение: PDOStatement :: execute () [pdostatement.execute]: SQLSTATE [HY093]: недопустимый номер параметра: параметр не был определен в C: \ xampp \ htdocs \ MYFRAMEWORK \ lib \ database.class.php в строке 46

Строка 46:

 $sql->execute(); 

Так что теперь я действительно не вижу, где проблема. Любые указатели?

Solutions Collecting From Web of "PDO bindParam issue"

PDO связывают значения данных, а не имена таблиц и столбцов.

Вы неправильно понимаете использование привязок. Вы не можете связывать имена таблиц и столбцов с PDO. Вы связываете данные, чтобы вставить INTO в эти столбцы. Вам нужно построить SQL для включения имен таблиц и столбцов с использованием строковых операций.

Отформатируйте данные

Я переименовал ваши $ column и $ value в $ column_array, $ value_array, чтобы понять, что они собой представляют, и предположил, что каждый из них является простым массивом: $column_array = array('column1', 'column2', ...) etc.

 $placeholders = array_map(function($col) { return ":$col"; }, $column_array); $bindvalues = array_combine($placeholders , $value_array); 

$ placeholders теперь выглядит так:

 $placeholders = array( ':column1', ':column2', ... ); 

$ bindvalues ​​теперь выглядит следующим образом:

 $bindvalues = array( ':column1'=>'value1', ':column2'=>'value2', ... ); 

Сборка, подготовка, выполнение

 $sql = $this->connect->prepare("INSERT INTO $table (" .implode(",", $column_array) .") VALUES (". implode(",", $placeholders) . ")"; 

Это даст вам подготовленное заявление о форме:

 $sql = INSERT INTO table_name (column1, column2, ...) VALUES (:column1, :column2, ...) 

Затем вы можете выполнить подготовленный оператор и передать значения $ в качестве аргумента.

 $sql->execute($bindValues); 

Заметка:

  • Одно предостережение, о котором следует упомянуть. Убедитесь, что ваши исходные данные были дезинфицированы против SQL Injection. PDO позаботится об этом для связанных значений, но если вы создаете столбцы из, скажем, данных $ _POST, это уязвимо и нуждается в дезинфекции.

Запрос не сконструирован должным образом, values отсутствуют в кавычках.

Когда вы делаете imode, массив 2 выглядит,

  test1,test,test... //and so on. 

Он должен быть «test1», «test», «test» … для правильной привязки внутри запроса Insert .

 $sql = $this->connect->prepare("INSERT INTO :table (:date1) VALUES (:date2)"); 

Кроме того, у вас есть опечатки в именах параметров, date1 вместо data1 и data1 вместо data2 .