我有一个像这样的数组
$a = array( 'phone' => 111111111, 'image' => "sadasdasd43eadasdad" );
当我执行 var-dump 时,我得到了这个 ->
{ ["phone"]=> int(111111111) ["image"]=> string(19) "sadasdasd43eadasdad" }
现在我尝试使用 IN 语句将其添加到数据库 -
$q = $DBH->prepare("INSERT INTO user :column_string VALUES :value_string");
$q->bindParam(':column_string',implode(',',array_keys($a)));
$q->bindParam(':value_string',implode(',',array_values($a)));
$q->execute();
我遇到的问题是内爆返回一个字符串。但是“电话”列是数据库中的整数,并且数组将其存储为整数。因此,我收到 SQL 错误,因为我的最终查询如下所示 --
INSERT INTO user 'phone,image' values '111111111,sadasdasd43eadasdad';
这是一个错误的查询。有什么办法可以解决吗?
我的列名称是基于用户想要插入的内容的动态名称。因此,我无法使用 :phone 和 :image 等占位符,因为我可能并不总是获得这两列的值。请告诉我是否有解决办法。否则我将不得不为每种类型的更新定义多个函数。
谢谢。
最佳答案
上次我检查时,不可能准备一个在准备时受影响的列未知的语句 - 但这似乎有效 - 也许你的数据库系统比我正在使用的数据库系统(主要是 postgres)更宽容
明显错误的是 implode() 语句,因为每个变量都应该由它自己处理,您还需要在插入语句中的字段列表周围加上括号。
要插入用户定义的字段,我认为您必须执行类似的操作(至少我是这样做的);
$fields=array_keys($a); // here you have to trust your field names!
$values=array_values($a);
$fieldlist=implode(',',$fields);
$qs=str_repeat("?,",count($fields)-1);
$sql="insert into user($fieldlist) values(${qs}?)";
$q=$DBH->prepare($sql);
$q->execute($values);
如果您不能信任 $a 中的字段名称,则必须执行类似的操作
foreach($a as $f=>$v){
if(validfield($f)){
$fields[]=$f;
$values[]=$v;
}
}
其中 validfields 是您编写的一个函数,用于测试每个字段名并检查它是否有效(通过创建关联数组 $valfields=array('name'=>1,'email'=>1, ' 来快速而肮脏地进行操作) phone'=>1 ...然后检查 $valfields[$f] 的值,或者(如我所愿)通过从服务器获取字段名称)
关于php - PDO PHP从关联数组插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25040820/