由于错误的数组数据类型

时间:2018-05-06 13:25:38

标签: php mysql

以下是从中检索数据并尝试插入mysql表的数组,但是当插入多于1行时效果很好,而当只插入1行时失败。

// The structure of the array is as follows
Array
(
    [Row] => Array
        (
            [0] => Array
                (
                    [PIN] => 1274
                    [DateTime] => 2018-04-07 09:28:16
                    [Verified] => 15
                    [Status] => 3
                    [WorkCode] => 0
                )

            [1] => Array
                (
                    [PIN] => 157
                    [DateTime] => 2018-04-07 10:22:56
                    [Verified] => 15
                    [Status] => 3
                    [WorkCode] => 0
                )
    // these are the raw punch data from biometric machine

以下是当前正在使用的代码段。

  if(isset($array_att_logs) && isset($array_att_logs['Row'])) {     
      foreach ($array_att_logs['Row'] as $value) {
          $emp_code =  $value['PIN'];       // line 92                                  $dateNTime =  $value['DateTime']; //line 93

$punch_query = "INSERT IGNORE INTO punching_data_table (emp_code, date_time,in_out_status) VALUES ('$emp_code', '$dateNTime','$in_out_status')";

 $punch_result = mysql_query($punch_query);
 echo mysql_error();
         }       
     } echo var_dump($array_att_logs);

请注意,$ in_out_status是在别处明确定义的,根本没有任何问题。我已经使用var_dump()检查了数组存在的数据就好了。问题是如果要在表中插入一行,则会显示以下错误。

Warning: Illegal string offset 'PIN' in /home1/.../punch-raw.php on line 92
Warning: Illegal string offset 'DateTime' in /home1/..../punch-raw.php on line 93

如果要在表中插入多于一行,那么它的工作正常。可能是我错误地定义了$emp_code$dateNTime

以下是单行时的样子。

 echo " <pre>"; 
    print_r($array_att_logs); 
    echo "/<pre>"; 

Array
(
    [Row] => Array
        (
            [PIN] => 406
            [DateTime] => 2018-05-06 14:40:09
            [Verified] => 1
            [Status] => 3
            [WorkCode] => 0
        )

)
/

using var_dump it looks like below

array(1) { ["Row"]=> array(5) { ["PIN"]=> string(3) "406" ["DateTime"]=> string(19) "2018-05-06 14:40:09" ["Verified"]=> string(1) "1" ["Status"]=> string(1) "3" ["WorkCode"]=> string(1) "0" } }

1 个答案:

答案 0 :(得分:0)

您遇到问题的原因是$array_att_logs的数组结构在有多行时只有1行有所不同。因此,您需要测试该情况并更改迭代数组的方式。检查是否只有1行的最简单方法是查看$ array_att_logs ['Row']的内容是否是数组数组。为此,我们使用array_values($array_att_logs['Row'])来确保我们有一个索引为0的条目,然后测试该值以查看它是否是一个数组。然后我们使用该结果来改变foreach迭代的值:

$row = array_values($array_att_logs['Row']);
$multirows = is_array($row[0]);
foreach (($multirows ? $array_att_logs['Row'] : $array_att_logs) as $value) {
    $emp_code =  $value['PIN'];
    ...