我正在创建一个包含不同电影的网站,每个电影都有一个特定的id_movie,我添加了一个评论框,用户可以在其中添加有关该电影的评论,但是,我单击的每个电影都显示相同的内容输入的评论,我希望每部电影都有自己的评论,如果您能帮助我,我会很高兴。谢谢
comments.php
Sub GetSendor()
Dim oApp As New Outlook.Application
Dim oMail As Outlook.MailItem
Dim nm As Namespace
Set nm = oApp.GetNamespace("MAPI")
Set oMail = nm.GetDefaultFolder(olFolderInbox).Folders.Item(1).Items.GetLast
oMail.SenderEmailAddress
End Sub
add_comment.php
<body>
<br />
<h2 align="center"><p >Add Comment</p></h2>
<br />
<div class="container">
<form method="POST" id="comment_form">
<div class="form-group">
<input type="text" name="comment_name" id="comment_name" class="form-control" placeholder="Enter Name" />
</div>
<div class="form-group">
<textarea name="comment_content" id="comment_content" class="form-control" placeholder="Enter Comment" rows="5"></textarea>
</div>
<div class="form-group">
<input type="hidden" name="comment_id" id="comment_id" value="0" />
<input type="submit" name="submit" id="submit" class="btn btn-info" value="Submit" />
</div>
</form>
<span id="comment_message"></span>
<br />
<div id="display_comment"></div>
</div>
</body>
<script>
$(document).ready(function(){
$('#comment_form').on('submit', function(event){
event.preventDefault();
var form_data = $(this).serialize();
$.ajax({
url:"add_comment.php",
method:"POST",
data:form_data,
dataType:"JSON",
success:function(data)
{
if(data.error != '')
{
$('#comment_form')[0].reset();
$('#comment_message').html(data.error);
$('#comment_id').val('0');
load_comment();
}
}
})
});
load_comment();
function load_comment()
{
$.ajax({
url:"fetch_comment.php",
method:"POST",
success:function(data)
{
$('#display_comment').html(data);
}
})
}
$(document).on('click', '.reply', function(){
var comment_id = $(this).attr("id");
$('#comment_id').val(comment_id);
$('#comment_name').focus();
});
});
</script>
fetch_comment.php
<?php
$con = new PDO('mysql:host=localhost;dbname=db_movie', 'root', '');
$error = '';
$comment_name = '';
$comment_content = '';
if(empty($_POST["comment_name"]))
{
$error .= '<p class="text-danger">Name is required</p>';
}
else
{
$comment_name = $_POST["comment_name"];
}
if(empty($_POST["comment_content"]))
{
$error .= '<p class="text-danger">Comment is required</p>';
}
else
{
$comment_content = $_POST["comment_content"];
}
if($error == '')
{
$query = "
INSERT INTO tbl_comment
(parent_comment_id, comment, comment_sender_name, movie_id)
VALUES (:parent_comment_id, :comment, :comment_sender_name)
";
$statement = $con->prepare($query);
$statement->execute(
array(
':parent_comment_id' => $_POST["comment_id"],
':comment' => $comment_content,
':comment_sender_name' => $comment_name
)
);
$error = '<label class="text-success">Comment Added</label>';
}
$data = array(
'error' => $error
);
echo json_encode($data);
?>
在这里,当我单击每部电影时:
<?php
//fetch_comment.php
$con = new PDO('mysql:host=localhost;dbname=db_movie', 'root', '');
$query = "
SELECT * FROM tbl_comment
WHERE parent_comment_id = '0'
ORDER BY comment_id DESC
";
$statement = $con->prepare($query);
$statement->execute();
$result = $statement->fetchAll();
$output = '';
foreach($result as $row)
{
$output .= '
<div class="panel panel-default">
<div class="panel-heading">By <b>'.$row["comment_sender_name"].'</b> on <i>'.$row["date"].'</i></div>
<div class="panel-body">'.$row["comment"].'</div>
<div class="panel-footer" align="right"><button type="button" class="btn btn-default reply" id="'.$row["comment_id"].'">Reply</button></div>
</div>
';
$output .= get_reply_comment($con, $row["comment_id"]);
}
echo $output;
function get_reply_comment($con, $parent_id = 0, $marginleft = 0)
{
$query = "
SELECT * FROM tbl_comment WHERE parent_comment_id = '".$parent_id."'
";
$output = '';
$statement = $con->prepare($query);
$statement->execute();
$result = $statement->fetchAll();
$count = $statement->rowCount();
if($parent_id == 0)
{
$marginleft = 0;
}
else
{
$marginleft = $marginleft + 48;
}
if($count > 0)
{
foreach($result as $row)
{
$output .= '
<div class="panel panel-default" style="margin-left:'.$marginleft.'px">
<div class="panel-heading">By <b>'.$row["comment_sender_name"].'</b> on <i>'.$row["date"].'</i></div>
<div class="panel-body">'.$row["comment"].'</div>
<div class="panel-footer" align="right"><button type="button" class="btn btn-default reply" id="'.$row["comment_id"].'">Reply</button></div>
</div>
';
$output .= get_reply_comment($con, $row["comment_id"], $marginleft);
}
}
return $output;
}
?>
答案 0 :(得分:0)
我会尽力而为,但是有很多要讲的。
comments.php
//add the target files URL as the form's action
<form method="POST" id="comment_form" action="add_comment.php" >
//add movie to the form, that way when we insert the comment we know what its for
<input type="hidden" name="movie_id" id="movie_id" value="<?php echo $movie_id; ?>" />
//.. in your JS, add the movie id to the fetch comment call
function load_comment()
{
$.ajax({
url:"fetch_comment.php",
method:"POST",
data: {movie_id : <?php echo $movie_id; ?>},
dataType: 'json',
success:function(data){
//...
})
}
//move this below the function definition
load_comment();
add_comment.php
//add movie id here to match what is in the form above
INSERT INTO tbl_comment
(parent_comment_id, comment, comment_sender_name, movie_id)
VALUES (:parent_comment_id, :comment, :comment_sender_name, :movie_id)
// add ':movie_id' => $_POST['movie_id'] to the array you have there for
// $statement->execute([ ....]). The arrays below go the same way
//add those to $statement->execute() for there respective DB calls,
您在插入的FIELDS部分中拥有电影,但没有VALUES,这可能是SQL语法错误。您可能没有看到实际的错误,因为此错误是通过AJAX调用的,因此只会在客户端中断。您可以在浏览器调试窗口>网络[XHR]请求中查看响应。在那里您可能会找到它,或者可能只是从服务器上收到500错误。
fetch_comment.php
//add movie id here to match what is in the AJAX fetch comment call
SELECT * FROM tbl_comment
WHERE parent_comment_id = :parent_comment_id AND movie_id = :movie_id
ORDER BY comment_id DESC
//for execute add
['parent_comment_id'=>0, 'movie_id'=>$_POST['movie_id']]
重要 正确准备此查询
$query = "
SELECT * FROM tbl_comment WHERE parent_comment_id = '".$parent_id."'
";
所以应该像这样:
$query = "SELECT * FROM tbl_comment WHERE parent_comment_id = :parent_id";
//then add this to execute ['parent_id' => $parent_id]
mainpage.php (不确定该名称)
在最后一个未命名的代码块中,您正在使用mysqli
,但在您使用PDO
之前,最好使用另一个,我个人更喜欢PDO,它是API更好的选择。您也没有准备这些(因此将它们转换为PDO)。两者都使用只会给您的应用程序增加不必要的复杂性(我认为其中有两个):
$qry2=mysqli_query($con,"select * from tbl_movie where movie_id='".$_GET['id']."'");
$movie=mysqli_fetch_array($qry2);
您似乎在最后一页comments.php
中加入了<?php include('comments.php'); ?>
,所以我要做的就是查询超出我说过要修复的地方:
require_once `db.php`; //- create a separate file to do the DB connection for you
//then you can add that to the top of all the pages you need the DB for
include 'header.php'; //no need for the ( ) for any of the include* or require* calls.
/*
require will issue an error if the included file is not found
include will fail silently, for things that are required for your
page to work and not produce errors use require (like the DB)
for things you only ever include once, also like the DB stuff use *_once
then no matter how many *_once calls are stacked from including
the other page you don't have to worry about it.
as above those simple rules give us require_once for the DB.
the other pages I am not sure which would be best.
*/
//localize the movie ID - change any use of `$_GET['id']
$movie_id = isset($_GET['id']) ? $movie_id : false;
if(!$movie_id){
//do something if someone goes to this page with no ?id= in the URL
//you could redirect the page
//you could have a default movie id etc...
}
$statement = $con->prepare('select * from tbl_movie where movie_id=:movie_id');
$statement->execute(['movie_id' => $movie_id]);
$movie = $statement->fetch();
//dont forget to fix the other DB call and remove the MySqli stuff.
以上,我建议为数据库使用一个文件,在您的情况下,这可能很简单,
db.php
<?php $con = new PDO('mysql:host=localhost;dbname=db_movie', 'root', '');
这实际上就是您所需要的,在使用数据库的每一页的顶部,只需添加此文件
require_once 'db.php';
这样,如果您需要更改密码或类似的密码,则可以以易于记忆的方式转到一个命名的地方并进行更改。现在的情况,您将不得不挖掘所有代码来进行更改。在该页面中,您包括一个名为header.php
的文件,从您的MySQLi代码看来,其中可能包含一些连接内容。我也会在那里删除任何MySQLi内容。您希望将数据库文件分开,因为可能需要将其包含在AJAX后端部分中,并且header.php的任何输出都会使您感到困惑。
摘要
我在上面显示的是您需要做的一个简单示例,因为在AJAX调用中,这可能并不是您要做的全部,这些只是对我而言显而易见的事情。
您不必担心子注释的电影ID,因为它们从父注释继承来的,如果ID不正确,则父注释不会存在(在页面上)。在您当前的设置中,我仍将其保存为数据的一部分。如果您知道父母(您一定要知道),只是您不需要它来获得孩子的评论。我没有将它添加到看起来像是对孩子发表评论的一件事中。您可以添加它,但是正如我上面所说的,它并不是真正需要的。
真正的问题是广泛的方法,为什么我的代码无法正常工作。我付出努力的唯一原因是,您也付出了努力,以提供组织良好的代码,而且代码相对最少。
所以谢谢你。
我最后提出的建议是清理一些SQL中多余的行返回,并格式化TAB更好。但这只是一个可读性问题,我对格式化我的代码非常挑剔,其中一些可能与在SO上创建问题有关,因为这需要花一些时间来使用它们所使用的markdown。
希望对您有帮助!
更新
感谢您的回答,我真的不知道我应该在这里发布什么,我不应该发布什么,我不明白的是:我有一个tbl_comment,它存储了用户的所有评论,并且该表包括movie_id,并且我还有另一个以movie_id作为主键的tbl_movie,我如何将电影_id与tbl_comment链接,以便为特定的movie_id存储每个评论
我将尝试通过一个示例来说明您的应用程序流程。为了本示例的缘故,假设电影ID为12
,而我们的主页为www.example.com/movies?id=12
:
插入评论
?id=12
的网址
?
之后的所有内容都称为查询字符串$_GET
的晚餐$_GET['id']
$movie_id = isset($_GET['id']) ? $movie_id : false;
?id=12
,则将其放入$movie_id
www.example.com/movies
,则将$movie_id
设置为false <?php include('comments.php'); ?>
,就像把代码粘贴到该位置一样在comments.php
中,当包含在上面时运行
$movie_id
添加到该行中<input type="hidden" name="movie_id" id="movie_id" value="<?php echo $movie_id; ?>" />
。
-因此,现在当表单提交到add_comment.php
时,您需要将其放入表单的操作中。 <form method="POST" id="comment_form" action="add_comment.php" >
$_POST['movie_id']
。 $_POST['movie_id']
与$_GET['id']
基本相同,但是形式method
告诉我们它的post
而不是get
。通常,Get
用于检索资源,Post
用于修改资源。<?php echo $movie_id; ?>
的值替换为12
,因此您会得到这个<input type="hidden" name="movie_id" id="movie_id" value="12" />
现在在add_comment.php
(采取表单操作的位置)上,我们可以将该$_POST['movie_id']
并添加到用于从#4中的表单插入注释的SQL中。进入数据库。
INSERT INTO tbl_comment
(parent_comment_id, comment, comment_sender_name, movie_id)
VALUES (:parent_comment_id, :comment, :comment_sender_name, :movie_id)
:movie_id
。在PDO中,我们可以通过调用它的$statement
方法或$statment=$conn->prepare($sql)
从execute
返回的PDOStatment对象($statement->execute([..other stuff here..., 'movie_id'=>$_POST['movie_id']])
)。INSERT INTO tbl_comment
(parent_comment_id, comment, comment_sender_name, movie_id)
VALUES (0, 'foo', 'ArtisticPhoenix', 12)
<-看看我在那做什么。因此,您看到我们从原始URL请求中获取了值,并将其添加到我们的表单中,然后我们等待用户操作来提交带有嵌入的电影ID的表单。表单提交时,它会调用我们的添加评论页面,从中将其从“已发布”数据中删除,并将其与该评论的其余表单数据一起馈入数据库。
除了我们使用AJAX提交数据的方式外,其他方式完全相同,因此我们将其添加到AJAX调用中而不是表单。我会给你一个例子,说明如何执行。
显示评论
直到上面的#4都是一样的
comments.php
中调用load_comment();
“之后”,定义不存在的函数会告诉您执行此操作,因此您不能在之前调用它。
$.ajax
,出于本示例的目的,它就像处理表单的一种理想方式。 url
的形式为action
,method
就是这种方法。 data
是表单数据,dataType
是这种情况下的编码类型JSON
或Javascript Object Notation。这是一种表达结构化数据的好方法,例如在PHP中,它基本上是一个数组(或带有嵌套元素的数据)。action
)将我们指向fetch_comment.php
,因此运行时,我们的data: {movie_id : <?php echo $movie_id; ?>},
变成data: {movie_id : 12},
,它被发送回服务器,PHP将其视为{{ 1}}
$_POST['movie_id']
SELECT * FROM tbl_comment
WHERE parent_comment_id = :parent_comment_id AND movie_id = :movie_id
ORDER BY comment_id DESC
,但是您将$statement->execute();
硬编码为parent_comment_id
。直到我们需要添加0
之后,这才算是行之有效的,一旦完成,将其包含在准备好的语句中变得更有道理,因此它读起来更好。但是像插入一样,现在我们将占位符替换为值,因此我们需要获取该数据并将其添加到此查询的movie_id
中。execute
变成$statement->execute();
或当PHP完成$statement->execute(['parent_comment_id'=>0, 'movie_id' => $_POST['movie_id']]);
时,数据库就知道使用键来匹配占位符,并完成了查询。$statement->execute(['parent_comment_id'=>0, 'movie_id' => 12]);
SELECT * FROM tbl_comment
WHERE parent_comment_id = 0 AND movie_id = 12
ORDER BY comment_id DESC
将其发送回AJAX的success
处理程序,在这种情况下,将其添加到此行echo
总而言之
您的代码:
$('#display_comment').html(data);
正确的代码(我说了什么):
load_comment();
function load_comment()
{
$.ajax({
url:"fetch_comment.php",
method:"POST",
success:function(data)
{
$('#display_comment').html(data);
}
})
}
您需要做什么
//.. in your JS, add the movie id to the fetch comment call
function load_comment()
{
$.ajax({
url:"fetch_comment.php",
method:"POST",
data: {movie_id : <?php echo $movie_id; ?>},
dataType: 'json',
success:function(data){
//...
})
}
load_comment();
PHP完成上述代码后,它会将其发送到客户端(使用我们示例中的//$movie_id = $_GET['id'] in the main page that included this file.. #2 above
function load_comment()
{
$.ajax({
url:"fetch_comment.php",
method:"POST",
data: {movie_id : <?php echo $movie_id; ?>},
dataType: 'json',
success:function(data)
{
$('#display_comment').html(data);
}
});
}
load_comment();
)
12
以上是在浏览器中实际运行的
这几乎是要点。就像我说的那样,它对您更有利于学习其工作原理。当然,我可以发布完整的代码,但是我无法对其进行测试,也无法知道是否所有的错误。如果您了解其工作原理,那么您将有能力自己应对这些挑战。我宁愿花3到4倍的努力来教你所有的工作原理,然后发布一些你不知道它如何工作的代码。
希望这一切都有道理。