我有一个序列化数据列表,我将其反序列化并存储到数组中。
$employee_data = unserialize($entry, '63');
这将产生预期的输出:
数组([0] => Array([First] => Joe [最后] =>测试 [出生日期] => 2011年1月1日 ) [1] => Array([First] => Mike [最后] =>米勒 [出生日期] => 1980年1月1日 ) )
我一直试图使用foreach()或类似的东西将这些记录插入MySQL的表中,但未成功
$employee_array = array();
$k = 1;
for($n=0; $n<count($employee_data); $n++ ){
$employee_array['employee_first_name'.$k] = $employee_data[$n]['First'];
$employee_array['employee_last_name'.$k] = $employee_data[$n]['Last'];
$employee_array['employee_birthdate'.$k] = $employee_data[$n]['Birth Date'];
$SQL = "INSERT INTO employee_test (
employee_first_name,
employee_last_name,
employee_birthdate
)
VALUES (
'$employee_first_name.$k',
'$employee_last_name.$k',
'$employee_birthdate.$k'
)"
$k++;
};
数组中的每个员工都需要在表中输入新行,但是员工人数从1到10+不等
我们已经尝试
foreach($employee_array as $key => $value)
具有相同的结果。
我们希望得到的实际结果是SQL语句:
insert into employee_test(
employee_first_name,
employee_last_name,
employee_birthdate)
VALUES(
'Joe',
'Test',
'01/01/2011');
insert into employee_test(
employee_first_name,
employee_last_name,
employee_birthdate)
VALUES(
'Mike',
'Miller',
'01/01/1980');
答案 0 :(得分:0)
请记住,您的sql语句不会转义。例如,带有撇号的名称(如“ 0'neil”)将破坏您的sql。我还将使自己熟悉php的foreach:https://www.php.net/manual/en/control-structures.foreach.php。
我不确定要通过将索引添加到名称和sql值来确切地完成什么,但是我会这样做:
foreach($employee_data as $key => $value){
// $employee_array is not necessary
$employee_array[$key]['employee_first_name'] = $value['First'];
$employee_array[$key]['employee_last_name'] = $value['Last'];
$employee_array[$key]['employee_birthdate'] = $value['Birth Date'];
// Needs escaping
$SQL = "INSERT INTO employee_test (
employee_first_name,
employee_last_name,
employee_birthdate
)
VALUES (
'{$value['First']}',
'{$value['Last']}',
'{$value['Birth Date']}'
)";
echo $SQL;
};
答案 1 :(得分:0)
我想我知道您在这里想要做什么。您正在使用=
运算符,每次循环时都有效地将$SQL
设置为新值。如果您修改了代码,则每次都可以附加到$SQL
变量中。
//I used this array for testing. Comment this out
$employee_data = array(
0 => array(
"first" => "test",
"last" => "tester",
"birth date" => "01/01/1970"
),
1 => array(
"first" => "bob",
"last" => "david",
"birth date" => "02/02/1972"
),
);
//Start SQL as a blank string
$SQL = "";
//Do your iteration
foreach( $employee_data as $key=>$value ){
$first = $value['first'];
$last = $value['last'];
$birthDate = $value['birth date'];
//append this query to the $SQL variable. Note I use `.=` instead of `=`
$SQL .= "INSERT INTO employee_test(
`employee_first_name`,
`employee_last_name`,
`employee_birthdate`)
VALUES(
'$first',
'$last',
'$birthDate'
);";
}
//output the query
echo $SQL;
不过,有很多更简单的方法可以做到这一点。查看准备好的语句:)
答案 2 :(得分:0)
第一个实现将不能用作您调用变量而不是数组中键的方法。
select o.*
from (select o.*,
sum(case when o.pay_type in ('prepay', '10n30') then 1 else 0 end) over (partition by co.cust_id) as num_special,
sum(case when o.pay_type in ('standard') then 1 else 0 end) over (partition by co.cust_id) as num_standard
from cust_orders co join
order_info o
on co.orderid = o.order_id
where o.status = 'open'
) o
where num_standard > 0 and
num_special > 0;
应该是
'$employee_first_name.$k',
您还在for循环的每次迭代中创建SQL语句,因此在此实现中,只有最后一个雇员会保存。
我也看不出这样做的原因,无论如何,您最好只使用employee_data数组,并且$ k变量也可以变得多余。
$employee_array['employee_first_name'.$k]
我还没有测试过,但是应该可以给您一个想法。
您还会遇到用这种格式设置日期的问题,您的数据库可能需要使用yyyy / mm / dd格式的日期
最后,我不建议插入这样的值,请查看PDO library中的占位符。