Возможный дубликат:
Могут ли выражения 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();
Так что теперь я действительно не вижу, где проблема. Любые указатели?
Вы неправильно понимаете использование привязок. Вы не можете связывать имена таблиц и столбцов с 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);
Запрос не сконструирован должным образом, 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
.