教我编写语句的人做了安全措施但是,我意识到它们的目的是限制对服务器的HTTP请求数量?
我的代码有效,但我认为我没有正确使用预备语句。这是我的代码。
第一部分从数据库中提取数据,以显示在编辑博客帖子页面上。
<?php
if(isset($_GET['p_id'])) {
$get_post_id = mysqli_real_escape_string($conn, $_GET['p_id']);
}
**$query = "SELECT * FROM posts WHERE post_id = ? ";
$stmt = mysqli_prepare($conn, $query);
mysqli_stmt_bind_param($stmt, "i", $get_post_id);
mysqli_stmt_execute($stmt);**
$result = mysqli_stmt_get_result($stmt);
while($row = mysqli_fetch_assoc($result)) {
$post_id = $row['post_id'];
$post_author = $row['post_author'];
$post_title = $row['post_title'];
$post_cat_id = $row['post_cat_id'];
$post_status = $row['post_status'];
$post_image = $row['post_image'];
$post_content = $row['post_content'];
$post_tags = $row['post_tags'];
$post_date = $row['post_date'];
}
第二部分使用sql UPDATE捕获准备插入的已编辑数据。
if(isset($_POST['update_post'])) {
$post_title = mysqli_real_escape_string($conn, $_POST['title']);
$post_author = mysqli_real_escape_string($conn, $_POST['post_author']);
$post_cat_id = mysqli_real_escape_string($conn, $_POST['post_category']);
$post_status = mysqli_real_escape_string($conn, $_POST['post_status']);
$post_image = $_FILES['post_image']['name'];
$post_image_temp = $_FILES['post_image']['tmp_name'];
$post_tags = mysqli_real_escape_string($conn, $_POST['post_tags']);
$post_content = mysqli_real_escape_string($conn, $_POST['post_content']);
move_uploaded_file($post_image_temp, "images/$post_image");
下一段代码会插入已存在于数据库中的图像,这样如果图像未被用户编辑,它就不会消失。
if(empty($post_image)) {
**$query = "SELECT * FROM posts WHERE post_id = ? ";
$stmt = mysqli_prepare($conn, $query);
mysqli_stmt_bind_param($stmt, "i", $get_post_id);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);**
while($row = mysqli_fetch_array($result)) {
$post_image = $row['post_image'];
}
}
正如您所看到的,我使用相同的预处理语句查询数据库两次,这似乎有点多余。是否有另一种方法可以在第二个实例中从数据库中提取数据,而无需再次使用整个查询?
我认为前面准备好的语句只是使用while循环可以使用$ result字符串作为参数,但它似乎没有做任何事情。
编辑:我已经设法通过仅使用这两行来减少代码。
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
我不明白的是,为什么我还需要在尚未关闭时再次执行准备好的语句?为什么字符串$ result在没有再次执行代码的情况下不起作用?