注释id在插入数据库之前发生更改


Comment id changing before being inserted into the database

我有一个表单,用户可以在其中对帖子进行评论。现在这个表单的隐藏输入是正确的,它得到了正确的"streamidcontent",但当我通过ajax将其发送到数据库时,它总是更改为上次创建的状态id"4076",并将其添加到提要顶部的帖子中。所以我在想,我做错了什么。

streamdata_comments

1 comment_id int(11)No None AUTO_INCREMENT
2条评论_海报int(11)否无
3注释_流项目int(11)否无
4 comment_datetime datetime无

形式

<form id="mycommentform" method="POST"  class="form_statusinput">
<input type="hidden"  name="streamidcontent" id="streamidcontent" value="'.$streamitem_data['streamitem_id'].'">
<input type="input" name"content" id="content" placeholder="Say something" autocomplete="off">
<input type="submit" id="button" value="Feed">
</form>

COMMENT_ADD.PHP

<?php
session_start();
require"include/load.php";
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
if(isset($_POST['streamidcontent'])&isset($_POST['content'])){
        $content =  htmlspecialchars($_POST['content']);
        $streamid = htmlspecialchars($_POST['streamidcontent']);
            $content = preg_replace('/(?<!S)((http(s?):'/'/)|(www.))+(['w.1-9'&=#?'-~%;'/]+)/','<a href="http$3://$4$5">http$3://$4$5</a>', $content);
            $insert = "INSERT INTO streamdata_comments(comment_poster, comment_streamitem, comment_datetime, comment_content) VALUES (".$_SESSION['id'].",'$streamid',UTC_TIMESTAMP(),'$content')";

            $add_post = mysqli_query($mysqli,$insert) or die(mysqli_error($mysqli));
            }

AJAX

<script>
$(document).ready(function(){
$("form#mycommentform").submit(function(event) {
event.preventDefault();
var streamidcontent = $("#streamidcontent").val();
var content = $(this).children('#content').val();
$.ajax({
type: "POST",
url: "comment_add.php",
cache: false,
dataType: "json",
data: { streamidcontent: streamidcontent, content: content}, 
success: function(html){  
$("#containerid").html("<div class='stream_comment_holder' id='comment_holder_"+html['comment_streamitem']+"'><div id='comment_list_"+html['comment_streamitem']+"'><div class='stream_comment' id='comment_"+html['comment_id']+"'>div class='stream_comment_holder' id= style='display:;'><div class='stream_comment'><table width='100%'><tbody><tr><td valign='top' width='30px'><img class='stream_profileimage' style='border:none;padding:0px;display:inline;' border='"0'" src='"imgs/cropped"+html['id']+".jpg'" onerror='this.src='"img/no_profile_img.jpeg'"' width='"40'" height='"40'" ></td><td valign='top' align='left'><a href='profile.php?username="+html['username']+"'>"+html['first']+" </a>"+html['comment_content']+"</td></tr></tbody></table></div></div></div></div>");
}
});
return false
});
});
</script>

还有我的老AJAX,它插入得很好。但我需要添加我的喜欢,不喜欢和删除按钮。所以把它改成了上面的AJAX,它不能正常工作。

function addcomment(streamid,content,containerid,posterid,postername,postid){
var obj = document.getElementById(containerid);
$.post("../comment_add.php", { streamid: streamid,content:content} );
obj.innerHTML = obj.innerHTML + "<div class='stream_comment'><table width='100%'><tbody><tr><td valign='top' width='30px'><img style='border:none;padding:0px;height:30px;width:30px;border-radius:0px;' src='imgs/cropped"+posterid+".jpg' onerror='this.src=&quot;img/no_profile_img.jpeg&quot;;'></td><td valign='top' align='left'><a href='profile.php?username="+posterid+"'>"+postername+" </a>"+content+"</td></tr></tbody></table></div>";
}

您有没有想过错误实际上可能是您的提要,而不是实际的插入?或者可能是AJAX?

要验证插件是否工作,请尝试:

echo $streamid;  // Shows you're getting the right value from AJAX.
$add_post = mysqli_query($mysqli,$insert) or die(mysqli_error($mysqli));
if($add_post) {
    $NewID = mysqli_insert_id(mysqli);
    $query = 'SELECT * FROM streamdata_comments WHERE comment_id=' . $NewID;  
    if ($result = mysqli_query($mysqli, $query)) {
        while ($row = $result->fetch_object()){
            var_dump($row);   // Check the actual input is as you expected.
        }
        mysqli_free_result($result);
    }
}

如果使用AJAX,则需要通过其中一个网络工具(在Chrome、NET面板中按F12;或者在Win或Mac中使用Fiddler)来监控结果

您的代码中发生了一些奇怪的事情:

$content =  $_POST['content'];
$content =  strip_tags($_POST['content']);

您正在用不同的值填充$content变量两次。id也是如此:

$streamid = $_POST['streamidcontent'];
$streamid = strip_tags($_POST['streamidcontent']);

在将strip_tags插入数据库之前,我非常怀疑您是否应该使用它。显示时只需使用htmlspecialchars()即可。显示时使用htmlpurifier即可。此外,您的应用程序中存在SQL注入漏洞。在这里阅读更多关于防止这种情况的信息:如何在PHP中防止SQL注入?。

有了你共享的代码,新记录将被分配一个新的id。你是如何检查你每次都得到相同的id的?。

最后,您可以通过以下操作获得mysqli中最后插入的id:

echo $mysqli->insert_id;

在CCD_ 4。

你有没有检查过呈现的HTML,看看id是什么?