如何使用 PHP MySQL ajax 在数据库中插入多行使用更好的技术来更快地插入
how to insert multiple rows inside database using PHP MySQL ajax using better technique for faster insert
在这里,我尝试同时插入多行,在我的情况下,同时插入多行超过 200-250 行,但出现以下错误
Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini
但是当我增加 max_input_vars = 3000 时,这个已解决的问题现在可以插入了,但是它花费了太多时间。
我想更快地插入但需要帮助
这是我的php代码
<?php
include "connection.php";
if (isset($_POST['close_val'])) {
$item_cid = $_POST["item_cid"];
$item_id = $_POST["item_id"];
$op_date = $_POST["op_date"];
$op_value = $_POST["op_value"];
$close_date = $_POST["close_date"];
$close_val = $_POST["close_val"];
// Converting the array to comma separated string
for ($count = 0; $count < count($item_id); $count++) {
$item_cid_clean = mysqli_real_escape_string($conn, $item_cid[$count]);
$item_id_clean = mysqli_real_escape_string($conn, $item_id[$count]);
$op_date_clean = mysqli_real_escape_string($conn, $op_date[$count]);
$op_value_clean = mysqli_real_escape_string($conn, $op_value[$count]);
$close_date_clean = mysqli_real_escape_string($conn, $close_date[$count]);
$close_val_clean = mysqli_real_escape_string($conn, $close_val[$count]);
$sql = "SELECT COUNT(*) AS cntuser from bar_opening_details WHERE `item_id` = '" . $item_id_clean . "' AND close_date='" . $close_date_clean . "' AND item_cid='" . $item_cid_clean . "' ";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result);
$count1 = $row['cntuser'];
if ($count1 > 0) {
// update
$updatequery = "UPDATE bar_opening_details SET
`item_cid` = '" . $item_cid_clean . "',
`item_id` = '" . $item_id_clean . "',
`op_date` = '" . $op_date_clean . "',
`op_value` = '" . $op_value_clean . "',
`close_date` = '" . $close_date_clean . "',
`close_val` = '" . $close_val_clean . "'
WHERE close_date='" . $close_date_clean . "' and `item_id` = '" . $item_id_clean . "' ";
mysqli_query($conn, $updatequery);
} else {
$insertquery = "INSERT INTO bar_opening_details
(item_cid,
item_id,
op_date,
op_value,
close_date,
close_val) values ('" . $item_cid_clean . "', '" . $item_id_clean . "', '" . $op_date_clean . "', '" . $op_value_clean . "', '" . $close_date_clean . "', '" . $close_val_clean . "')";
mysqli_query($conn, $insertquery);
}
}
// insert
$return_arr = array('item_cid' => $item_cid, 'item_id' => $item_id, 'op_date' => $op_date, "close_val" => $count);
echo json_encode($return_arr);
mysqli_close($conn);
}
这是我的 ajax 代码。使用此 iam 能够发送插入请求,但它需要很多时间
<script>
$(document).ready(function() {
// submit button click
$("#submit").click(function() {
$('#loading').show();
var item_cid = [];
var item_id = [];
var op_date = [];
var op_value = [];
var close_date = [];
var close_val = [];
var Toast = Swal.mixin({
toast: true,
position: 'top-end',
showConfirmButton: false,
timer: 3000
});
// Initializing array with Checkbox checked values
$("input[name='item_cid[]']").each(function() {
item_cid.push(this.value);
});
$("input[name='item_id[]']").each(function() {
item_id.push(this.value);
});
$("input[name='op_date[]']").each(function() {
op_date.push(this.value);
});
$("input[name='op_value[]']").each(function() {
op_value.push(this.value);
});
$("input[name='close_date[]']").each(function() {
close_date.push(this.value);
});
$("input[name='close_val[]']").each(function() {
close_val.push(this.value);
});
$.ajax({
url: 'lib/cbentry.php',
type: 'post',
data: {
item_cid: item_cid,
item_id: item_id,
op_date: op_date,
op_value: op_value,
close_date: close_date,
close_val: close_val
dataType: 'JSON',
success: function(response) {
$('.details').show();
// selecting values from response Object
var name = response.close_val;
$('#loading').hide();
// var email = response.email;
// var lang = response.lang;
// var foundjquery = response.foundjquery;
Toast.fire({
icon: 'success',
title: 'Data Entered Successfully'
})
// setting values
$('#name').text(name);
// $('#email').text(email);
// $('#lang').text(lang);
// $('#foundjquery').text(foundjquery);
}
});
});
});
</script>
JSON
允许无限项的简单两行修复:建议您将数组编码为 JSON 用于 POST,然后使用 json_decode()
在它到达 PHP.
但是,我不得不问...真的有数百个新的(或更改的)行吗?如果只有几行,请考虑通过 AJAX 一次传送一行到 PHP —— 可能基于鼠标离开“焦点”后值是否发生变化。许多 AJAX 的小调用会产生大量开销(启动许多 PHP 线程),但任务会在您离开网页时完成。它会“感觉”好像每件事都是“瞬间”。 (好吧,如果你有 1000 个用户同时做同样的事情,这种技术可能会使服务器过载。)
数组
这是另一种方法:使用“数组”。如果输入名称以 []
:
结尾
<input type=text name=x[] ">
将以数组形式出现在 $x
中。如果你有多个,那么下标 (0, 1, ...) 会让你匹配它们。
$list = GetArray('list');
function GetArray($fn) {
// Input an array of things from
// echo "<input type=checkbox name=\"fn[]\" value=\"$out_fn\" $checked>\n";
// url has &fn[]=aaa&fn[]=ccc
$req = @$_REQUEST[$fn]; // Note: this must NOT end in []
$fns = empty($req) ? [] :
(is_array($req) ? $req :
explode(',', $req));
return $fns; // always an array
}
($_REQUEST
包括 $_POST
;如果您愿意,可以更改它)
插入
至于 MySQL 插入的速度...具有 100 行的单个 INSERT
将 运行 100 1 行 INSERTs
快 10 倍。所以,如果真的有数百个新行,我建议“批量”插入。
如果大多数行已经在 table 中,那么 INSERT IGNORE
是一种 'simple' 处理方式。但是...如果 table 上有一个 AUTO_INCREMENT
id,复制品将“燃烧”id。
IODKU 是处理新行或修改行的最佳方式。它也可以批处理。但是,如果查询不包括可用的原始 id
,它也会燃烧 ID。
(我细说,你细说。)
在这里,我尝试同时插入多行,在我的情况下,同时插入多行超过 200-250 行,但出现以下错误
Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini
但是当我增加 max_input_vars = 3000 时,这个已解决的问题现在可以插入了,但是它花费了太多时间。
我想更快地插入但需要帮助
这是我的php代码
<?php
include "connection.php";
if (isset($_POST['close_val'])) {
$item_cid = $_POST["item_cid"];
$item_id = $_POST["item_id"];
$op_date = $_POST["op_date"];
$op_value = $_POST["op_value"];
$close_date = $_POST["close_date"];
$close_val = $_POST["close_val"];
// Converting the array to comma separated string
for ($count = 0; $count < count($item_id); $count++) {
$item_cid_clean = mysqli_real_escape_string($conn, $item_cid[$count]);
$item_id_clean = mysqli_real_escape_string($conn, $item_id[$count]);
$op_date_clean = mysqli_real_escape_string($conn, $op_date[$count]);
$op_value_clean = mysqli_real_escape_string($conn, $op_value[$count]);
$close_date_clean = mysqli_real_escape_string($conn, $close_date[$count]);
$close_val_clean = mysqli_real_escape_string($conn, $close_val[$count]);
$sql = "SELECT COUNT(*) AS cntuser from bar_opening_details WHERE `item_id` = '" . $item_id_clean . "' AND close_date='" . $close_date_clean . "' AND item_cid='" . $item_cid_clean . "' ";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result);
$count1 = $row['cntuser'];
if ($count1 > 0) {
// update
$updatequery = "UPDATE bar_opening_details SET
`item_cid` = '" . $item_cid_clean . "',
`item_id` = '" . $item_id_clean . "',
`op_date` = '" . $op_date_clean . "',
`op_value` = '" . $op_value_clean . "',
`close_date` = '" . $close_date_clean . "',
`close_val` = '" . $close_val_clean . "'
WHERE close_date='" . $close_date_clean . "' and `item_id` = '" . $item_id_clean . "' ";
mysqli_query($conn, $updatequery);
} else {
$insertquery = "INSERT INTO bar_opening_details
(item_cid,
item_id,
op_date,
op_value,
close_date,
close_val) values ('" . $item_cid_clean . "', '" . $item_id_clean . "', '" . $op_date_clean . "', '" . $op_value_clean . "', '" . $close_date_clean . "', '" . $close_val_clean . "')";
mysqli_query($conn, $insertquery);
}
}
// insert
$return_arr = array('item_cid' => $item_cid, 'item_id' => $item_id, 'op_date' => $op_date, "close_val" => $count);
echo json_encode($return_arr);
mysqli_close($conn);
}
这是我的 ajax 代码。使用此 iam 能够发送插入请求,但它需要很多时间
<script>
$(document).ready(function() {
// submit button click
$("#submit").click(function() {
$('#loading').show();
var item_cid = [];
var item_id = [];
var op_date = [];
var op_value = [];
var close_date = [];
var close_val = [];
var Toast = Swal.mixin({
toast: true,
position: 'top-end',
showConfirmButton: false,
timer: 3000
});
// Initializing array with Checkbox checked values
$("input[name='item_cid[]']").each(function() {
item_cid.push(this.value);
});
$("input[name='item_id[]']").each(function() {
item_id.push(this.value);
});
$("input[name='op_date[]']").each(function() {
op_date.push(this.value);
});
$("input[name='op_value[]']").each(function() {
op_value.push(this.value);
});
$("input[name='close_date[]']").each(function() {
close_date.push(this.value);
});
$("input[name='close_val[]']").each(function() {
close_val.push(this.value);
});
$.ajax({
url: 'lib/cbentry.php',
type: 'post',
data: {
item_cid: item_cid,
item_id: item_id,
op_date: op_date,
op_value: op_value,
close_date: close_date,
close_val: close_val
dataType: 'JSON',
success: function(response) {
$('.details').show();
// selecting values from response Object
var name = response.close_val;
$('#loading').hide();
// var email = response.email;
// var lang = response.lang;
// var foundjquery = response.foundjquery;
Toast.fire({
icon: 'success',
title: 'Data Entered Successfully'
})
// setting values
$('#name').text(name);
// $('#email').text(email);
// $('#lang').text(lang);
// $('#foundjquery').text(foundjquery);
}
});
});
});
</script>
JSON
允许无限项的简单两行修复:建议您将数组编码为 JSON 用于 POST,然后使用 json_decode()
在它到达 PHP.
但是,我不得不问...真的有数百个新的(或更改的)行吗?如果只有几行,请考虑通过 AJAX 一次传送一行到 PHP —— 可能基于鼠标离开“焦点”后值是否发生变化。许多 AJAX 的小调用会产生大量开销(启动许多 PHP 线程),但任务会在您离开网页时完成。它会“感觉”好像每件事都是“瞬间”。 (好吧,如果你有 1000 个用户同时做同样的事情,这种技术可能会使服务器过载。)
数组
这是另一种方法:使用“数组”。如果输入名称以 []
:
<input type=text name=x[] ">
将以数组形式出现在 $x
中。如果你有多个,那么下标 (0, 1, ...) 会让你匹配它们。
$list = GetArray('list');
function GetArray($fn) {
// Input an array of things from
// echo "<input type=checkbox name=\"fn[]\" value=\"$out_fn\" $checked>\n";
// url has &fn[]=aaa&fn[]=ccc
$req = @$_REQUEST[$fn]; // Note: this must NOT end in []
$fns = empty($req) ? [] :
(is_array($req) ? $req :
explode(',', $req));
return $fns; // always an array
}
($_REQUEST
包括 $_POST
;如果您愿意,可以更改它)
插入
至于 MySQL 插入的速度...具有 100 行的单个 INSERT
将 运行 100 1 行 INSERTs
快 10 倍。所以,如果真的有数百个新行,我建议“批量”插入。
如果大多数行已经在 table 中,那么 INSERT IGNORE
是一种 'simple' 处理方式。但是...如果 table 上有一个 AUTO_INCREMENT
id,复制品将“燃烧”id。
IODKU 是处理新行或修改行的最佳方式。它也可以批处理。但是,如果查询不包括可用的原始 id
,它也会燃烧 ID。
(我细说,你细说。)