PHP如何从关联数组中为mysql查询提取键名和值

时间:2017-07-28 08:05:04

标签: php mysql arrays

您好我已尝试过这两个问题解决方案(最终目标在底部添加)

INSERT array - PDO

Binding values from arrays?

但我没有在$ fields和$ newdata

中获得预期的变量内容

所以我请在这里打印一些var_dump,然后请你帮忙。

我的数组派生自html表

为了简化我的学习实验,我正在处理一个只包含5个字段的虚拟表格,如您所见:selecteduser_iduser_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);

1 个答案:

答案 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);
}

以上代码是使用不带bindParambindValue的PDO的示例。它有一个价格,但通常没有实际成本。 bindParambindValue允许您专门识别数据类型。 E.G.,bindParam('myval', $myval, PDO::PARAM_INT)。如上所述传递变量时,您无法执行此操作。大多数情况下,这是一个非问题,因为PHP正确识别数据类型。当PHP确实变得混乱时(或者如果您只是想检查数据是否符合预期),那么您必须使用bindParambindValue