我有这样的数组
$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();
我遇到的问题是内爆返回一个字符串。但是“ phone”列是数据库中的整数,并且数组也将其存储为整数。因此,由于我的最终查询如下所示,因此出现了SQL错误-
INSERT INTO user 'phone,image' values '111111111,sadasdasd43eadasdad';
这是一个错误的查询。有没有解决的办法。
我的列名是动态的,基于用户要插入的内容。所以我不能使用诸如 :phone 和 :image之 类的占位符,因为我可能并不总是获得这两列的值。请让我知道是否有解决方法。否则,我将必须为每种更新类型定义多个功能。
谢谢。
上次检查时,无法准备一条语句,其中在准备时不知道受影响的列-但这似乎可行-也许您的数据库系统比我正在使用的数据库更宽容(主要是postgres)
implode()语句显然是错误的,因为每个变量都应由它自己处理,因此您还需要在insert语句中的字段列表周围加上括号。
要插入用户定义的字段,我认为您必须执行类似的操作(至少是我的操作方式);
$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]的值,或者(如我所愿)通过从服务器获取字段名称来检查)