【问题标题】:Ajax datatable Update with PHP MySql使用 PHP MySql 更新 Ajax 数据表
【发布时间】:2021-03-24 12:39:00
【问题描述】:

我想使用 Ajax 更新数据,下面是示例代码。 SweetAlert 被替换为它已被更新,但它在数据库中没有生效,因此它给出了一个错误。

Ajax 代码

这是单击提交按钮时表单提交的 Ajax 脚本。

<script>
               $('#submit').on('click', function(event){
                event.preventDefault();
                var firstname = $('#firstname').val();
                var othername = $('#othername').val();
                var gender = $('#gender').val();
                var id_type = $('#id_type').val();
                var id_number = $('#id_number').val();
                var issue_date = $('#issue_date').val();
                var business_place = $('#business_place').val();
                var food_type = $('#food_type').val();
                var screened = $('#screened').val();
                var sub_metro = $('#sub_metro').val();
                var telephone = $('#telephone').val();
                var get_date = $('#get_date').val();
                var chit_number = $('#chit_number').val();
                var remarks = $('#remarks').val();
                var user_id = $('#user_id').val();
                var vendor_id = $('#vendor_id').val();

if (firstname!="" &&othername!="" && food_type!=""){
            $.ajax({
                url: "action/vendor_update.php",
                type: "POST",
                data: {
                    firstname:firstname, othername:othername, gender:gender, 
id_type:id_type, id_number:id_number, issue_date:issue_date,    
business_place:business_place, food_type:food_type, screened:screened, 
sub_metro:sub_metro, telephone:telephone, get_date:get_date,
                    chit_number:chit_number, remarks:remarks, user_id:user_id, vendor_id:vendor_id,
                },
                cache: false,
                success: function(data){
                    if(data.statusCode=200){
                        $('#dataForm').find('input:text').val('');
                            alert('Updated');
                            })      
                     }
                    else if (data.statusCode=201)
                     {
                            alert('Cannot Update');
                     }
                }
            });
        
        }else{
            alert('All fields are mandatory');
           }
    });

PHP 代码 ---> action/vendor_update.php

此代码用于php服务器端,用于将数据插入数据库。

<?
        session_start();
        // include('../includes/session.php');
        include('./includes/connection.php');
        
        $query = $dbh->$prepare("UPDATE vendors SET Firstname=:firstname, Othername=:othername, Telephone=:telephone, Gender=:gender, IdType=:id_type, IdNumber=:id_number, IdDate=:issue_date, BusinessPlace=:business_place, FoodType=:food_type, Notes=:remarks, ScreenStatus=:screened, ChitNumber=:chit_number, UpdatedBy=:user_id WHERE VendorId=:vendor_id");

        $query->execute([
                $firstname = $_POST['firstname'];
                $othername = $_POST['othername'];
                $telephone = $_POST['telephone'];
                $gender = $_POST['gender'];
                $id_type = $_POST['id_type'];
                $id_number = $_POST['id_number'];
                $issue_date = $_POST['issue_date'];
                $business_place = $_POST['business_place'];
                $food_type = $_POST['food_type'];
                $remarks = $_POST['remarks'];
                $screened = $_POST['screened'];
                $chit_number = $_POST['chit_number'];
                $user_id =  $_POST['user_id'];
                $vendor_id = $_POST['vendor_id'];
          ]);
                
        // $query->execute($_POST);

if ($query->execute()){
   echo json_encode(array("statusCode"=>200));
   
} else {
   echo json_encode(array("statusCode"=>500));
}

                

?>

【问题讨论】:

  • 通过直接将参数注入查询中,您完全违背了准备语句的目的。请参阅proper way to do it
  • 顺便说一句,通过了解 jQuery 的序列化函数,您可能可以节省大量重复代码 - 请参阅 api.jquery.com/serialize 。无论如何,要回答您的实际问题,我们需要一些调试信息。是的,你的代码仍然容易受到 SQL 注入的影响——仅仅使用 prepare() 是不够的,你还需要使用参数。
  • 不应该是if (data.statusCode==200) {而不是单=号吗?
  • 警告:尽可能使用带有占位符值的预处理语句,以避免在查询中注入任意数据并创建SQL injection bugs。在mysqliPDO 中执行这些操作非常简单,其中任何用户提供的数据都使用?:name 指示符指定,稍后使用bind_paramexecute 填充,具体取决于您是哪个使用。
  • 提示:如果您使用 PDO 或 mysqli,您可以将占位符直接绑定到 $_POST 值,绝对不需要中间变量。这样可以节省大量代码,减少错误,并使您的查询更加安全。

标签: php mysql ajax


【解决方案1】:

这是清理后的 PHP 代码:

<?php

// Tip:
// * Use named placeholders
// * Define the query string inside prepare() so you can't "miss" and run
//   the wrong query by accident
// * Use single quotes so you can't interpolate variables by accident
//   and create ugly SQL injection bugs
$query = $dbh->prepare('UPDATE vendors SET Firstname=:firstname, Othername=:othername, Telephone=:telephone, Gender=:gender, IdType=:id_type...');

// Use ONE of:

// A) if you have slight differences
$query->execute([
  'firstname' => $_POST['firstname'],
  'othername' => $_POST['othername'],
  'telephone' => $_POST['telephone'],
  ...
]);

// OR

// B) if you're confident the placeholders match 100% and no clean-up
//    such as trim() is necessary.
$query->execute($_POST);

if ($query->execute()) {
  echo json_encode(array("statusCode"=>200));
} else {
  echo json_encode(array("statusCode"=>500));
}
?>

注意:值得注意的是,像这样的代码不需要存在,任何像样的 ORM 都会让这变得微不足道。值得探索您有哪些选择,因为这可能会如此容易得多。

【讨论】:

  • 我已将代码优化为您提供的答案。有用。非常感谢@tadman
猜你喜欢
  • 1970-01-01
  • 2014-09-11
  • 2021-04-16
  • 1970-01-01
  • 2015-04-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
相关资源
最近更新 更多