我正在编写一个程序来创建一个在线论坛,我对php相对较新。 我使用了一个while循环来显示为表中的讨论而创建的所有主题。这会读取我的sql数据库,并且很好地回应:
if ( mysqli_num_rows( $r ) >0 ) {
while ( $row = mysqli_fetch_array( $r, MYSQLI_ASSOC ) )
{
echo "<tr><th><p align = 'left'>"."Posted By ".$row['first_name']." " .$row['last_name']. " on ". $row['post_date']."<br/>";
echo "<p style = 'color:#2208A1', align='left'>"."Subject:". $row['subject']."<br/><br/>";
echo "Message: ". $row['message']."<br/>";
echo "ID Number = ". $row['post_id']."<br/>";
echo "<p style='color:red;' align = 'right'>"."<a href='http://localhost/FirstCswkAttempts/2017%20Web%20Scenario_A2/cwk_addreply.php?post_id =" .$row['post_id']." '>Reply to Post."."</a></p>";
"</tr></th>";
}
}
但是,您可以看到在最后一行代码中我尝试将post_id编号连接到URL,希望我可以在另一个php文件中使用此信息:
下面的代码显示了我尝试做到这一点。我使用GET方法捕获post_id并将其插入到我的数据库中的另一个表中。如果我使用var_dump($_GET
);我得到一个空数组。我哪里错了?
$q = "INSERT INTO responses(reply_owner, reply_text,reply_create_time,post_id)
VALUES (' ".$_POST['email']." ', ' ".$_POST["message"]."', now(),'".$_GET['post_id']."')";
$r = mysqli_query ( $dbc, $q
) ;
在回复评论时,请找到用于向主题添加帖子的表单:
<h1>Reply to Thread</h1>
<!--Display form-->
<form action="cwk_reply_action.php" method="post" accept-charset="utf-8">
<p><strong>Your email:<br><input name="email" type="text" size="55px" maxlength="100"></p>
<p>Message:<br><textarea name="message" rows="5" cols="50px"></textarea></strong></p>
<input type = "hidden" name = "post_id" value = "$_GET['post_id'] ">
<p><input name="submit" type="submit" value="Submit"></p></form>
答案 0 :(得分:1)
对于PHP应用程序来说,这是一种非常常见的事情。一般模式是:
实现此模式所需的最小值如下:
步骤1(显示项目):
<?php
// using mysqli for example here, but the same general idea for pdo or any other
$result = mysqli_query('SELECT id, some_text, other_columns FROM your_table WHERE criteria');
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
$id = htmlspecialchars($row['id']);
$text = htmlspecialchars($row['some_text']);
echo '<a href="url/to/your_form.php?id=' . $id . '">' . $text . '</a><br>';
}
?>
单击链接(<a>
)会在其href
参数中向URL发送HTTP GET请求。
第2步(显示表格):
当PHP处理请求时,您在URL的查询字符串中包含的任何内容(?id=x
部分)都将在$_GET
数组中提供。
有两种方法可以处理这段数据,以便将其传递给第3步。一种方法是将其包含在表单action
参数的URL中:
<form action="url/to/submission_handler.php?id=<?php echo $_GET['id']; ?>" method="post">
另一种方法是包含一个包含ID的隐藏表单元素。
<form action="url/to/submission_handler.php" method="post">
<input type="hidden" name="id" value="<?php echo $_GET['id']; ?>">
第3步(处理表单提交):
在此步骤中,如果您已通过action
参数传递了ID,则该$_GET
数组($_GET['id']
)中将显示该ID,如果您已通过在表单上输入,它将在$_POST
数组中提供。 ($_POST['id']
)。
无论哪种方式,您都应该能够访问它以便在查询中使用。
<?php
$id = $_GET['id']; // or $_POST['id'], depending on which way you handled it on your form
// Using a prepared statement here for example rather than concatenating values into the
// SQL string, in order to reduce risk of SQL injection
// (Assuming $mysli is a connected mysqli object)
$stmt = $mysqli->prepare('UPDATE your_table SET ... WHERE id=?');
$stmt->bind_param("i", $id);
$stmt->execute();
?>
将表单中的id传递给处理其提交的脚本的方法都是完全有效,功能齐全且常用的方法。据我所知,你应该采用哪种方式实际上取决于你个人的偏好。
但是您应该注意,在action
参数的查询字符串中传递参数只适用于method="post"
的表单。如果您需要使用method="get"
,则只有$_GET
中的表单字段中的值才可用;查询字符串中的参数将被忽略。
(对于将在您的服务器上进行更改的表单,(INSERT
,UPDATE
或DELETE
查询,写入文件等),您应始终使用method="post"
,但仅限FYI。)
答案 1 :(得分:0)
如果您想打印变量,则需要它
<input type = "hidden" name = "post_id" value = "<?php echo $_GET['post_id']; ?> ">
你会看到post_id的值
答案 2 :(得分:-1)
我相信你应该更加具体,但是你的代码看起来很生疏,你需要有人告诉你它是如何完成你对这个脚本的当前uri的呢?
就是这样: http://localhost/forum.php?post_id=foobar 你发送POST或GET请求了吗?你的enctype是什么? 如果它是你可以使用$ _GET超级全局就好了,小心地将它插入你的查询,SQL injection在这一天仍然是一个大问题。
<?php
if ( mysqli_num_rows( $response ) >0 ) {
while ( $row = mysqli_fetch_array( $response, MYSQLI_ASSOC ) )
{
echo "<tr>
<th>
<p align = 'left'> Posted By {$row['first_name']} {$row['last_name']} on {$row['post_date']} <br/>
<p style = 'color:#2208A1', align='left'>
Subject: {$row['subject']} <br/><br/> Message: {$row['message']} <br/>
ID Number = {$row['post_id'] }<br/>
<p style='color:red;' align = 'right'>
<a href='http://localhost/FirstCswkAttempts/2017%20Web%20Scenario_A2/cwk_addreply.php?post_id ={$row['post_id']}'>Reply to Post.</a>
</p>
</tr>
</th>";
}
//This is not recomenended anymore
//But since you are not using PDO and prepared statments its not that bad
$email = mysql_real_escape_string($_POST['email']);
$message = mysql_real_escape_string($_POST["message"]);
$postId = mysql_real_escape_string($_GET['post_id']);
//never name your variables less then 4 chars $q = $query, $r = $response , $dbc = $databaseConnection
$query = "INSERT INTO responses( reply_owner, reply_text, reply_create_time, post_id ) VALUES ('$email', '$message', now(),'$postId')";
$response = mysqli_query ( $databaseConnection, $query );