简体   繁体   English

一次将多行插入MySQL

[英]Inserting multiple rows into MySQL at once

I am trying to submit a table full of information at once, and cannot find the answer. 我试图一次提交一个充满信息的表格,但找不到答案。 It has no problem submitting one set of information to the DB, but i need to insult between 1 and 50 of the same value at once. 向数据库提交一组信息没有问题,但是我需要一次侮辱1至50个相同值的信息。 Here is an example: 这是一个例子:

We are recording lap times, therefore we need to be able to fill in a table on a web app, with loads of names, and event times. 我们正在记录单圈时间,因此我们需要能够在Web应用程序上填写表格,其中包含名称和事件时间的负载。 Therefore, we will need to add loads of SQL entries at once. 因此,我们将需要立即添加SQL条目的负载。

I have tried just copy and pasting the form info, but this results in a blank set of data in phpmyadmin. 我已经尝试过仅复制和粘贴表单信息,但这会导致phpmyadmin中的数据空白。

Here is the code: 这是代码:

<?php


$host = "localhost";
$databasename = "pe_results";
$databaseusername = "root";
$databasepassword = "";

$conn = mysql_connect("$host", "$databaseusername", "$databasepassword"); 
mysql_select_db("$databasename", $conn); 

        if (isset($_POST['Name'])) { 
        $Name = $_POST['Name'];
        }
        if (isset($_POST['Short'])) { 
        $Short = $_POST['Short'];
        }
        if (isset($_POST['Med'])) { 
        $Med = $_POST['Med'];
        }
        if (isset($_POST['Long'])) { 
        $Long = $_POST['Long'];
        }
        if (isset($_POST['VLong'])) { 
        $VLong = $_POST['VLong'];
        }
        if (isset($_POST['Extreme'])) { 
        $Extreme = $_POST['Extreme'];
        }
        if (isset($_POST['LJump'])) { 
        $LJump = $_POST['LJump'];
        }
        if (isset($_POST['HJump'])) { 
        $HJump = $_POST['HJump'];
        }
        if (isset($_POST['Shotputt'])) { 
        $Shotputt = $_POST['Shotputt'];
        }
        if (isset($_POST['Discuss'])) { 
        $Discuss = $_POST['Discuss'];
        }
        if (isset($_POST['Javelin'])) { 
        $Javelin = $_POST['Javelin'];
        }
        if (isset($_POST['Date'])) { 
        $Date = $_POST['Date'];
        }
        if (isset($_POST['Year'])) { 
        $Year = $_POST['Year'];
        }



           $i = count($Name);

for ($i=0;$i<10;$i++) {
$n = $Name[$i];
$s = $Short[$i];
$me = $Med[$i];
$lng = $Long[$i];
$slng = $VLong[$i];
$ext = $Extreme[$i];
$ljump = $LJump[$i];
$hjump = $HJump[$i];
$shot = $Shotputt[$i];
$disc = $Discuss[$i];
$jav = $Javelin[$i];
$date = $Date[$i];
$year = $Year[$i];

//and so on with more variable...

$sql="INSERT INTO results_main (`Name`, `Short`, `Med`, `Long`, `Vlong`, `Extreme`, `LJump`, `HJump`, `Shotputt`, `Discuss`, `Javelin`, `Date`, `Year`)
            VALUES ('$n', '$s', '$me', '$lng', '$slng', '$ext', '$ljump', '$hjump', '$shot', '$disc', '$jav', '$date', '$year')";

}


    $result = mysql_query($sql) or die(mysql_error ());;
        if($result){
echo"<br/>Everythings been saved";
echo "<BR>";
echo "<a href='index.php'>Back to the main page</a>";
}

else {

echo $result = mysql_query($sql,$conn) or die (mysql_error ());
}

// close connection 
mysql_close($conn);
?>

Also find HTML below 也可以在下面找到HTML

<?php
// Create connection
$con=mysqli_connect("127.0.0.1","root","","pe_results");

// Check connection
if (mysqli_connect_errno($con))
  {
  echo "Uh oh, tell chris that " . mysqli_connect_error() . "NO DATA WILL BE SAVED";
  }
?>
    <a href="results.php"><div id="1" >Results</div></a>
    <a href="record.php"><div id="2">Record</div></a>
    <a href="overview.php"><div id="3">Overview</div></a>
    <div id="4">Blank</div>
   <form name="input_primary" action="process.php" method="post">

    <font color="#FFFFFF"><strong>Date:</strong></font><input name="Date" type="date" />

   <font color="#FFFFFF"><strong>Year:</strong></font><select name="Year">
        <option value="7">Year 7</option>
        <option value="8">Year 8</option>
        <option value="9">Year 9</option>
        <option value="10">Year 10</option>
        <option value="11">Year 11</option>
        <option value="12">Year 12</option>
        <option value="13">Year 13</option>
       </select>
       <input type="submit" value="Save results!" name="submit" />


<table width="200" border="1px solid black" id="maintab">
  <tr>
    <th scope="col">Name</th>
    <th scope="col">100m</th>
    <th scope="col">200m</th>
    <th scope="col">400m</th>
    <th scope="col">800m</th>
    <th scope="col">1500m</th>
    <th scope="col">Long Jump</th>
    <th scope="col">High Jump</th>
    <th scope="col">Shotputt</th>
    <th scope="col">Discus</th>
    <th scope="col">Javelin</th>
  </tr>
  <tr>
    <td>
        <input name="Name" type="text" />
    </td>
    <td> 
        <input name="Short" type="text" size="10px" />
    </td>
    <td>
         <input name="Med" type="text" size="10px" />
    </td>
    <td> 
        <input name="Long" type="text" size="10px" />
    </td>
    <td>
         <input name="VLong" type="text" size="10px" />
    </td>
    <td>
         <input name="Extreme" type="text" size="10px" />
    </td>
    <td>
         <input name="LJump" type="text" size="10px" />
    </td>
    <td>
         <input name="HJump" type="text" size="10px" />
    </td>
    <td>
         <input name="Shotputt" type="text" size="10px" />
    </td>
    <td>
         <input name="Discuss" type="text" size="10px" />
    </td>
    <td>
         <input name="Javelin" type="text" size="10px" />
    </td>
  </tr>

If I understood your Question right what you wanna do is name the fields with a [] So 如果我对您的问题的理解正确,那么您想要做的就是用[]命名字段

<select name="Year">

Becomes 成为

<select name="Year[]">

Then you'll be able to loop through the submitted values, example: 然后,您将能够遍历提交的值,例如:

foreach($_POST['Year'] as $k=>$v){
 echo $v." - This is the value";
 echo $k." - This is the key";
}

EDIT: 编辑:

(string)$insert;
if(is_array($_POST['Year'])){
    foreach($_POST['Year'] as $k=>$v){  
         $insert .= "(".$_POST['Name'][$k].", ".$_POST['Short'][$k].", ".$_POST['Med'][$k].", ".$_POST['Long'][$k].", ".$_POST['VLong'][$k].", ".$_POST['Extreme'][$k].", ".$_POST['LJump'][$k].", ".$_POST['HJump'][$k].", ".$_POST['Shotputt'][$k].", ".$_POST['Discuss'][$k].", ".$_POST['Javelin'][$k].", ".$_POST['Date'][$k].", ".$_POST['Year'][$k]."),"; 
    }
     $insert = substr_replace($insert ,0,-1);
}else{
    $insert .= "($_POST['Name'], $_POST['Short'], $_POST['Med'], $_POST['Long'], $_POST['VLong'], $_POST['Extreme'], $_POST['LJump'], $_POST['HJump'], $_POST['Shotputt'], $_POST['Discuss'], $_POST['Javelin'], $_POST['Date'], $_POST['Year'])"; 
}
$sql="INSERT INTO results_main 
(`Name`, `Short`, `Med`, `Long`, `VLong`, `Extreme`, `LJump`, `HJump`, `Shotputt`, `Discuss`, `Javelin`, `Date`, `Year`)
VALUES 
".$insert;

This should do the trick to get everything into only one query instead of doing multiple queries for each row 这应该可以使所有内容仅进入一个查询,而不是对每一行进行多个查询

Add brackets [] to ALL your names in your html-form (where it makes sense). 在您的html表单中的所有名称中添加方括号[](在此有意义)。 The bracket [] tells that elements are treated as dynamic arrays. 方括号[]表示将元素视为动态数组。

In your html-form , do something like this: 在您的html-form中 ,执行以下操作:

<form name="input_primary" action="process.php" method="post">

    <font color="#FFFFFF"><strong>Date:</strong></font><input name="Date" type="date" />
   <font color="#FFFFFF"><strong>Year:</strong></font><select name="Year">
        <option value="7">Year 7</option>
        <option value="8">Year 8</option>
        <option value="9">Year 9</option>
        <option value="10">Year 10</option>
        <option value="11">Year 11</option>
        <option value="12">Year 12</option>
        <option value="13">Year 13</option>
       </select>
       <input type="submit" value="Save results!" name="submit" />


<table width="200" border="1px solid black" id="maintab">
  <tr>
    <th scope="col">Name</th>
    <th scope="col">100m</th>
    <th scope="col">200m</th>
    <th scope="col">400m</th>
    <th scope="col">800m</th>
    <th scope="col">1500m</th>
    <th scope="col">Long Jump</th>
    <th scope="col">High Jump</th>
    <th scope="col">Shotputt</th>
    <th scope="col">Discus</th>
    <th scope="col">Javelin</th>
  </tr>
<?php
//Repeat element inside loop 10 times
for($i=0;$i<10;$i++) {
?>
  <tr>
    <td>
        <input name="Name[]" type="text" />
    </td>
    <td> 
        <input name="Short[]" type="text" size="10px" />
    </td>
    <td>
         <input name="Med[]" type="text" size="10px" />
    </td>
    <td> 
        <input name="Long[]" type="text" size="10px" />
    </td>
    <td>
         <input name="VLong[]" type="text" size="10px" />
    </td>
    <td>
         <input name="Extreme[]" type="text" size="10px" />
    </td>
    <td>
         <input name="LJump[]" type="text" size="10px" />
    </td>
    <td>
         <input name="HJump[]" type="text" size="10px" />
    </td>
    <td>
         <input name="Shotputt[]" type="text" size="10px" />
    </td>
    <td>
         <input name="Discuss[]" type="text" size="10px" />
    </td>
    <td>
         <input name="Javelin[]" type="text" size="10px" />
    </td>
  </tr>
<?php
}
?>
</table>
</form>

And in your PHP code do something like this: 然后在您的PHP代码中执行以下操作:

//Create initial query for sql-insert.
$sql="INSERT INTO results_main (`Name`, `Short`, `Med`, `Long`, `Vlong`, `Extreme`, `LJump`, `HJump`, `Shotputt`, `Discuss`, `Javelin`, `Date`, `Year`) VALUES ";


$date = $Date; //Do like this if date-element is only occur once (at top) (then no need for brackets)
$year = $Year; //Do like this if year-element is only occur once (at top) (then no need for brackets)

$cnt = count($Name);    
for ($i=0;$i<$cnt;$i++) {
    //Use mysql_escape_string to escape strings (when needed) BEFORE adding to the $sql.
    $n = $Name[$i];
    $s = $Short[$i];
    $me = $Med[$i];
    $lng = $Long[$i];
    $slng = $VLong[$i];
    $ext = $Extreme[$i];
    $ljump = $LJump[$i];
    $hjump = $HJump[$i];
    $shot = $Shotputt[$i];
    $disc = $Discuss[$i];
    $jav = $Javelin[$i];

    //Insert each row separated with a comma
    $sql .= "('$n', '$s', '$me', '$lng', '$slng', '$ext', '$ljump', '$hjump', '$shot', '$disc', '$jav', '$date', '$year'),";
}

$useQuery = substr($sql, 0, -1); //Delete last comma
$result = mysql_query($useQuery); //Do the actual insert

then of course, read up on PDO instead of using mysql_query etc. Do this soon because mysql_* functions like this are deprecated and will be removed in the future. 然后,当然,请在PDO上进行读取,而不要使用mysql_query等。请尽快执行此操作,因为不赞成使用此类mysql_ *函数,并且将来会删除它们。 PDO is a better alternative because it's oop, it's safer and more flexible. PDO是一种更好的替代方法,因为它的发展,更安全,更灵活。 Start from here... http://www.php.net/manual/en/intro.pdo.php 从这里开始... http://www.php.net/manual/zh/intro.pdo.php

Storing your data across multiple arrays is unsafe because its so easy to get out of order and cause errors. 将数据存储在多个阵列中是不安全的,因为它很容易出现故障并引起错误。 Instead store data into an associative array like this: 而是将数据存储到这样的关联数组中:

$people = array();
$people[] = array('Name' => $name, 'Short' => $short ....);

The above code creates and array of arrays and the inner arrays are associative arrays so you can use the following syntax to get the name of the first person: 上面的代码创建并创建了数组数组,内部数组是关联数组,因此您可以使用以下语法获取第一人称名称:

$people[0]['Name']; $ people [0] ['Name'];

Everything stays together and if certain values arn't set for certain people it will not seep into the other peoples records. 一切保持在一起,如果没有为某些人设置某些值,它将不会渗入其他人的记录。

I see you were using POST variables. 我看到您正在使用POST变量。 The above associative array can be easily passed around with ajax (if thats what your using, just an option) by using json_encode and json_decode. 通过使用json_encode和json_decode,可以轻松地使用ajax传递上述关联数组(如果您使用的只是一个选项)。 This helps preserve data structures when your passing it through multiple languages. 当您通过多种语言传递数据时,这有助于保留数据结构。

Lastly to insert a large number of records I would suggest a PDO statement as one ofthe easiest and cleanest way to do this. 最后要插入大量记录,我建议使用PDO语句作为最简单,最干净的方法之一。 Check out a great tutorial here http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/ 在这里查看出色的教程http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

Hope this helps, good luck! 希望这有帮助,祝你好运!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM