【问题标题】:php inserts only last array record into sqlphp只将最后一个数组记录插入sql
【发布时间】:2019-12-27 10:54:35
【问题描述】:

我有工作代码,可将数据插入 csv 文件。这是其中的一部分:

if (isset($_POST['array'])) {
        foreach ($_POST['array'] as $loop) {
            $txt = $txt . $loop['name'] . ";" . $loop['email'];
            $txt .="\n";
        }
    }

我希望它可以将数据插入到 mysql 数据库中,而不是 csv,所以我只是将代码更改为:

    if (isset($_POST['array'])) {
        foreach ($_POST['array'] as $loop) {

            $sql = "insert into persons (Name, Email)
                    values ('" . $loop['name'] . "', '" . $loop['email'] . "')";     
        }
    }

只有最后一条记录保存到persons 表中。没有错误,但除了最后一条之外的所有先前记录都没有插入。为什么?

【问题讨论】:

  • 在哪里执行sql语句?
  • 另外,你确实想use prepared statements
  • 您在循环的每次迭代中都覆盖了$sql(而不是连接)。最后一个获胜
  • 使用小写的表列名Name, Email to name,email

标签: php mysql mysqli


【解决方案1】:

更好的方法是只创建一次insert

if (isset($_POST['array'])) {
    $values = [];
    $sql = "insert into persons (Name, Email) values ";

    foreach ($_POST['array'] as $loop) {
        $values[] = "('" . $conn->real_escape_string($loop['name']) . "', '" . $conn->real_escape_string($loop['email']) . "')";     
    }

    if (!empty($values)) {
        $conn->query($sql . implode(', ', $values));
    }
}

【讨论】:

【解决方案2】:

它不起作用的原因是因为您从未在任何地方执行 SQL 查询。

要执行查询,您应该首先准备语句,然后绑定参数并执行。

// Your connection to DB
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'username', 'password', 'dbname');
$mysqli->set_charset('utf8mb4'); // always set the charset


if (isset($_POST['array'])) {
    $stmt = $mysqli->prepare('INSERT INTO persons (Name, Email) VALUES (?,?)');
    foreach ($_POST['array'] as $loop) {
        $stmt->bind_param('ss', $loop['name'], $loop['email']);
        $stmt->execute();
    }
}

【讨论】:

    【解决方案3】:

    请在循环内执行查询,如下所示

    ...
    $conn = mysqli_connect($servername, $username, $password, $dbname);
    ...
    
    if (isset($_POST['array'])) {
        foreach ($_POST['array'] as $loop) {
    
            $sql = "insert into persons (Name, Email)
                    values ('" . $loop['name'] . "', '" . $loop['email'] . "')";    
            $conn->query($sql);// Query should execute inside loop       
    
        }
    }
    

    【讨论】:

      【解决方案4】:

      我在将 JSON 数组插入 MySQL 时遇到了同样的问题,并通过将 mysqli_stmt->execute() 函数放在 foreach 中来修复它

      // loop through the array
      foreach ($data as $row) {
          echo "Data has been Uploaded successfully <br>";
          // get the project details
          $id = $row['id'];
          $name = $row['name'];
          $togglCid = $row['cid'];
          // execute insert query
          mysqli_stmt_execute($sql);
      }
      

      这意味着它在每个循环之后执行代码

      【讨论】:

        【解决方案5】:

        如果你想在循环外执行查询 尝试如下使用

         if (isset($_POST['array'])) {
                    $sql="";
                    foreach ($_POST['array'] as $loop) {
        
                        $sql .= "insert into persons (Name, Email)
                                values ('" . $loop['name'] . "', '" . $loop['email'] . "');\n";     
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-11
          • 2022-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多