如何将assoc数组插入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>
像这样的东西怎么样
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
}
然而,我会做一些验证来计算发布的值。
这就是您想要的!
$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);
我将更改传递数据的方式,在参数名称之前设置索引
<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
}
您需要使用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();
}
我假设你的名字和姓氏值在相同的索引上,但在不同的数组上,所以你可以使用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)