如何通过将关联数组插入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>
答案 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();
}