【发布时间】:2017-07-28 08:05:04
【问题描述】:
您好,我已经尝试了这两个问题的解决方案(最终目标添加在底部)
但我在 $fields 和 $newdata 中没有得到预期的变量内容
所以我请在这里打印一些 var_dump 并投射以请求您的支持。
我的数组来自一个 html 表格
为了简化我的学习实验,我使用了一个只有 5 个字段的虚拟表,如您所见:selected、user_id、user_name、user_company 和 user_email。
最后我只插入了 2 行值。
表格内容以 JSON.stringify 形式发布。
这是我的结果
正常使用
print_r ( $Arr );
我可以看到这个输出
Array (
[0] => Array ( [selected] => [user_id] => 3 [user_name] => nome3 [user_company] => azien3 [user_email] => email3 )
[1] => Array ( [selected] => 1 [user_id] => 6 [user_name] => nome6 [user_company] => azien6 [user_email] => email6 )
)
接下来我尝试应用上面两个问题的代码
24 $fields = implode(",", array_keys($Arr));
25 $newdata = "'" . implode("','", $Arr) . "'";
26
27 var_dump($fields);
28 echo "<br><br>";
29 var_dump($newdata);
但是我的解释或我的代码有问题,因为输出是
注意:第 25 行 D:\xampp\htdocs\ajax-json\post.php 中的数组到字符串转换 注意:第 25 行 D:\xampp\htdocs\ajax-json\post.php 中的数组到字符串转换 字符串(3)“0,1” string(15) "'数组','数组'"
你能指出什么是错的吗? 例如我的数组是否正确形成?
最终目标是构建一个查询,其中它们将从关联数组中获取的键名和键值直接绑定到用于 INSERT 到 mysql 表中的列和值。
换句话说,由于数组的键名与数据库表的列名相同,我想知道如何自动创建查询,就像本问题开头的两个问题一样。
使用“自动化”意味着拥有变量和可能循环来构建查询而不是编写单个列名称并且对于要插入的列值相同
编辑:从接受的答案来看,这是工作代码。
$my_keys = array_keys($Arr[0]);
// ---- This prevents PDO SQL Injection
$stmt=$pdo->prepare("DESC my_table");
$stmt->execute();
$whitelist_columns=$stmt->fetchAll(PDO::FETCH_COLUMN);
foreach($my_keys as $key){
if(!array_search($key,$whitelist_columns)){ echo "ERROR!"; }
}
// ---- End of prevention
$field_names = implode(",", $my_keys); // build column list
/** @JBH this foreach is needed otherwise the $q_markers will result not PDO placeholders like.
If this is missing, the query inserts all "" values, no matter if you'll adopt bindValue or bindParam**/
foreach($my_keys as &$key){
$key = ":".$key;
}
$q_markers = implode(",", $my_keys); // build PDO value markers
$stmt = $pdo->prepare("INSERT INTO my_table (".$field_names.") VALUES (".$q_markers.")");
foreach($Arr as $key => $val){
foreach($val as $bind_marker => &$bind_val){ /** @ JBH Without "&" here, it will work
only bindValue. Instead with "&", they work both bindParam and bindValue **/
$stmt->bindParam($bind_marker, $bind_val);
}
$stmt->execute();
}
【问题讨论】:
-
您对 $newdata 有什么期望?您正在尝试内爆两个数组,这是您无法做到的。您是否要内爆每个阵列? $Arr[0] 和 $Arr[1]?即使这样也不对。您不能内爆关联数组。请输入您希望看到的示例。
-
$Arr是一个多维数组。它的行为与您的预期不同。 -
嗯,最终目标是构建一个查询,其中它们将从关联数组中获取的键名和键值直接绑定到 mysql 表的列和值。换句话说,由于键名与数据库表的列名相同,我想知道如何自动创建查询,就像在顶部的两个链接中一样。
-
@JBH 感谢您的回复。我想要实现的是顶部两个链接中的答案。在此之上阅读我的评论。使用“自动化”意味着拥有变量和可能循环来构建查询而不是编写单个列名,并且对于要插入的列值也是如此