【发布时间】: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。在
mysqli和PDO 中执行这些操作非常简单,其中任何用户提供的数据都使用?或:name指示符指定,稍后使用bind_param或execute填充,具体取决于您是哪个使用。 -
提示:如果您使用 PDO 或
mysqli,您可以将占位符直接绑定到$_POST值,绝对不需要中间变量。这样可以节省大量代码,减少错误,并使您的查询更加安全。