簡體   English   中英

用一個查詢插入多行 MySQL

[英]Insert multiple rows with one query MySQL

我想編寫腳本,具有多個插入查詢的功能。 讓我更好地解釋一下。

我有一個 html 形式的quantity輸入。 我有 MySQL 查詢將registered user插入表中。 所以我希望我的函數為“數量”時間插入這個查詢。

 mysql_query("INSERT INTO `pxlot` (realname,email,address,phone,status,regtime,ip) 
 VALUES ('$realname','$email','$address','$phone','0','$dateTime','$ip')")
 or die (mysql_error()); // Inserts the user.

例如插入 3 次。 有什么建議么?

 INSERT INTO table (a,b) VALUES (1,2), (2,3), (3,4);

http://dev.mysql.com/doc/refman/5.5/en/insert.html

在大多數情況下,在 MySQL 中使用一個 Insert 語句插入多條記錄比在 PHP 中使用 for/foreach 循環插入記錄要快得多。

讓我們假設 $column1 和 $column2 是由 html 表單發布的具有相同大小的數組。

您可以像這樣創建查詢:

<?php
    $query = 'INSERT INTO TABLE (`column1`, `column2`) VALUES ';
    $query_parts = array();
    for($x=0; $x<count($column1); $x++){
        $query_parts[] = "('" . $column1[$x] . "', '" . $column2[$x] . "')";
    }
    echo $query .= implode(',', $query_parts);
?>

如果為兩條記錄發布數據,則查詢將變為:

INSERT INTO TABLE ( column1 , column2 ) VALUES ('data', 'data'), ('data', 'data')

這里有幾種方法可以做到

INSERT INTO pxlot (realname,email,address,phone,status,regtime,ip) 
select '$realname','$email','$address','$phone','0','$dateTime','$ip' 
from SOMETABLEWITHTONSOFROWS LIMIT 3;

要么

INSERT INTO pxlot (realname,email,address,phone,status,regtime,ip) 
select '$realname','$email','$address','$phone','0','$dateTime','$ip'
union all select '$realname','$email','$address','$phone','0','$dateTime','$ip'
union all select '$realname','$email','$address','$phone','0','$dateTime','$ip'

要么

INSERT INTO pxlot (realname,email,address,phone,status,regtime,ip) 
values ('$realname','$email','$address','$phone','0','$dateTime','$ip')
,('$realname','$email','$address','$phone','0','$dateTime','$ip')
,('$realname','$email','$address','$phone','0','$dateTime','$ip')

雖然使用單個INSERT語句插入多行通常更快,但它會導致更復雜且通常不安全的代碼。 下面我將介紹使用 PHP 一次性插入多條記錄的最佳實踐。

要同時向數據庫中插入多行新行,需要遵循以下 3 個步驟:

  1. 啟動事務(禁用自動提交模式)
  2. 准備INSERT語句
  3. 執行多次

使用數據庫事務可確保將數據保存在一塊並顯着提高性能。

如何使用 PDO 正確插入多行

PDO 是 PHP 中最常見的數據庫擴展選擇,使用 PDO 插入多條記錄非常簡單。

$pdo = new \PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", 'user', 'password', [
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_EMULATE_PREPARES => false
]);

// Start transaction
$pdo->beginTransaction();

// Prepare statement
$stmt = $pdo->prepare('INSERT 
    INTO `pxlot` (realname,email,address,phone,status,regtime,ip) 
    VALUES (?,?,?,?,?,?,?)');

// Perform execute() inside a loop
// Sample data coming from a fictitious data set, but the data can come from anywhere
foreach ($dataSet as $data) {
    // All seven parameters are passed into the execute() in a form of an array
    $stmt->execute([$data['name'], $data['email'], $data['address'], getPhoneNo($data['name']), '0', $data['regtime'], $data['ip']]);
}

// Commit the data into the database
$pdo->commit();

如何使用mysqli正確插入多行

mysqli 擴展使用起來有點麻煩,但操作原理非常相似。 函數名稱不同,參數略有不同。

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new \mysqli('localhost', 'user', 'password', 'database');
$mysqli->set_charset('utf8mb4');

// Start transaction
$mysqli->begin_transaction();

// Prepare statement
$stmt = $mysqli->prepare('INSERT 
    INTO `pxlot` (realname,email,address,phone,status,regtime,ip) 
    VALUES (?,?,?,?,?,?,?)');

// Perform execute() inside a loop
// Sample data coming from a fictitious data set, but the data can come from anywhere
foreach ($dataSet as $data) {
    // mysqli doesn't accept bind in execute yet, so we have to bind the data first
    // The first argument is a list of letters denoting types of parameters. It's best to use 's' for all unless you need a specific type
    // bind_param doesn't accept an array so we need to unpack it first using '...'
    $stmt->bind_param('sssssss', ...[$data['name'], $data['email'], $data['address'], getPhoneNo($data['name']), '0', $data['regtime'], $data['ip']]);
    $stmt->execute();
}

// Commit the data into the database
$mysqli->commit();

表現

這兩個擴展都提供了使用事務的能力。 使用事務執行准備好的語句大大提高了性能,但仍然不如單個 SQL 查詢。 然而,差異是如此的微不足道,為了簡潔和干凈的代碼,多次執行准備好的語句是完全可以接受的。 如果您需要一個更快的選項來一次將多條記錄插入到數據庫中,那么很可能 PHP 不是正確的工具。

<?php   
$datas = ['1','2','3'];
$datas = ['1','2','3'];
foreach ($datas as $key => $data) {     
    $query_value[] = "('" . $data . "', '" . $datas[$key] . "')";       
}
echo $value_string = implode(",", $query_value);
?>

如果您想插入多個值,可以從具有不同帖子值但要插入同一個表的多個輸入中說出來,然后只需使用:

mysql_query("INSERT INTO `table` (a,b,c,d,e,f,g) VALUES 
('$a','$b','$c','$d','$e','$f','$g'),
('$a','$b','$c','$d','$e','$f','$g'),
('$a','$b','$c','$d','$e','$f','$g')")
or die (mysql_error()); // Inserts 3 times in 3 different rows

在這里,我使用forech進行多行插入..我的代碼是在php和mysqli ..我的第一頁是Add_timetable.php它看起來像這個圖像.. Add_timetable.php預覽結果預覽是這樣的.. 結果預覽

此頁面名為Add_timetable1.php

foreach($_POST['days'] as $row=>$Days)
{include 'dbcon.php';
$s=mysqli_real_escape_string($conn,($_POST['cl']));
$n=mysqli_real_escape_string($conn,($_POST['di']));
$g=mysqli_real_escape_string($conn,($_POST['days'][$row]));
//echo $g[$i];
$a=mysqli_real_escape_string($conn,($_POST['p1'][$row]));
$b=mysqli_real_escape_string($conn,($_POST['p2'][$row]));
$c=mysqli_real_escape_string($conn,($_POST['p3'][$row]));
$d=mysqli_real_escape_string($conn,($_POST['p4'][$row]));
$e=mysqli_real_escape_string($conn,($_POST['p5'][$row]));

$ins=mysqli_query($conn,"select Timetable_Id from key_table");
while ($row=mysqli_fetch_assoc($ins))
                             {


          $att=$row['Timetable_Id']+1;      
          $_SESSION['pp']=$att;   

  }
 $ttid=$_SESSION['pp'];
 $ins1=mysqli_multi_query($conn,"insert into 
 tbl_timetable(T_Id,Class,Division,Days,period1,period2,period3,period4,period5) 
 values('$ttid','$s', '$n', '$g','$a','$b','$c','$d','$e')");

 $upd=mysqli_query($conn,"update Key_table set Timetable_Id ='$ttid'");
 //$ins2=mysqli_query($conn,"insert into tbl_login values('$u','$pas','Staff')");
 }
 ?>
   <script>
   alert("Timetable added successfully");
   window.location="Add_Timetable.php";
   </script>
   You can try this code i am it works correctly..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM