PHP MySQL - 通知面板,单击下拉列表时更新数据库

时间:2013-11-14 09:09:46

标签: php mysql

我有一个简单的下拉菜单,显示我的用户的通知。当用户上次检查其通知(在我的用户表中存储为notescheck)之前创建的登录用户通知时,会突出显示通知下拉列表。我想要在用户点击下拉菜单查看通知列表时更新该用户的备注。

目前我可以让它更新,但每次加载标题时都会发生这种情况,所以如果用户收到通知,然后导航到另一个页面,它会自动更新。

所以我的问题是如何执行此操作:

mysqli_query($db_conx, "UPDATE users SET notescheck=now() WHERE username='$username' LIMIT 1");

但是只有当用户点击标题中的通知下拉列表时才会显示?

如果需要,以下是我标题的完整代码:

<div class="sticky_wrapper">
<?php

session_start();

$username = $_SESSION['username'];

?>

<!-- Le javascript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="http://localhost:8888/cge/assets/js/jquery.js"></script>
    <script src="http://localhost:8888/cge/assets/js/bootstrap-transition.js"></script>
    <script src="http://localhost:8888/cge/assets/js/bootstrap-alert.js"></script>
    <script src="http://localhost:8888/cge/assets/js/bootstrap-modal.js"></script>
    <script src="http://localhost:8888/cge/assets/js/bootstrap-dropdown.js"></script>
    <script src="http://localhost:8888/cge/assets/js/bootstrap-scrollspy.js"></script>
    <script src="http://localhost:8888/cge/assets/js/bootstrap-tab.js"></script>
    <script src="http://localhost:8888/cge/assets/js/bootstrap-tooltip.js"></script>
    <script src="http://localhost:8888/cge/assets/js/bootstrap-popover.js"></script>
    <script src="http://localhost:8888/cge/assets/js/bootstrap-button.js"></script>
    <script src="http://localhost:8888/cge/assets/js/bootstrap-collapse.js"></script>
    <script src="http://localhost:8888/cge/assets/js/bootstrap-carousel.js"></script>
    <script src="http://localhost:8888/cge/assets/js/bootstrap-typeahead.js"></script>
    <!-- main js -->
    <script src="http://localhost:8888/cge/assets/js/main.js"></script>
    <script src="http://localhost:8888/cge/assets/slider/js/bootstrap-slider.js"></script>



    <!-- Typeahead -->
    <script>
        $(function() {
            $("#typeahead").typeahead({
                source: function(typeahead, query) {
                    $.ajax({
                        url: 'http://localhost:8888/cge/source.php',
                        type: 'POST',
                        data: 'query=' + query,
                        dataType: 'JSON',
                        async: false,
                        success: function(data) {
                            typeahead.process(data);
                        }
                    });
                }
            });
        });
    </script>

<div style="padding-top: 60px;"></div>

<!-- WHITE USER STRIP -->
    <div class="navbar navbar-inverse navbar-fixed-top">
      <div class="navbar-inner">
        <div class="container">

    <?php
        if ($username) {
//display USER
            include('./php_includes/db_conx.php');
            $sql = "SELECT notescheck FROM users WHERE username='$username' LIMIT 1";
            $query = mysqli_query($db_conx, $sql);
            $row = mysqli_fetch_row($query);
            $notescheck = $row[0];
            $sql = "SELECT id FROM notifications WHERE username='$username' AND date_time > '$notescheck' LIMIT 1";
            $query = mysqli_query($db_conx, $sql);
            $numrows = mysqli_num_rows($query);

            $sql = "SELECT * FROM friends WHERE user2='$username' AND accepted='0' ORDER BY datemade DESC";
            $friendquery = mysqli_query($db_conx, $sql);
            $friendnumrows = mysqli_num_rows($friendquery);
            if ($numrows == 0 && $friendnumrows == 0) {
                $notifications = '<i class="fa fa-inbox"></i>';
            } else {
                $notifications = '<i style="color:#3dca9c" class="fa fa-inbox"></i>';
                    }

//notifications panel
            $notification_list = "";
            $sql = "SELECT * FROM notifications WHERE username LIKE BINARY '$username' AND date_time > '$notescheck' ORDER BY date_time DESC";
            $query = mysqli_query($db_conx, $sql);
            $numrows = mysqli_num_rows($query);

            if($numrows < 1 && $friendnumrows < 1){
            $notification_list = "<li><a href='#'>You do not have any notifications</a></li>";
            } else {
            while ($row = mysqli_fetch_array($query, MYSQLI_ASSOC)) {
            $noteid = $row["id"];
            $initiator = $row["initiator"];
            $cardid = $row["cardid"];
            $app = $row["app"];
            $note = $row["note"];
            $date_time = $row["date_time"];
            $date_time = strftime("%b %d, %Y", strtotime($date_time));


            $notification_list .= "<li><a href='http://localhost:8888/cge/card.php?id=$cardid'>$note</a></li>";
            }
            while ($row2 = mysqli_fetch_array($friendquery, MYSQLI_ASSOC)) {
            $friendrequester = $row2["user1"];

            $friendrequest_list .= "<li><a href='http://localhost:8888/cge/account/notifications.php'><strong>$friendrequester</strong> sent a friend request</a></li>";
            }
            }
                    mysqli_query($db_conx, "UPDATE users SET notescheck=now() WHERE username='$username' LIMIT 1");
            echo
            "<ul class='nav'>
              <li class='dropdown'>
                <a href='#' class='dropdown-toggle' data-toggle='dropdown'>$username <b class='caret'></b></a>
                <ul class='dropdown-menu'>
                  <li><a href='http://localhost:8888/cge/account/user.php?u=$username'>View Profile</a></li>
                  <li><a href='#'>Another action</a></li>
                  <li><a href='#'>Something else here</a></li>
                  <li class='divider'></li>
                  <li><a href='http://localhost:8888/cge/account/logout.php'>Log out</a></li>
                </ul>
              </li>
            </ul>

            <ul class='nav pull-right'>
                <li class='dropdown'>".
                "<a href='#' class='dropdown-toggle' data-toggle='dropdown'>" . ($notifications) . "<b class='caret'></b></a>
                <ul class='dropdown-menu'>
                  " . $notification_list;
                  if ($friendrequest_list){
                  echo "<li class='divider'></li>" . $friendrequest_list; }
                  echo "<li class='divider'></li>
                  <li><a href='http://localhost:8888/cge/account/notifications.php'>View all notifications</a></li>
                </ul>
              </li>
            </ul>";
        }
        else
//diplay login or register button
            echo "<ul class='nav login-or-register'>
            <li><a href='http://localhost:8888/cge/account/login.php'>Login or Register</a></li>
           </ul>

           <ul class='nav pull-right'>
            <li><a href='#'>Get a Card Graded!</a></li>
           </ul>";

        if ($_SERVER['QUERY_STRING'] == logout){
            echo "<body onload=\"window.location='http://localhost:8888/cge/index.php'\">"; 
            session_destroy();
        }
    ?>

        </div>
      </div>
    </div>


    <!-- MAIN NAV & LOGO -->
    <div class="nav-second container">
        <div class="row-fluid">
            <div class="logo span4">
                <img src="http://localhost:8888/cge/assets/img/logo.png" />
            </div>

            <div class="main-nav span8">
                <ul class="nav pull-right">
                    <li><a href="#">Browse Cards</a></li>
                    <li><a href="#">Charts</a></li>
                    <li><a href="#">Forum</a></li>
                    <li><a href="#">Blog</a></li>
                    <li><a href="#">How-To Guide</a></li>
                </ul>
            </div>
                <div class="search-bar span8 pull-right">
                    <div class="search-bar-inner pull-right">
                    <form action='http://localhost:8888/cge/search.php' method='get'>
                        <input type="text" placeholder="Enter a Card..." id="typeahead" data-provide="typeahead" autocomplete="off" name ="keyname" value="<?php echo preg_replace('/[^a-zA-Z0-9_\-\­.\(\)\s\!\?\,]/', '' ,$_GET['keyname']);?>"/>
                        <button type="submit" class="btn">Search</button>
                    </form>
                    </div>
                    <hr>
                </div>


        </div>
    </div>

谢谢!

3 个答案:

答案 0 :(得分:0)

只需点击通知面板再进行一次ajax调用并更新数据库,当你获得ajax的成功响应时,就会激活该特定通知。

或者如果你希望它消失,你可以用jquery来删除html,因为你可以从同一个ajax响应中重新加载通知面板的html

答案 1 :(得分:0)

您也可以使用JQuery。将ajax请求发送到仅运行更新查询的文件。

$(".notifications").click(function(){
    $.post('update/notifications.php');
});

其中 update / notifications.php 如下所示

session_start();
$username = $_SESSION['username'];
//connect
mysqli_query($db_conx, "UPDATE users SET notescheck=now() WHERE username='$username' LIMIT 1");

因此,只有在用户实际点击通知时才会运行查询。这是一种方法,我想还有其他人,说实话,我不是100%确定你可以使用会话,但是你只需要发送带有POST请求的用户名。

答案 2 :(得分:0)

除了之前的答案,我还有一些建议可以进一步优化您的代码。而不是运行3个不同的查询

  • 获取检查通知的最后日期(SELECT notescheck FROM users WHERE username ='$ username'LIMIT 1)
  • 获取尚未检查的通知的ID(SELECT id FROM notifications WHERE username ='$ username'AND date_time&gt;'$ notescheck'LIMIT 1)
  • 获取尚未检查的实际通知(SELECT * FROM通知WHERE用户名LIKE BINARY'$ username'和date_time&gt;'$ notescheck'ORDER BY date_time DESC)

您可以将所有3个组合成一个查询,以便为您提取该用户的通知。然后,您可以简单地检查是否返回了行,这将确定要显示的内容。查询如下所示

SELECT n。* 来自通知INNER JOIN用户u ON n.username = u.username WHERE n.username ='$ username'/ *或者你可以使用“LIKE BINARY'$ username'”如果你喜欢* / AND n.date_time&gt; u.notescheck ORDER BY n.date_time DESC