SQL INSERT为什么它只添加数组中的第一个元素?

时间:2018-04-15 17:59:13

标签: php arrays database

我有一个循环foreach,我执行查询。我有一个关联array,关键是列的名称。如果ID不是AUTO_INCREMENT,则只会执行第一个请求true,而所有其他请求false。如果在db中放置AUTO_INCREMENT,则会执行所有查询,但是以级联方式执行。

$namePhones = ["phone_1", "phone_2", "phone_3", "phone_4", "phone_5"];
$jsonPhones = $userInfo;
$jsonPhones = array_splice($jsonPhones, 0, 1);
$phones = new stdClass();

$phonesCount = count($jsonPhones[0]);    
 foreach ($jsonPhones[0] as $key => $value) {
   if($key < $phonesCount){
      $phones->{$namePhones[$key]} = $jsonPhones[0][$key];
    } else { return; }
  }
  $phonesDB = json_decode(json_encode($phones), true);

//$phonesDB//this is array
// Array
// (
//    [phone_1] => 1
//    [phone_2] => 2
//    [phone_3] => 3
//    [phone_4] => 4
//)

    foreach ($phonesDB as $key => $value) {
        $queryInsertPhones = 
            "INSERT INTO 
               `phones_users` ($key) 
            VALUES  ($value)";
            $resultPhones =  mysqli_query($con, $queryInsertPhones); 
    }
 cascade style.
 +--------------------------------+
 |id | phone_1 | phone_2 | phone_3|
 |---+---------+---------+--------|
 |1  |  1      | ---     |  ---   |
 |---+---------+---------+--------|
 |2  |  ---    | 2       |  ---   |
 |---+---------+---------+--------|
 |3  |  ---    | ---     |  3     |
 +---+----------------------------+

 I want this.
  +--------------------------------+
 |id | phone_1 | phone_2 | phone_3|
 |---+---------+---------+--------|
 |1  |  1      | 2       |  3     |
 |---+---------+---------+--------|
 |2  |  ---    | ---     |  ---   |
 +---+----------------------------+

2 个答案:

答案 0 :(得分:4)

原因是您执行每个键的查询而不是所有键。

您需要这样做:

// Make a variables that will conaints all keys and values seprate by comma
$keyList = '';
$keyValue = '';
// Add key and value to their variable with comma
foreach ($phonesDB as $key => $value) {
    $keyList .= '`'.$key.'`,';
    $keyValue .= '\''.$value.'\',';
}
// Remove the last comma
$keyList = substr($keyList, 0, -1);
$keyValue = substr($keyValue, 0, -1);
// Build the SQL query
$queryInsertPhones = 
    "INSERT INTO 
       `phones_users` ($keyList) 
    VALUES  ($keyValue)";
// Execute the query
$resultPhones =  mysqli_query($con, $queryInsertPhones); 

如果您想要多个插入,我猜这段代码在主循环中。

答案 1 :(得分:0)

我很难确切地看到你在做什么,但通常在插入SQL数据库时,你应该指定一个where子句来根据主键指定要插入的行为那一行。如果您尝试将数据添加到已插入的行,则应使用update而不是insert。

最简单的解决方案是使用嵌套循环。内部循环应该通过一行并获取该行的所有电话号码,然后一次插入所有值。你的外部循环应遍历所有行。