2012-08-26 44 views
1

我有一个用户用于评论帖子的表单。现在,这个表单的隐藏输入是正确的,当它通过ajax发送并进入数据库时​​,它会得到正确的'streamidcontent',它总是变为最后创建的状态ID'4076',并将其添加到顶部的顶部的饲料。 所以我想知道,我做错了什么。注释ID在插入数据库之前发生变化

streamdata_comments

1 COMMENT_ID INT(11)否无AUTO_INCREMENT
2 comment_poster INT(11)否无
3 comment_streamitem INT(11)否无
4 comment_datetime日期时间否无

FORM

<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 WHICH INSERTED罚款。但我需要添加我喜欢的,不喜欢和删除按钮。所以将其更改为上述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>"; 
} 

回答

2

你有没有想过,错误可能实际上是你的饲料,而不是实际的插入?或者它可能是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中按F12,NET面板的一个结果;或使用对于Win,为Fiddler或对于Mac为Charles

+0

您的密码回声“4076”;这是我评论的帖子的错误ID。我已经使用AJAX更新了原始问题。 – dave

+0

它可能是AJAX,因为我有我的原始片AJAX,工作正常。只有我需要使用JSON添加一些项目,所以将其更改为上述内容。我仍然有旧的AJAX代码。你想让我发布吗? – dave

+1

好吧,现在将输入从隐藏改为文本,只是为了检查它在那里。 (你说这是一个问题,值得仔细检查,这是一种视觉方式)。同时检查你只有一个id(streamidcontent,必须是唯一的整个页面,而不仅仅是表格) – Robbie

2

有一些奇怪的事情在你的代码发生的事情:

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

您正在使用不同的值的两倍填充$content变量。这同样适用于该ID:

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

我严重怀疑你应该将其插入数据库之前仍要使用strip_tags。显示时只需使用htmlspecialchars()。显示时使用htmlpurifier。 您的应用程序中还有一个SQL Injection vulnerability。阅读更多有关防止此问题的信息:How can I prevent SQL injection in PHP?

随着您共享的代码,新记录将被分配一个新的ID。你是怎么检查你每次都得到相同的ID?在query()

echo $mysqli->insert_id; 

最后,你可以通过执行获得的mysqli最后插入的ID。

您是否还检查了呈现的HTML以查看ID在第一位?

+0

我通过使用萤火虫在窗体上运行检查。它显示用户评论的帖子的ID。 – dave

+0

$ streamitem_data ['streamitem_id']总是显示为您在id上评论的POST。当我用萤火虫滚动每个帖子中的每个评论框时,隐藏的输入ID将变为帖子唯一ID。所以我知道这是对的。 – dave

相关问题