我想开发一个系统,用户应该可以在作者发布的新闻上发表评论。
我对用于存储用户评论系统的插入语句非常困惑,我有两个mysql表,一个是news
,另一个是comments
,下面是两个截图表。
新闻
评论
在评论表中我定义了一个外键(new_id),其中我想存储与特定新闻相关的值,例如id为no的新闻。 7,我如何实现这一动态壮举?当用户发表评论时,我如何自动将其与新闻联系起来(尽管如此,用户将从表单中提供输入)?
EDIT : I want to use One news article on one page.
谢谢
答案 0 :(得分:1)
通常,id(您要附加内容的实体的id)要么是表单所在的URI,要么是表单中的隐藏元素。
例如:
<?php
//somehow you need to set this value, if the comment form is on the same
//page as the news then you should already have this id. If not, then you
//have to provide the 'stand-alone' comment page with the id you expect it
//to be using
$new_id = 7
<form method='post' action='/news/<?php echo $new_id ?>/comment/'>
<input type='hidden' name='new_id' value='<?php echo $new_id ?>'>
<input tyle='text' name='Name'>
...
</form>
使用该表单,您可以解析URI以确定外键应该是什么,或使用隐藏字段。
更新:显示如何同时使用$_GET
和$_POST
(因此您无需解析URI):
<form method='post' action='/comments/?new_id=<?php echo $new_id ?>'>
与往常一样,检查所有用户输入,无论它来自何处(URI,POST a GET)。
答案 1 :(得分:1)
首先,您需要知道如何查看新闻项目?这是否会在一个页面上显示所有新闻文章,每篇新闻文章下面是否发布新评论?如果是这样,则每个新闻文章生成的这些表单中的每一个都应该具有可能形式的新闻ID。
示例:
<p>News article 1.</p>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="hidden" name="new_id" value="1"/>
<textarea name="comments"></textarea>
<input type="submit" name="submit" value="Post COmment"/>
</form>
<p>news article 2</p>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="hidden" name="new_id" value="2"/>
<textarea name="comments"></textarea>
<input type="submit" name="submit" value="Post COmment"/>
</form>
然后,在此页面的顶部,您可以检查用户是否按下了提交按钮:
<?php
if(isset($_POST['submit'])){
//$_POST['new_id'] is news article id
//$_POST['comments'] is comments for this
//sql to store new_id = $_POST['new_id'] and comments = $_POST['comments']
{
或者: 让我们在您的主页上说您有每个新闻文章的链接,并使用$ _GET在后续页面上检索它们。因此index.php显示新闻,getNews.php显示新闻。你可能想在index.php上生成一个getNews.php的链接?id =
这就是在getNews.php上你知道使用$ _GET ['id']获得哪篇新闻文章,你可以使用上面的类似技术轻松发表评论,拿$ _GET ['id']并折腾它在getNews.php上将你的表单作为隐藏字段。
警告:在使用之前,请小心并清理$ _GET变量。 ?&GT;
答案 2 :(得分:1)
首先你的结构看起来不错。 我假设“new_id”是新闻帖的id! 我会从datetime切换到时间戳。它的范围较小,但我不认为你过去会有帖子?它还具有自动时区转换等附加功能。
反正!通常的做法是将“news_id”作为隐藏表单字段包含在用于提交评论的表单中!
然后你可以用$ _POST [“无论你怎么命名它”]来获取它;
然后你构造你的insert语句...不要忘记mysql_real_escape_string()每个用户提供的数据以避免mysql注入。
答案 3 :(得分:1)
您可以在评论表单中添加隐藏的输入字段,如下所示:
<input type="hidden" name="new_id" value="7"/>
然后在您的PHP代码中,您可以通过$_POST['new_id']
或$_GET['new_id']
获取值,具体取决于您使用的是哪种方式。
您可以使用以下代码生成SQL:
$new_id = mysql_real_escape_string($_POST['new_id']);
$comment = mysql_real_escape_string($_POST['comment']);
$sql = "INSERT INTO comments (comment,new_id) VALUES ('$comment','$new_id')"
如果缩短它,您仍然需要添加其他值。但我希望现在很清楚你如何做到这一点。
如果您不想使用隐藏字段,可以在操作网址中添加get参数,如下所示:
<form action="your_script.php?new_id=<?= $new_id ?>">
然后你得到$_GET['new_id']
。
<强>更新强>
如果您担心安全问题并希望确保没有人试图打造请求,您应该查看http://www.codewalkers.com/c/a/Miscellaneous/Stopping-CSRF-Attacks-in-Your-PHP-Applications/1/
答案 4 :(得分:1)
您询问了SQL INSERT语句,因此我假设您只关心SQL ...
使用AUTO_INCREMENT,LAST_INSERT_ID()和TRANSACTION ...
将[news]。[id]设置为AUTO_INCREMENT值类型。然后使用事务,您应该可以执行以下操作:
START TRANSACTION;
INSERT INTO news VALUES('2010-08-21','','','','','')
INSERT INTO comments VALUES(,'2010-08-21','','','','','',1,LAST_INSERT_ID())
COMMIT;