您好我已尝试过这两个问题解决方案(最终目标在底部添加)
但我没有在$ fields和$ newdata
中获得预期的变量内容所以我请在这里打印一些var_dump,然后请你帮忙。
我的数组派生自html表
为了简化我的学习实验,我正在处理一个只包含5个字段的虚拟表格,如您所见:selected
,user_id
,user_name
,{{ 1}}和user_company
。
最后我只插入了两行值。
表格内容发布为JSON.stringify。
这是你的结果
使用通常的
user_email
我可以看到这个输出
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 )
)
但是我的解释或我的代码中有些错误,因为输出是
Notice: Array to string conversion in D:\xampp\htdocs\ajax-json\post.php on line 25 Notice: Array to string conversion in D:\xampp\htdocs\ajax-json\post.php on line 25 string(3) "0,1" string(15) "'Array','Array'"
你能指出什么是错的吗? 例如我的阵列是否正确形成了?
最终目标是构建一个查询,在该查询中,它们将从关联数组中获取的键名和键值直接绑定到INSERT到mysql表的列和值。
换句话说,因为数组的键名与数据库表的列名相同,所以我想知道如何创建一个自动创建查询,就像在两个问题中一样。打开这个问题。
使用"自动化"用于构建查询INSTEAD的变量和周期比写单列名称和插入的列值相同
<小时/> 编辑:从接受的答案中,这是工作代码。
24 $fields = implode(",", array_keys($Arr));
25 $newdata = "'" . implode("','", $Arr) . "'";
26
27 var_dump($fields);
28 echo "<br><br>";
29 var_dump($newdata);
答案 0 :(得分:1)
您可以内爆关联数组,但不能内爆多维数组。这就是错误告诉你的内容。例如......
$my_array = array('a'=>'1', 'b'=>'2', 'c'=>'3');
echo "\n\n".implode(',',array_keys($my_array));
echo "\n\n".implode(',',$my_array)."\n\n";
结果......
a,b,c
1,2,3
但是...
$my_array = array(
array('a'=>'1', 'b'=>'2', 'c'=>'3'),
array('d'=>'4', 'e'=>'5', 'f'=>'6')
);
echo "\n\n".implode(',',array_keys($my_array));
echo "\n\n".implode(',',$my_array)."\n\n";
导致......
0,1
PHP Notice: Array to string conversion in /test.php on line 9
修复代码意味着处理各个数据元素。回声他们看起来像这样:
selected, user_id, user_name, user_company, user_email
,3,nome3,azien3,email3
1,6,nome6,azien6,email6
所以,基本代码看起来像......
$fields = implode(",", array_keys($Arr));
echo $fields."\n";
foreach($Arr as $key=>$val){
$newdata = "'" . implode("','", $Arr[$key]) . "'";
echo $newdata."\n";
}
PDO INSERT语句就像这样构建......
$my_keys = array_keys($Arr[0]);
$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!"; }
}
$field_names = implode(",", $my_keys); // build column list
$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){
$stmt->bindParam($bind_marker, $bind_val);
}
$stmt->execute();
}
请注意包含whitelist
变量的代码部分。该代码的目的是防止由于使用未绑定的列引用创建查询而导致的SQL注入。 PDO不允许您以与单元格数据相同的方式绑定列名称。为了保护自己,您必须证明传入的数据与表中的列匹配。如果他们不做,就做一些事情(echo "ERROR";
)。通常你想完全停止INSERT并在某处记录问题。
$my_keys = array_keys($Arr[0]);
$q_marks = array();
$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!"; }
array_push($q_marks, "?");
}
$field_names = implode(",", $my_keys); // build column list
$field_markers = implode(",", $q_marks);
$stmt = $pdo->prepare("INSERT INTO my_table (".$field_names.") VALUES (".$field_markers.")");
foreach($Arr as $key => $val){
$stmt->execute($val);
}
以上代码是使用不带bindParam
或bindValue
的PDO的示例。它有一个价格,但通常没有实际成本。 bindParam
和bindValue
允许您专门识别数据类型。 E.G.,bindParam('myval', $myval, PDO::PARAM_INT)
。如上所述传递变量时,您无法执行此操作。大多数情况下,这是一个非问题,因为PHP正确识别数据类型。当PHP确实变得混乱时(或者如果您只是想检查数据是否符合预期),那么您必须使用bindParam
或bindValue
。