通过$ SQL输出遍历数组值

时间:2019-04-02 15:18:30

标签: php arrays

我有一个序列化数据列表,我将其反序列化并存储到数组中。

$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');

3 个答案:

答案 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中的占位符。