我正在构建一个应用程序,用户可以在其中重新订购商品(并将订单保存到数据库)。用户重新排序的项目是导航链接,它们是从 php 循环在页面上动态生成的:
$nav_links.='<li class="collection-item ui-state-default item" data-ord="'.$navorder.'" data-url="'.$pageurlname.'"><a>' .$pagename. '</a></li>';}
$navorder 是导航中页面的顺序 $pageurlname 是用于动态调用页面的字符串(index.php?page=$pageurlname),是表中的唯一键。
我正在使用 jqueryUi 可排序功能来进行流程拖放,它工作正常,每次我对链接重新排序时,新顺序都会更新为“data-ord”..脚本:
$('#sortable').sortable({
stop: function(event, ui){
$(".sortable li").each(function(i, el){
$(el).attr('data-ord',$(el).index()+1);
});
}
});
现在问题来了,这是我的ajax脚本:
$(document).on('click','.saveorder',function(){
var neworder = $('.collection-item').attr('data-ord');
var pgurl = $('.collection-item').attr('data-url');
$.ajax({
type:'POST',
dataType:'text',
url:'/rs/pages/nav_order.php',
data: { neworder:neworder, pgurl:pgurl },
success: function(data) {console.log(data); $('#response').html(data);},
error: function(data) {console.log('Error!', data); }
});
});
我是 ajax 新手,所以它主要是基于我在其他问题中找到的脚本构建的。 (我能够成功地将脚本链接到我的其他功能)但是在这种情况下它不起作用。问题似乎是我正在尝试发布多行的多个数据(此时我有 4 个链接,我正在尝试重新排序,但链接计数可能或多或少)。当我尝试获取变量“neworder”和“pgurl”的值(使用警报)时,它始终仅显示第一项的值。
我已经尝试了在类似问题中找到的很多解决方案,但没有一个起作用,仅仅是因为用户发布表单数据然后将其序列化,这不是我的情况,因为我没有从表单发送数据。
最后是 nav_order.php (我猜这里也是错误的,可能需要添加 foreach 但首先我需要让 ajax 正常工作):
<?php
include "/rs/include/db.php";
$neworder = $_POST['neworder'];
$pgurl = $_POST['pgurl'];
$query = mysqli_query($Connection, "UPDATE horus_pages SET nav_order='$neworder' WHERE url_name='$pgurl'") or die (mysqli_error($Connection));
echo 'Reordered';
?>
此外,当我检查控制台时,没有数据。
那么请您告诉我如何更正ajax脚本以发送每个对象的数据,然后在php脚本中正确处理它?希望我清楚地描述了我的问题。感谢您的任何帮助。
最佳答案
将 data-id="your_database_id"放入链接 html 中。如果有多个记录具有相同的 href,则使用 href 在数据库中选择它们会很慢并且会出现错误。
您有保存按钮,可以发送它找到的第一个链接的顺序和 href 吗?当多个项目更改顺序时会发生什么?如果你有很多链接,你会为每次保存抛出数百个 mysql 更新?
您最好将 json 发送到您的 php.ini。类似这样的事情:
[{id:123,订单:332},{id:124,订单:334},...]
dataType:'text' 变为 dataType:'json'
如果您不关心可扩展性,那么这将在后端工作。
$data = file_get_contents("php://input");
$links = json_decode($data, true);
foreach($links as $link) {
$order = intval($link['order']);
$id = intval($link['id'])
// UPDATE table SET `order` = '$order' WHERE id = '$id'
}
顺便说一句。您的 php 代码允许 SQL 注入(inject)。那就不好了
- 也许您可以使订单“ float ”并制定一个算法来查找空位。这将使您能够将这 100 个 SQL 请求减少到 1 个。
关于php - 发送多个AJAX数据到PHP并更新Mysql数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46179246/