将$ _POST关联数组插入数据库PHP

时间:2015-11-13 09:40:28

标签: php mysql arrays

如何通过将关联数组插入MySQL数据库来实现。

当我print_r($_POST)时,我明白了:

Array
(
    [first_name] => Array
        (
            [0] => James
            [1] => Will
            [2] => Jackie
        )

    [last_name] => Array
        (
            [0] => Bond
            [1] => Smith
            [2] => Chan
        )
)

我的想法是这样的。

INSERT INTO actors(first_name, last_name) VALUES ('val1','val2'), ('val1','val2'), ('val1', ....

或类似的东西。

$sql="INSERT INTO actors(first_name, last_name)VALUES(:first_name,:last_name)";
$stmt=$db->prepare($sql);
$stmt->bindValue(':first_name', $_POST['first_name']);//Here I get a "Array to string conversion" error 
$stmt->bindValue(':last_name', $_POST['last_name']);// Here I get a "Array to string conversion" error

foreach($_POST as $row){
$stmt->execute($row);//Here I get a "PDOStatement::execute() expects parameter 1 to be array, string given" error
}

我知道有很多类似的问题,我已经查看了所有问题并尝试了我能理解的问题。

以下是我尝试用来发布到数据库的html表单:

<form method="post">
    <input type="text" name="first_name[]" placeholder="First Name"/>
    <input type="text" name="last_name[]" placeholder="Last Name"/>
    <input type="text" name="first_name[]" placeholder="First Name"/>
    <input type="text" name="last_name[]" placeholder="Last Name"/>
    <input type="text" name="first_name[]" placeholder="First Name"/>
    <input type="text" name="last_name[]" placeholder="Last Name"/>
    <input type="submit" name="add_actor" value="Submit"/>
</form>

5 个答案:

答案 0 :(得分:3)

这样的东西

foreach($_POST["first_name"] as $k=>$v){

  $f_name = $v;
  $l_name = $_POST["last_name"][$k];

  $sql="INSERT INTO actors(first_name, last_name)VALUES($f_name, $l_name)";
  // James Bond
}

我会做一些验证来计算发布的值。

答案 1 :(得分:1)

这就是你想要的!

$sql="INSERT INTO actors(first_name, last_name)VALUES";

do{
    $actors_name = array_shift($_POST['first_name']);
    $actors_surname = array_shift($_POST['last_name']);
    if($actors_name || $actors_surname)
        $sql.="(".mysqli_real_escape_string($actors_name).",".
                mysqli_real_escape_string($actors_surname)."),";
}
while($actors_name || $actors_surname);

//CUT LAST COMMA FOR A CORRECT QUERY
$sql = substr($sql, 0, -1);

答案 2 :(得分:0)

我将更改传递数据的方式,在参数名称

之前设置索引
<form method="post">
    <input type="text" name="[0][first_name]" placeholder="First Name"/>
    <input type="text" name="[0][last_name]" placeholder="Last Name"/>
    <input type="text" name="[1][first_name]" placeholder="First Name"/>
    <input type="text" name="[1][last_name]" placeholder="Last Name"/>
    <input type="text" name="[2][first_name]" placeholder="First Name"/>
    <input type="text" name="[2][last_name]" placeholder="Last Name"/>
    <input type="submit" name="add_actor" value="Submit"/>
</form>

现在您可以正确执行语句:

foreach($_POST as $row){
$stmt->execute($row);//Here I get a "PDOStatement::execute() expects parameter 1 to be array, string given" error
}

答案 3 :(得分:0)

我假设您的名字和姓氏值在相同的索引上但在不同的数组上,因此您可以使用array_map函数将它们连接起来,如

$array1 = array('first' => array('basheer','salman'));
$array2= array('lastname' => array('kahn','ali'));

$result_array = array();

array_map('concate', $array1, array_values($array2));
function concate($array1, $array2){
    global $result_array;
    foreach($array1 as $key => $val) {
        $result_array[] = '(' . $val . ',' . $array2[$key] . ')';
    }
}
print_r(implode(',',$result_array));//(basheer,kahn),(salman,ali)

你的SQL查询看起来像什么

INSERT INTO actors(first_name, last_name) VALUES implode(',', $result_array)

答案 4 :(得分:0)

你需要使用for循环来统一迭代数组。这里很简单的东西。 $i是一个递增的整数,因此它总是选择下一个增量行。 1问题是,如果任何字段留空,索引将在一侧出现故障,因此这种设计在跳转时存在缺陷。

$sql="INSERT INTO actors(first_name, last_name)VALUES(:first_name,:last_name)";

$num_rows = count($_POST['first_name']) + count($post['last_name']) / 2;

for($i=0;$i<$num_rows;$i++)
{   
    $stmt=$db->prepare($sql);
    $stmt->bindValue(':first_name', $_POST['first_name'][$i]);
    $stmt->bindValue(':last_name', $_POST['last_name'][$i]);
    $stmt->execute();
}
相关问题