从一个键中分离两个数组值,并在PHP中插入数据库

时间:2014-11-29 15:55:49

标签: php mysql arrays for-loop multidimensional-array

我设计了预订房间的系统,并以多维数组形式存储数据。

这是数组(数据):

$recordBooking = array(
            "111"=>array(
                "date"=>array(
                    "29/10/2014"=>array(
                        array(
                            "from"=>1,
                            "to"=>3,
                            "user"=>"Amy",
                            "username"=>"CB34"
                                ),
                        array(
                            "from"=>4,
                            "to"=>5,
                            "user"=>"Chars",
                            "username"=>"AA13"
                                )   
                        ),
                    "30/10/2014"=>array(
                        array(
                            "from"=>2,
                            "to"=>3,
                            "user"=>"Chars",
                            "username"=>"AA13"
                                ),
                        array(
                            "from"=>3,
                            "to"=>6,
                            "user"=>"Gary",
                            "username"=>"SF11"
                                )
                        ),
                    "02/11/2014"=>array(
                        array(
                            "from"=>1,
                            "to"=>3,
                            "user"=>"Billy",
                            "username"=>"V214"
                                )
                        ),

                     .......

                    )
                )
        );

此外,我使用foreach循环来分隔数组值并存储这些数据。我使用数组$ BookArrRecord来收集值并插入数据库。它导致$ BookArrRecord只能存储每个日期的最后值的错误。任何人都可以帮助我找出问题以及如何改进?

 foreach($recordBooking as $key => $value){
    $rmNum[] = $key;
    foreach($value as $k => $v){
        foreach($v as $bookDate => $array){
            $bookingDate[] = $bookDate;
            foreach($array as $room => $info){
                foreach($info as $period =>$fromTo){
                        if($period=="username"){
                            $userID[] = $fromTo;
                        }
                        if($period=="from"){
                            $from[] = $fromTo;
                        }
                        if($period=="to"){
                            $to[] = $fromTo;
                        }
                    }
                }
        }
    }                   
}

   for($rmCount=1;$rmCount<count($userID);$rmCount++){//get the $userID to set the rows of $rmNum
        $rmNum[]+=$rmID[0];
    }

    $BookArrRecord = array();
    foreach($rmNum as $key => $value){
        $BookArrRecord[] = "('" . $userID[$key] . "', '" . $rmNum[$key] . "', '". $bookingDate[$key] . "', '" . $from[$key] . "', '" . $to[$key] . "')";            
    }

sql查询:

    $bookingInformation = "INSERT INTO `bookRecord` (`userID`, `room_Number`, `date`, `frome`, `to`) 
                            VALUES " . implode(',', $BookArrRecord);

检查查询:

    if(!mysql_query($bookingInformation, $dbConnection)){
            die("Cannot access operation of Database(bookRecord): " . mysql_error()) . "<br>";
        }else{
            echo "Records added in table: BookingDate " . "<br>";
        }

结果显示使用var_dump:

    array(268) {
     [0]=>
     string(38) "('CB34', '111', '29/10/2014', '1', '3')"
     [1]=>
     string(38) "('AA13', '111', '30/10/2014', '4', '5')" //the date is wrong
     [1]=>
     string(38) "('AA13', '111', '02/11/2014', '2', '3')"
      ......
    }

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我认为您的问题是您有许多不同的数组($ userID,$ rmNum,$ bookingDate等),您可以在不同的时间添加值。这使得很难跟踪每个数组中的哪个值对应于其他数组中的哪些值。 (这有可能,但很棘手,可能会导致错误)。

更简单的解决方案是处理在foreach循环中向$ BookArrRecord添加记录。这样你就知道所有不同的值都是一致的。

例如:

$BookArrRecord = array();
$roomNumber = 1;
foreach($recordBooking as $key => $value){
    $rmNum[] = $key;
    foreach($value as $k => $v){
        foreach($v as $bookDate => $array){
            foreach($array as $room => $info){
                $BookArrRecord[] = "('" . $info['username'] . "', '" . $roomNumber . "', '". $bookDate . "', '" . $info['from'] . "', '" . $info['to'] . "')";   
                $roomNumber++;
            }
        }
    }                   
}
var_dump ($BookArrRecord);

注意我删除了最里面的数组。当您知道要查找哪些键时,无需循环遍历数组。

顺便说一句,将变量直接包含在数据库查询中通常是不好的做法。你应该先逃避它们。由于这是您指定的硬编码值数组,因此现在不太可能出错。但是,只要您开始使用任何用户输入的值,请确保在它们到达查询附近的任何地方之前将其转义!