【问题标题】:Using PHP “insert multiple” to insert all 4 rows at the same time使用 PHP“插入多个”同时插入所有 4 行
【发布时间】:2016-02-04 11:26:00
【问题描述】:

我正在尝试插入 4 个相同的表单。但使用 PHP 与 mysql 具有不同的值。

当我提交数据时,数据库仅从最后一个表单中获取值并插入 4 次。我正在尝试在提交时从所有 4 个中获取值。

<div class="req3">
<h1>Requirement 4</h1>
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<br>
Enter info for 4 teams and it will inserted into the database<br><br>
<div class="sqlForm">
<p class="formHead">Team 1</p>
<label>Team Name:</label> <input type="text" name="teamname"><br>
<label>City:</label> <input type="text" name="city"><br>
<label>Best Player:</label> <input type="text" name="bestplayer"><br>
<label>Year Formed:</label> <input type="text" name="yearformed"><br>
<label>Website:</label> <input type="text" name="website"><br>
</div>

<div class="sqlForm">
<p class="formHead">Team 2</p>
<label>Team Name:</label> <input type="text" name="teamname"><br>
<label>City:</label> <input type="text" name="city"><br>
<label>Best Player:</label> <input type="text" name="bestplayer"><br>
<label>Year Formed:</label> <input type="text" name="yearformed"><br>
<label>Website:</label> <input type="text" name="website"><br>
</div>

<div class="sqlForm">
<p class="formHead">Team 3</p>
<label>Team Name:</label> <input type="text" name="teamname"><br>
<label>City:</label> <input type="text" name="city"><br>
<label>Best Player:</label> <input type="text" name="bestplayer"><br>       
<label>Year Formed:</label> <input type="text" name="yearformed"><br>
<label>Website:</label> <input type="text" name="website"><br>
</div>

<div class="sqlForm">
<p class="formHead">Team 4</p>
<label>Team Name:</label> <input type="text" name="teamname"><br>
<label>City:</label> <input type="text" name="city"><br>
<label>Best Player:</label> <input type="text" name="bestplayer"><br>
<label>Year Formed:</label> <input type="text" name="yearformed"><br>
<label>Website:</label> <input type="text" name="website"><br><br></div>
<input class="styled-button" type="submit" name="insert" value="Submit">

</form>



<?php 
if (isset($_POST['insert'])) {
  insertTable();
} else {
$conn->close(); 
}

function insertTable() {

$servername = "localhost:3306";
$username = "XXXXX";
$password = "XXXXX";
$dbname = "XXXXX";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
echo ("Connection failed: " . $conn->connect_error);
} else {


$varTname = $_POST['teamname'];
$varCity = $_POST['city'];
$varBplayer = $_POST['bestplayer'];
$varYearformed = $_POST['yearformed'];
$varWebsite = $_POST['website'];

$sql = "INSERT INTO Teams (teamname, city, bestplayer, yearformed, website)
VALUES ('$varTname', '$varCity', '$varBplayer', '$varYearformed',        '$varWebsite'),
   ('$varTname', '$varCity', '$varBplayer', '$varYearformed', '$varWebsite'),
   ('$varTname', '$varCity', '$varBplayer', '$varYearformed', '$varWebsite'),
   ('$varTname', '$varCity', '$varBplayer', '$varYearformed', '$varWebsite')";

    if ($conn->multi_query($sql) === TRUE) {
        echo "New record created successfully";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }


mysql_query($sql);


function PrepSQL($value)

{

// Stripslashes

if(get_magic_quotes_gpc())

{

    $value = stripslashes($value);

}



// Quote

$value = "'" . mysql_real_escape_string($value) . "'";



return($value);

}
}
}
?>

【问题讨论】:

  • 用不同的名称命名您的控件,例如 teamname1、teamname2、..

标签: php mysql forms insert sql-insert


【解决方案1】:

更改控件的名称,以便它们作为数组发布

<input type="text" name="teamname[G1]">
<input type="text" name="teamname[G2]">

这就是为什么当您使用 $varTname = $_POST['teamname']; 时,$varTname 是一个数组,teamname 的 4 个值中的每一个都设置为 $varTname['G#'],其中 # 匹配您为该组输入字段设置的数字。

然后使用 for 循环获取数据并执行查询,如下所示。当您使用它时,您还可以修复您的 SQL 注入漏洞。您可能还希望对数据进行更多的清理以确保

$varTname = $_POST['teamname'];
$varCity = $_POST['city'];
$varBplayer = $_POST['bestplayer'];
$varYearformed = $_POST['yearformed'];
$varWebsite = $_POST['website'];

$stmt = $mysqli->prepare('INSERT INTO Teams (teamname, city, bestplayer, yearformed, website) VALUES (?,?,?,?,?,?)');
$varTname1Bind = "";
$varTnameBind = "";
$varCityBind = "";
$varBplayerBind = "";
$varWebsiteBind = "";

 // assuming they are all strings, adjust where needed
 $stmt->bind_param('sssssss',
    $varTname1Bind,
    $varTnameBind,
    $varCityBind,
    $varBplayerBind,
    $varYearformedBind,
    $varWebsiteBind);

for($i = 1; i < 5; $i++)
{
    $varTname1Bind = $varTname['G'.$i];
    $varTnameBind = $varTname['G'.$i];
    $varCityBind = $varCity['G'.$i];
    $varBplayerBind = $varBplayer['G'.$i];
    $varYearformedBind = $varYearformed['G'.$i];
    $varWebsiteBind = $varWebsite['G'.$i];

    $stmt->execute();
}

将节省你需要做多少代码

【讨论】:

  • 我什至没有想过在这种情况下使用循环。天才!
【解决方案2】:

您可以通过添加 []input names 转换为数组,然后在您的 php 循环中通过 $_POST[] 的数组并通过连接这些值直到您完成循环来构建您的 $sql所有值和INSERT 它作为多个值。

HTML:

<label>Team Name:</label> <input type="text" name="teamname[]"><br>
<label>City:</label> <input type="text" name="city[]"><br>
<label>Best Player:</label> <input type="text" name="bestplayer[]"><br>
<label>Year Formed:</label> <input type="text" name="yearformed[]"><br>
<label>Website:</label> <input type="text" name="website[]"><br>

PHP:

<?php
    $sql = "INSERT INTO Teams (teamname, city, bestplayer, yearformed, website) VALUES ";
        for($i = 0 ; $i < count($_POST['teamname']) ; $i++){
            $varTname = $_POST['teamname'][$i];
            $varCity = $_POST['city'][$i];
            $varBplayer = $_POST['bestplayer'][$i];
            $varYearformed = $_POST['yearformed'][$i];
            $varWebsite = $_POST['website'][$i];
            $sql .= "(" .$varTname. " , " .$varCity. " , " .$varBplayer. " , " .$varYearformed. " , " .$varWebsite. "),";   
        }
        $sql = rtrim($sql, ','); // omit the last comma

    // Then Excute your query

?>

这样你就不需要给他们唯一的名字name="test1"name="test2"等等,查看它在结果页面底部的PHP Fiddle,我已经设置了值在输入字段中,只需点击提交并转到结果页面的底部即可查看组合的INSERT 语句。


注意上面的SQL 只是一个关于如何构建它的演示,不要在没有验证和清理的情况下使用它.. 也停止以这种方式查询,而是使用准备好的语句使用PDOMySQLi 来避免SQL 注入。

所以对于 MySQLi 准备好的语句,程序样式 - 我使用 PDO - 正如您在 PHP Fiddle 2 中看到的,代码是:

<?php

    // you validation goes here
    if (isset($_POST['insert'])) {

        insertTable();
    } else {
        $conn->close(); 
    }

    function insertTable() {
        // enter your credentials below and uncomment it to connect
        //$link = mysqli_connect('localhost', 'my_user', 'my_password', 'world');
        $sql = "INSERT INTO Teams (teamname, city, bestplayer, yearformed, website) VALUES";
        $s = '';
        $bind = '';
        for($i = 0 ; $i < count($_POST['teamname']) ; $i++){
            $sql .= " (?, ?, ?, ?, ?)"; 
            $s .= 's';
            $varTname = $_POST['teamname'][$i];
            $varCity = $_POST['city'][$i];
            $varBplayer = $_POST['bestplayer'][$i];
            $varYearformed = $_POST['yearformed'][$i];
            $varWebsite = $_POST['website'][$i];
            $bind .= " , " . $varTname. " , " .$varCity. " , " .$varBplayer. " , " .$varYearformed. " , " .$varWebsite;
        }

        $sql = rtrim($sql, ','); // omit the last comma
        $s = "'" .$s. "'";

        $stmt = mysqli_prepare($link, $sql);
        mysqli_stmt_bind_param($stmt, $s , $bind);
        mysqli_stmt_execute($stmt);
    }
?>

【讨论】:

    【解决方案3】:

    通常这是通过创建表单控制器数组来完成的。

    <input type="text" name="teamname[]"> 
    <input type="text" name="city[]">
    

    然后你就可以在post请求中得到一个数组了。

    希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      使用不同的名称,例如teamname1,teamname2,teamname3,teamname4

      <input type="text" name="teamname1">
      <input type="text" name="teamname2">
      <input type="text" name="teamname3">
      <input type="text" name="teamname4">
      

      获取值:-

      $varTname1 = $_POST['teamname1'];
      $varTname2 = $_POST['teamname2'];
      $varTname3 = $_POST['teamname3'];
      $varTname4 = $_POST['teamname4'];
      

      对于插入值:-.

      $sql = "INSERT INTO Teams (teamname)
      VALUES ('$varTname1'),
             ('$varTname2'),
             ('$varTname3'),
             ('$varTname4')
      

      或者你可以试试这个:-

      <input type="text" name="teamname[]">
      

      获取类似的值:-

      $_POST['teamname'][0]
      

      【讨论】:

        【解决方案5】:

        试试这个方法

           $sql = "INSERT INTO Teams (teamname, city, bestplayer,yearformed,website)
           VALUES ('$varTname', '$varCity', '$varBplayer', '$varYearformed', '$varWebsite'),
           ";
           $sql.= query same as abov
           $sql.= query same as abov
           $sql.= query same as abov
           if (!$mysqli->multi_query($sql)) {
            echo "Multi query failed: (" . $mysqli->errno . ") " . $mysqli->error;
           }
        

        注意第一个查询后的. 点。
        我认为您还应该使用自动递增键
        这应该可以。

        【讨论】:

          猜你喜欢
          • 2013-05-08
          • 1970-01-01
          • 1970-01-01
          • 2014-02-25
          • 2012-01-04
          • 2011-05-08
          • 2018-05-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多