【问题标题】:SQL update via A HREF通过 A HREF 更新 SQL
【发布时间】:2013-11-22 13:08:50
【问题描述】:

我正在尝试通过单击使用 AJAX 的链接来更新 mysql,但我碰壁了。我有代码,但它不起作用。

这里是 AJAX:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>
$(document).ready(function() {
   //bind a listener to "click" event on links with class "markviewed"
   $('a.markviewed').click(function(event) {

  //prevent default behavior just in case
  event.preventDefault();

  //get ids from clicked <a>
  var myid = $(this).attr('data-myid');
  var postid = $(this).attr('data-postid');

  //ping the address to mark clicked link as viewed
  $.ajax('http://mywebsite.com/mark_viewed.php?myid=' + myid + '&postid=' + postid');

  //redirect to the link in the href attribute
  window.location.href = $(this).attr('href');

   });
});
</script>

这应该创建一个 href 类,单击该类时会点击 mywebsite.com/mark_viewed.php,它会使用以$myid$postid 发送的关键变量更新我的数据库。

这里是mark_viewed.php:

<?php
$con=mysqli_connect("XXX","XXX","XXX","XXX");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

// get values sent from address bar
$myid=$_GET['myid'];
$postid=$_GET['postid'];

mysqli_query($con,"UPDATE comments SET status='viewed' WHERE to_id ='$myid' AND id='$postid'");
mysqli_close($con);
?>

最后这是用户看到的链接:

$myid = $row['user_id']; // my id
$name = $row['board_name']; // collection name
$boardid = $row['board_id']; // collection id
$postid = $row['pin_id']; // post id
$url = $row['pin_url']; // image url
echo "<li><a href='/board/pins/$boardid/$postid' data-myid=' . $myid . ' data-postid=' . $postid . ' class='markviewed'>";
echo "<img src='$url' height='50' width='50'>";
echo "New comment in $name.";
echo "</a></li>";

但是,在测试中它不起作用。单击时的链接只是浏览到带有新评论的页面,并且数据库未受影响。

我做错了什么?

【问题讨论】:

  • 删除window.location.href = $(this).attr('href');
  • 您的 ajax 调用正在进行吗?如果是这样,发生了什么,您是否遇到错误?
  • 你应该,不......你需要在查询中使用之前验证/清理你的 $myid$postid 变量。请记住,用户输入是邪恶的!
  • 这是一个非常非常不安全的代码。改进的一个小技巧是将 $myid 和 $postid 转换为 (int) 但我建议您学习如何使用 PDO (docs.php.net/pdo.prepared-statements)
  • 我尝试删除该行但仍然一无所获,而且我没有收到任何错误。

标签: php jquery mysql ajax


【解决方案1】:
$(document).ready(function() {
   $('a.markviewed').click(function(event) {
   event.preventDefault();
   var myid = $(this).attr('data-myid');
   var postid = $(this).attr('data-postid');
   $.ajax('http://mywebsite.com/mark_viewed.php?myid=' + myid + '&postid=' + postid).done(function(){
  window.location.href = $(this).attr('href');
});

   });
});

问题是调用了 ajax 函数(但在位置更改之前未完成)。所以它正在更改位置。所以等待 ajax 函数完成并在成功回调中更改位置

【讨论】:

  • 这导致没有活动链接
【解决方案2】:

您的AJAX 呼叫没有足够的时间完成。 AJAX 中的第一个 A 代表异步,这意味着下一个命令 window.location.href = $(this).attr('href'); 在您的 AJAX 调用之后并且能够完成之前立即运行。

将重定位移动到您的AJAX 回调中,例如

  //ping the address to mark clicked link as viewed
  $.ajax('http://mywebsite.com/mark_viewed.php?myid=' + myid + '&postid=' + postid', function(){
       //redirect to the link in the href attribute
       window.location.href = $(this).attr('href');
  });

您还应该考虑添加等待动画,以防您的通话需要很长时间。

作为一种良好的编码习惯,最好避免像这样劫持点击,并在目标页面的开头使用 php 记录所需的信息,然后打印新的页面内容。

如果链接是外部链接,您可以链接到重定向页面 (redirect.php?target_url=www.externallink.com),该页面记录所需信息并立即调用 header(Location: "www.externallink.com")。这样用户就不会在您的网站上看到任何可察觉的延迟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2011-01-06
    • 2019-12-03
    • 2021-03-16
    • 2013-12-04
    • 2019-07-21
    • 2011-05-20
    相关资源
    最近更新 更多