【问题标题】:PHP/MySQL > Update field when link is clickedPHP/MySQL > 点击链接时更新字段
【发布时间】:2011-06-20 20:52:02
【问题描述】:

我需要一个简单代码的帮助,当点击我网站上的链接时,它将更新 MySQL 中的字段 (+1)。这是我的 cmets 数据库上的“报告”按钮。

所以我可以看到一条评论被“举报”了多少次。重要的是脚本不会重定向或加载新页面,只会回显消息或 JS 警报。

感谢您的帮助。

【问题讨论】:

  • 我认为您正在寻找 AJAX。
  • +1 欢迎来到 SO。您对问题的解释越好,您将获得准确的答案 :) 您还可以再次编辑您的问题,并与通过 cmets 在其答案下方回答的人进行互动 :)
  • 你有没有尝试过?您是在寻找可以做什么、实际代码(这里有人为您做)还是什么?

标签: php javascript mysql ajax


【解决方案1】:
$sql = "update `table` set `increment` = `increment` + 1 where `link` = '".$link."'";

这只是查询。您应该查看 jquery ajax 来处理请求

在 some.php 中,您需要一种阅读帖子的方法。

<?php
if(isset($_POST['clicked_row']))
{
    $sql = "UPDATE $row_to_update SET increment = increment + 1 WHERE id = '".$_POST['clicked_row']."'";
    mysql_query($sql);
}
?>

假设您在 ajax 请求中发送行 id,它位于 jquery 帖子的 data 参数中,您的 HTML 需要类似于 &lt;a href="javascript:increment(row_id);"&gt;Add click&lt;/a&gt; 以便 jquery 调用知道要发送什么行到 some.php

【讨论】:

  • 这是防止参与本网站的绝妙方法。单击减号箭头是出于什么原因?他说简单。根据他的问题,他似乎不知道您可以通过声明“行 = 行 + 1”来增加数据库表的计数,因此答案是有效的。如果不是,那是什么?整个 jquery 语句加上 php 和 mysql 的 post 脚本?没有提供表名,所以你必须通用。那么为什么不是这个问题的每个答案都停靠呢?说真的,人们。
  • 感谢您的回答。我可以进行查询,但单击链接时如何运行它?
  • @Kai Qing - 冷静,如果你投反对票,这不是世界末日。我没有对你投反对票,也不会像现在这样,但在宏伟的计划中,它会被洗掉。 :)
  • jurka 在我看来是最好的例子。我将使用通用 PHP 示例更新我的帖子以处理请求
  • @Jared - 如果我留下诸如“杜赫听说过 jquery”之类的评论或完全无用的评论,我会理解的,但我的回答与许多开发人员通常忽略的事情有关。是的,这不是一个完整的例子,但问题没有具体说明这些事情。因此,我没有写一个 3 页的 html php js 示例,而是写了一个对问题中唯一看起来直接的部分的回复。我和这里的许多人一样,每天都专业地处理这些东西,并在提交之间或编译时回答问题。毫无意义的一票否决只会给你一个永远不会回来的理由。
【解决方案2】:

你可以做什么的大纲。我做了一些假设,并选择了使用 URL 方法而不是 POST 的 GET;如果您更喜欢使用 POST,请根据口味进行编辑。

另一个注意事项 - 你可能想要一个标志表,以便让你关注谁标记了谁,也许让他们添加评论等......只是一个想法。

这只是为了让您了解如何按照您的要求去做。我还没有测试过代码,所以买家要小心。这只是一个起点。

view.php

您可以在此处获得最终用户单击以激活标志脚本的链接。在您的标记中的某处,您可能会有类似...

<a class="flag" href="flag.php?comment=100">Flag</a>

然后,在 view.php 内容中,您将拥有尝试 jQuery 异步 javascript 请求的点击事件代码(在这种情况下为 $.ajax(),可以是 $.get 或 $.post,或者完全类似的其他库MooTools 或原型)。

该示例演示了服务器将在 data 参数中返回 JSON 格式的文本,然后对其进行评估以检查服务器的响应内容(成功?失败?部分成功?需要登录?)。见http://json.org/

<script type="text/javascript">

$(document).ready(function(){
    $('a.flag').click(function(event){
        $.ajax({
            type: "GET",
            url: $(this).attr('href'),
            data: dataString,
            dataType: "json",
            success: function (data) {
                if (data.error == -1) {
                    // Not logged in, redirect to login page.
                    window.location = 'login.php';
                } else if (data.flagged == 1 && data.count != -1) {
                    // Success! With a count too.
                    alert('Comment flagged ('+data.count+' times flagged).');
                } else {
                    switch(data.error) {
                        case 1:
                            alert('Comment not found');
                        break;
                        case 2:
                            alert('Comment not flagged due to an update error.');
                        break;
                        case 3:
                            alert('Comment flagged but count not returned.');
                        break;
                        default:
                            alert('There was a general error flagging the comment.');
                        break;
                    }
                }
            },
            error: function(){
                alert('Comment not flagged; general send error.');
            }
        });

        // Call these to prevent the a tag from redirecting
        // the browser to the a-tags href url.
        event.preventDefault();
        return false;
    });
});

</script>

flag.php

flag.php 是允许您运行 mysql 查询的服务器页面,当然使用 PHP,然后使用一些 JSON 格式的文本进行响应。页面返回的内容(文本)如下所示:

{"flagged":1,"count":15,"error":0}

这将向您的调用页面(在浏览器中)表明该评论已被标记,已被标记 15 次(差评、差评),并且没有错误。

这很重要:这等同于 HTML。这种类型的文本是数据,并在响应 $.ajax() 函数时被解析回 Javascript 对象。所以,不要在它周围放任何 HTML,因为那不是你应该做的。有关示例,请参阅http://www.json.org/example.html

<?php

// Need to output JSON headers and try to prevent caching.
session_cache_limiter('nocache');
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');

// Our JSON array to return
//   - flagged would be 1 = success, 0 = failure
//   - count would return the # flags, with -1 no return #
//   - error code, see comments for description
$json = array('flagged'=>0,'count'=>-1,'error'=>0);

// Your logged in check code goes here 
// you don't want non-logged in people doing this

// Here, however you test to find out if someone is logged in,
// check and return a -1 error to redirect the login.    
if (!$logged_in) {
    // error -1 = not logged in, redirect browser
    $json['error'] = -1;
    exit(echo(json_encode($json)));
}

// Your mysql connection code goes here

$comment = mysql_real_escape_string($_GET['comment']);

if (empty($comment) || !is_numeric($comment)) {
    // error 1 = comment id not found
    $json['error'] = 1;
} else {
    $result = mysql_query("
UPDATE comments 
SET flags = flags+1 
WHERE commentID = $comment
");
    if (!$result) {
        $json['flagged'] = 0;
        // error 2 = update error
        $json['error'] = 2;
    } else {
        $json['flagged'] = 1;
        $count = mysql_query("
SELECT flags 
FROM comments 
WHERE commentID = $comment 
LIMIT 0, 1
");
        if ($count) {
            $query = mysql_fetch_assoc($count);
            $json['count'] = $query['count'];
        } else {
            // error 3 = updated but did not get count
            $json['error'] = 3;
        }
    }
}

echo json_encode($json);

?>

【讨论】:

  • 这是你应该实际标记为已接受答案的答案。完整且正确。很有帮助。
  • 谢谢青。这种类型的问题可能会有问题,而需要更长、更详细的答案,但(通常)早期的答案会更频繁地获得投票。所以这是一个权衡:给出一个简洁或部分答案并获得几票,或者一个更长、更详细、耗时的答案,并且冒着没人看到它的风险,或者发布者放弃了这个问题。因为我有时间(我所在的地方正面临极端的冬季天气,所以我在家而不是工作),我继续做这个练习。测试它会更好,但我现在没有服务器设置。
  • @Kai Qing - 看,即使你花一些时间在你的答案上并尝试解决它,它并不总是以投票和积分结束。所以,如果你因为一票否决而变得不正常,你在 StackOverflow 上就不会持续太久。 :)
【解决方案3】:

这真的不简单。

你应该看这里: http://www.tizag.com/ajaxTutorial/ajax-mysql-database.php

您的 sql 将如下所示。

"UPDATE post SET flagcount = flagcount + 1 WHERE postID = {$myPostID}"

【讨论】:

  • 可能值得一提的是,他可以使用一个库来处理AJAX操作,即jQuery Mootools等
  • 其实这很简单。您的链接很好,但有点过时了。
  • 是的,jQuery 和 MooTools 也不错。
  • 我给你一个加分,因为你是唯一一个给出查询示例的人,这就是我认为的问题所在。你是如何做到不被刺伤的?
【解决方案4】:

是的,您应该寻找 ajax 向您的一些 php 脚本发出 POST 请求,从而升级数据库中的答案。在 jquery 中是这样的吗?

$('a').click(function(event) {
    $.ajax({
       type: "POST",
       url: "some.php", // page where insertion to database should have made
       data: "name=John",
       success: function(msg){
         alert("Counter updated" );
       }
     });
 });

【讨论】:

    【解决方案5】:

    使用jQuery 发送AJAX 请求:

    $.post('yourScript.php', {commentID: yourCommentId});
    

    第二个参数是请求数据。更改它以满足您的需求。如果要在请求完成后执行 JavaScript 函数:

    $.post('yourScript.php', {commentID: yourCommentId}, function(data) {
    
    });
    

    【讨论】:

      【解决方案6】:

      我可以只使用表格吗?

      <form method="post" action="report.php">
        <input type="hidden" name="report">
        <input type="submit" name="submit" value="report">
      </form>
      

      然后在report.php文件中有查询?

      【讨论】:

      • 是的,但这会重定向到report.php,您必须重定向回表单所在的页面。查看 jQuery 和 $.ajax.
      • 嗯,想一想:我有点喜欢它现在重定向到新页面的想法,我想我会有一个文本框,以便用户可以提交他们报告它的原因:)跨度>
      • 您也可以让 jquery 拉出一个包含文本字段的框。使用 $('#your_form').toggle();将在单击时显示和隐藏它,然后您可以使用 var message = $('#text_area').val(); 获取消息和字段 ID var id = $('#field_id').val();然后将这些变量添加到 jquery 数据参数中。这假设您的文本区域的 id 为“text_area”,而要增加的字段的隐藏输入 id 为“field_id”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多