【问题标题】:How to return latest Mysql entry through JQuery/Ajax request如何通过 JQuery/Ajax 请求返回最新的 Mysql 条目
【发布时间】:2013-04-09 23:09:09
【问题描述】:

我正在尝试通过 ajax 提取 mysql 表的最新条目并将其显示为 div 内的 html 内容。我的 ajax 和 php 运行正常,我唯一的问题是我想查询新条目并在循环内按时间间隔堆叠结果,我遇到了两个问题:让数据表现得像一个正常的javascript 字符串,并让循环只返回唯一的条目。

update.php 文件

$con=mysqli_connect("mydbhost.com","username","password","database_name");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$result = mysqli_query($con,"SELECT * FROM conversations");
$j = 0;
while($row = mysqli_fetch_array($result))
{
$carray[j] =   $row['comment'];
$j++;
}
$comment = (array_pop($carray));
echo $comment;
echo "<br>";
mysqli_close($con);

JQuery Ajax 请求循环:

$(document).ready(function(e){
  var comment;
  function commentLoop() {
    comment = $('#testdiv').load('update.php');
    $('#testdiv').append(comment);
    setTimeout(commentLoop, 6000);
  }
  commentLoop();

  $(document).focus();
});

【问题讨论】:

  • 正如前面的答案所述,您的 SQL 返回表中的所有内容,但随后您遍历所有数据并仅返回回显中的最后一行。此外,您正在使用$_POST['comment'],但没有任何内容发布到脚本中。最重要的是,在您的 AJAX 中,您将页面加载到 div 中......然后将该加载的结果(它是一个非返回函数)附加到同一个 div。所以说真的,这里有很多事情可能对你不利。
  • 我删除了 $_POST('comment')。这与我的错误无关。
  • 您仍在选择表中的所有内容,并且只将其中一个发送回 AJAX 调用。如果需要,请使用会话或其他方法,以便您知道上次加载它时离开的位置,然后将其包含在 select 语句中,以便您选择实际想要处理的正确行数并将它们全部输出以供您使用阿贾克斯。此外,每次运行 commentLoop() 时,您仍在替换整个 DIV。
  • @jon 循环仅使用常规字符串。是什么让将 js 注释变量设置为回显的 php 字符串不同? jsfiddle.net/CaJ2D
  • .load()函数,它将内容放入div中,替换它。保存变量 comment 没有任何作用。

标签: php javascript jquery html ajax


【解决方案1】:

问题在于,通过 SELECT * FROM conversations 你不断地请求整张桌子——尽管你只拿了最后一张。

您的代码需要记住已加载的评论,并且只获取比该评论更新的评论。

例如,假设您的主键是增量的,请执行SELECT * FROM conversations WHERE convid &gt; ?。将? 替换为已加载的最新评论。如果您是第一次加载,只需执行SELECT * FROM conversations

您可以将使用请求参数显示的最后一个评论 id 传递给update.php。我还建议以 JSON 格式返回数据,以便您可以返回评论和 id 的集合并轻松解析它

【讨论】:

  • 不是真的,他只收集了最后一个(查看 while 循环后使用的 array_pop 方法)。此外,他每次调用 load 函数时都会替换整个 DIV。
  • 我的 $comment 变量仅存储数组中的最后一个元素,该数组按条目顺序存储所有 cmets。
  • @Emanegux 是的,但是不需要填充完整的 cmets 数组然后只使用其中一个并丢弃其余的,如果您只想要最后一个,则应该只选择最后一个.
  • @Emanegux 啊抱歉我错过了那个 array_pop 位,但是选择整个对话表不是​​很有效
【解决方案2】:

这将对表格中的 cmets 进行计数,并选择最后输入的注释,然后将它们作为 json 数据传递给 ajax,仅当接收到的计数低于表中 cmets 的计数时:

PHP:

if(isset($_GET['data']))
{   
    $con        = new mysqli('host', 'user', 'password', 'database');
    $init_count = $_GET['data'];
    $stmt1      = "SELECT COUNT(*) AS count FROM conversations";
    $stmt2      = "SELECT comment FROM conversations ORDER BY date_column DESC LIMIT 1";

    $total = $con->prepare($stmt1);
    $total->execute();
    $total->bind_result($count);
    $total->fetch();
    $total->close();    

    if( ($init_count != '') && ($init_count < $count) )
    {
        $lastComment = $con->prepare($stmt2);
        $lastComment->execute();
        $result = $lastComment->get_result();
        $row    = $result->fetch_assoc();
        $lastComment->close();

        $data = array(
                 'comment' => $row['comment'],
                 'count'   => $count
                 );
    }

    elseif($init_count == '')
    {
        $data = array(
        'comment' => '',
        'count'   => $count
        );
    }
    $pdo->close();
    echo json_encode($data);
}

HTML:

<input type="hidden" id="count" value="" />

查询:

$(document).ready(function(e){

    function getComment(){
        var count = $('#test').val();
        $.ajax({
                type: 'get',
                url: 'update.php?data=' + count,
                dataType: 'json',
                success: function(data)
            {
            $('#count').val(data.count);
            if(data.comment) !=  $('#testdiv').html(data.comment);
            }
        });
    }
    getComment();
    setInterval(getComment, 6000);

});

【讨论】:

    【解决方案3】:
    SELECT * FROM conversations order by insert_date desc limit 10
    

    insert_date 插入日期时间注释,希望你有一个字段来存储,如果现在不添加它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 2012-02-07
      • 1970-01-01
      • 2011-06-10
      • 2014-12-01
      相关资源
      最近更新 更多