【问题标题】:php ajax mysql update using for loop taking more time to execute what's good practice?php ajax mysql 更新使用 for 循环需要更多时间来执行什么好的做法?
【发布时间】:2022-09-23 01:38:44
【问题描述】:

在这里,我需要一次更新 100 多个数据。这个查询对我有用,但它太慢了,至少需要 15 到 20 秒才能执行。 我尝试了几件事但失败了 任何帮助表示赞赏。我还是学习者。

<?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\"];
    $PurchaseRate = $_POST[\"PurchaseRate\"];
    $GeneralRate = $_POST[\"GeneralRate\"];
    $WholeSaleRate = $_POST[\"WholeSaleRate\"];
    $WholeSaleQty = $_POST[\"WholeSaleQty\"];    
    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]);
        
        $PurchaseRate_clean = mysqli_real_escape_string($conn, $PurchaseRate[$count]);
        $GeneralRate_clean = mysqli_real_escape_string($conn, $GeneralRate[$count]);
        
        $WholeSaleRate__clean = mysqli_real_escape_string($conn, $WholeSaleRate[$count]);
        $WholeSaleQty_clean = mysqli_real_escape_string($conn, $WholeSaleQty[$count]);
                
        $updatequery = \"UPDATE table1 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 . \"\',
                            `PurchaseRate` = \'\" . $PurchaseRate_clean . \"\',
                            `GeneralRate` = \'\" . $GeneralRate_clean . \"\',
                            `WholeSaleRate` = \'\" . $WholeSaleRate__clean . \"\',
                            `WholeSaleQty` = \'\" . $WholeSaleQty_clean . \"\'
                
                    WHERE close_date=\'\" . $close_date_clean . \"\' 
                    and `item_id` = \'\" . $item_id_clean . \"\'  \";
            
        mysqli_query($conn, $updatequery);

    }
    
    $return_arr = array(\'item_cid\' => $item_cid, \'item_id\' => $item_id, \'op_date\' => $op_date, \'bar\' => $item_type);
    echo json_encode($return_arr);
}
?>   

这个ajax用来初始化大批发布到 php

var item_cid = [];
var item_id = [];
var op_date = [];
var op_value = [];
var close_date = [];
var close_val = [];
var PurchaseRate = [];
var GeneralRate = [];
var WholeSaleRate = [];
var WholeSaleQty = [];        
    
    
// 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);
});
$(\"input[name=\'PurchaseRate[]\']\").each(function() {
    PurchaseRate.push(this.value);
});
$(\"input[name=\'GeneralRate[]\']\").each(function() {
    GeneralRate.push(this.value);
});
$(\"input[name=\'WholeSaleRate[]\']\").each(function() {
    WholeSaleRate.push(this.value);
});
$(\"input[name=\'WholeSaleQty[]\']\").each(function() {
    WholeSaleQty.push(this.value);
});


$.ajax({
        url: myurl,
        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,
            PurchaseRate: PurchaseRate,
            GeneralRate: GeneralRate,
            WholeSaleRate: WholeSaleRate,
            WholeSaleQty: WholeSaleQty
        },
        dataType: \'JSON\',
        success: function(response) {
            //success 
        } 
    

 

这里 php ajax html 代码的每一步都检查正确,它在循环中的 mysql 查询的唯一 php 部分需要修复。

  • 对于数百个单独的 UPDATE 查询来说,这并不是一个糟糕的时间。
  • 良好的代码缩进将帮助我们阅读代码,更重要的是它会有所帮助你调试你的代码Take a quick look at a coding standard 为您自己的利益。您可能会被要求在几周/几个月内修改此代码,最后您会感谢我的。
  • 您的脚本对SQL Injection Attack 开放。即使是if you are escaping inputs, its not safe!,您也应该始终在MYSQLI_PDO API 中使用prepared parameterized statements,而不是将用户提供的值连接到查询中。永远不要相信任何用户输入!这也将消除未转义字符问题,例如文本字符串中的 \'
  • 使用参数准备一次查询,然后对每个数据项运行一次执行。通过这种方式,您可以删除数据库往返行程,以便为每个数据项编译相同的查询。您还可以更安全地访问数据库

标签: php mysql ajax mysqli


【解决方案1】:

如果您在循环之外准备查询,您将只编译一次查询。如果您在循环中使用mysqli_query(),则每次更新都必须编译一次查询,这是您可以不用的开销,因为这完全是浪费时间。

因此,将查询编写为准备好的参数化查询,如下所示,以便编译一次,然后使用它多次执行更新。这不会带来神奇的改进,但它应该是您始终进行数据库查询的方式,因为它还可以从 SQL Injection Attack 预先保护您的数据库


        $sql = "UPDATE table1 
                SET `item_cid` = ?, `item_id` = ?, `op_date` = ?
                    `op_value` = ?, `close_date` = ?, `close_val` = ?, 
                    `PurchaseRate` = ?, `GeneralRate` = ?, 
                    `WholeSaleRate` = ?, `WholeSaleQty` = ?
                WHERE close_date=? and `item_id` = ?";

        $stmt = $conn->prepare($sql);

        foreach( $_POST["item_id"] as $idx => $itemid ) {
            // you may have to check the data types used in here
            // however mysqli does not normally care about that as much as you might hope
            $stmt->bind_param('ssssssssssss',
                                $_POST["item_cid"][$idx],
                                $itemid,
                                $_POST["op_date"][$idx],
                                $_POST["op_value"][$idx],
                                $_POST["close_date"][$idx],
                                $_POST["close_val"][$idx],
                                $_POST["PurchaseRate"][$idx],
                                $_POST["GeneralRate"][$idx],
                                $_POST["WholeSaleRate"][$idx],
                                $_POST["WholeSaleQty"][$idx],
                                $_POST["close_date"][$idx],
                                $_POST["item_id"][$idx]
                    );
            $stmt->execute();
        }

        // not sure what you are trying to do here 
        // as these are arrays and you do this after the loop
        $return_arr = array('item_cid' => $item_cid, 'item_id' => $item_id, 'op_date' => $op_date, 'bar' => $item_type);
        echo json_encode($return_arr);
    }  

【讨论】:

    猜你喜欢
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 2020-08-28
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多