过去几个小时我一直在谷歌上搜索解决方案,但没有任何适合我的需要。这些insert array with keys如果数组具有与数据库列匹配的键 insert array,则有效如果列与值匹配(将每列绑定(bind)到一个值)以及其他类似但找不到适合我的情况的内容,则此方法有效。
我有一个通过 jquery 多重选择选项发布的数组,然后将其存储在 $eng
中并传递给一个函数。
这是var_dump $engstrong>(数组)的结果。
{ [0]=> array(3) { [0]=> string(5) "Games" 1=> string(5) "Music" 2=> string(4) "Walk" } }
该数组可以有 1 到 5 个值。全部取决于用户选择的内容。我想将这些值插入数据库中。
这是到目前为止我的代码,如果数组计数与我的表列匹配,它就可以工作,否则我会收到错误 Insert value list does not match column list
出于显而易见的原因,我需要在准备好的声明中提出任何建议,但我就是想不通。
public function addActivity($eng, $reqid)
{
$act = implode("','",array_values($eng[0]));
$query = $this->dbh->prepare("INSERT INTO reqactivity VALUES ('NULL','$reqid','$act')");
$query->execute();
var_dump($eng);
}
这是表结构
CREATE TABLE IF NOT EXISTS
reqactivity
(
id
int(12) NOT NULL AUTO_INCREMENT,
reqid
int(12) NOT NULL,
act1
varchar(15) NOT NULL,
act2
varchar(15) NOT NULL,
act3
varchar(15) NOT NULL,
act4
varchar(15) NOT NULL,
act5
varchar(15) NOT NULL,
PRIMARY KEY (id
) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;
最佳答案
废弃该表。
如果您有 phpMyAdmin,请打开表,转到操作,然后删除表。现在改为这样做:
CREATE TABLE IF NOT EXISTS reqactivity (
id int(12) NOT NULL AUTO_INCREMENT,
reqid int(12) NOT NULL,
activities varchar(250) NOT NULL
PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;
然后用它来插入您的事件。它们都位于一列中,并用逗号分隔。您不能只是将任何旧数据塞进任何旧列中,并希望有足够的或不要太多。
$query = $this->dbh->prepare("INSERT INTO reqactivity VALUES (NULL, :rid, :act)");
$query->execute(array(":rid"=>$reqid, ":act"=>$act));
不能将执行留空。请参阅手册上的 PDO。
替代方法
如果您想在不更改表的情况下完成这项工作,您需要以某种方式确保该数组始终具有恰好 5 个值。不多也不少。如果您能做到这一点,请按照 @aland 在其答案中的方式更改您的查询。
关于php将未知数量的值传递给mysql准备好的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26641895/