准备SQL语句的过程式mysqli方法是什么?

时间:2016-04-18 01:46:35

标签: php stored-procedures mysqli prepared-statement procedural

我的代码中有一个SQL查询,我希望将其转换为准备好的语句来阻止SQL注入等漏洞。所以这就是我要转换的内容:

<?php
$query = "SELECT * from `wp_posts` WHERE ID=$pid ";
$result = mysqli_query($link, $query);
    //$id=$row['Gallery_Id'];

    while($row = mysqli_fetch_array($result)){
        ?>
    <h2 align="center"> <?php echo $row['post_title']; ?> </h2><br>
    <div class="paracenter">

        <p id="cont"><?php echo $row['post_content']; ?></p>
        <hr color="black" width="10%">

    </div>
<?php } ?>

这是我尝试过的,但它不起作用。

$query = "SELECT * from `wp_posts` WHERE ID=? ";
    $stmt = mysqli_prepare($link, $query);
    if($stmt){
        mysqli_stmt_bind_param($stmt, "i", $pid);
        mysqli_stmt_bind_result($stmt, $dbpid);
        mysqli_stmt_execute($stmt);
        mysqli_stmt_fetch($stmt);
    }
    $result = mysqli_query($link, $query);
    //$id=$row['Gallery_Id'];

    while($row = mysqli_stmt_fetch($result)){
        ?>


    <h2 align="center"> <?php echo $row['post_title']; ?> </h2><br>
    <div class="paracenter">

        <p id="cont"><?php echo $row['post_content']; ?></p>
        <hr color="black" width="10%">

    </div>
    <?php } ?>

几乎所有在线示例都不使用我使用的程序方法。我怎么能纠正这个?

1 个答案:

答案 0 :(得分:0)

要保护查询免受注入攻击,您有两个选择。第一个超级简单,并且与准备好的语句一样安全。

  1. $pid设为整数。

    $query = "SELECT post_title, post_content FROM wp_posts WHERE ID = " . (int)$pid;
    

    确定并完成。

  2. 如何编写带有结果绑定的准备好的语句...(我不使用过程mysqli语法)

    if (!$stmt = $link->prepare("SELECT post_title, post_content FROM wp_posts WHERE ID = ?")) {
        echo "Syntax Error @ Prepare"; // $link->error; <-- never show actual error details to public
    
    } elseif (!$stmt->bind_param("i", $pid) || !$stmt->execute() || !$stmt->bind_result($title, $content)) {
        echo "Syntax Error @ ParamBind | Execute | ResultBind"; // $stmt->error; <-- never show actual error details to public
    } else {
        while ($stmt->fetch()) {
            echo "<div>";
                echo "<h2 align=\"cente\">$title</h2><br>";
                echo "<div class=\"paracenter\">";
                echo "<p id=\"cont\">$content</p>";
                echo "<hr color=\"black\" width=\"10%\">";
            echo "</div> ";
        }
    }
    

一些其他注释。

  • 如果您不打算使用结果绑定,则应该使用mysqli_fetch_assoc()而不是mysqli_fetch_array()mysqli_fetch_array()会生成索引和关联键元素的庞大结果集(是您实际需要的两倍)。
  • 使用bind_result()时,需要用要提取的列替换SELECT子句中的*
  • 我的第一个elseif()表达式包含三个分别对$stmt的调用和检查。一旦这些调用中的任何一个返回假或错误的响应,就永远不会执行条件表达式短路和表达式中的其余调用。
  • 如果采用我的面向对象的mysqli风格,请确保将数据库连接语法也与面向对象对齐。