程序PHP mysql SELECT预处理语句

时间:2016-12-06 20:26:32

标签: php mysql prepared-statement

教我编写语句的人做了安全措施但是,我意识到它们的目的是限制对服务器的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在没有再次执行代码的情况下不起作用?

0 个答案:

没有答案