我班上有个正在遇到麻烦的函数。这里的功能
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]:无效的参数编号:在第46行的C:\ xampp \ htdocs \ MYFRAMEWORK \ lib \ database.class.php中未定义参数
第46行是:
$sql->execute();
所以现在我真的看不出问题在哪里。有指针吗?
您误解了绑定的使用。您不能将表和列名称与PDO绑定。您绑定数据以将INTO插入这些列。您需要使用字符串操作构造SQL以包括表名和列。
我已将您的$ column和$ value重命名为$ column_array,$ value_array以清楚说明它们是什么,并假定每个都是简单数组: $column_array = array('column1', 'column2', ...) etc.
$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, ...)
然后,您可以执行准备好的语句并将$ values作为参数传递。
$sql->execute($bindValues);