【问题标题】:Prepared statements example准备好的语句示例
【发布时间】:2014-01-04 20:52:54
【问题描述】:

在我目前正在编写的这个新系统中(在学习 PHP 时),我一直在尝试使用准备好的语句,但找不到让我让这段代码工作的示例。在花了相当长的时间之后,我没有准备好语句就写了它(否则我仍然会卡住)。

但是,如果有人愿意告诉我如何使用准备好的语句来实现相同的功能,那就太好了。我正在为INSERTs 和UPDATEs 使用准备好的语句,但还没有设法让一个使用SELECT 工作。

这段代码是一个 AJAX 页面,用于根据页面上的选择填充下拉列表。

代码如下:

<?php
require_once('assets/includes/config.php');

if ((!isset($_GET['cat']) || !is_numeric($_GET['cat'])) && (!isset($_GET['subcat']) || !is_numeric($_GET['subcat'])))
    $response = array('success' => FALSE);
else {
    $conn = mysqli_connect($config["db"]["host"],$config["db"]["dbname"],$config["db"]["password"],$config["db"]["username"]);
    $cat= mysqli_real_escape_string($conn, $_GET['cat']);
    $subcat= mysqli_real_escape_string($conn, $_GET['subcat']);
    $sql = "SELECT * FROM jf_data WHERE cat = $cat and subcat = $subcat;";
    $result = mysqli_query($conn,$sql);
    $options = "";

    while($row = mysqli_fetch_array($result))  {
        $options .= '<option value="'. $row['id'] .'">'. $row['data'].'</option>';
    }
    $response = array(
        'success' => TRUE,
        'options' => $options
    );
    }

header('Content-Type: application/json');
echo json_encode($response);
?>

【问题讨论】:

    标签: php mysqli prepared-statement


    【解决方案1】:

    我会试一试:

    $conn = mysqli_connect($config["db"]["host"],$config["db"]["username"],$config["db"]["password"],$config["db"]["dbname"]);
    
    $cat = $_GET['cat'];
    $subcat = $_GET['subcat'];
    $options = '';
    
    $sql = "SELECT id,data FROM jf_data WHERE cat = ? and subcat = ?;";
    
    if($stmt = mysqli_stmt_prepare($conn,$sql)){
        mysqli_stmt_bind_param($stmt,'ss',$cat,$subcat);
        mysqli_stmt_execute($stmt);
        mysqli_stmt_bind_result($stmt,$id,$data);
    
        while(mysqli_stmt_fetch($stmt)){
            $options .= '<option value="' . $id . '">' . $data . '</option>';
        }
    
        mysqli_stmt_close($stmt);
    }
    
    $response = array(
        'success' => TRUE,
        'options' => $options
    );
    

    这里是问题和答案列表:

    • 为什么我不需要清理我的$_GET statments? - 绑定会为你处理所有这些,无需转义字符串(反正从来没有很好用)
    • mysqli_stmt_bind_param 是什么东西? - 这些是您需要包括的项目:执行的语句、按问号顺序排列的数据类型('ss' 是字符串、字符串)、变量 1、变量 2(变量按问号顺序排列)
    • mysqli_stmt_bind_result 的东西是什么? - 那是你得到的数据。注意我没有做SELECT *(在任何情况下这都是一个糟糕的主意,总是指定你的列),我只需要两个项目,然后将它们绑定到我创建的结果变量$id$data李>
    • 我习惯的所有 $row 数组的东西在哪里? - 它不见了!绑定语句不基于使用 MYSQLI_ASSOC 的行或类似的任何奇怪的东西,只是直接变量
    • 你为什么要结束你的陈述? - 因为你总是应该这样做。总是。

    我的意思不是刻薄之类的,这些是我刚开始时遇到的问题以及我在向其他人解释时遇到的问题的组合。只是想我会给出一个好的基线。另一个很好的验证是read the documentation,它总是有如何实现它的示例(转到程序样式,示例#2)。

    希望这会有所帮助!

    编辑:连接建议

    就个人而言,我喜欢将我的连接设置保存在一个单独的文件中,这样我就可以在其中添加要求,而不是在不同的页面上维护代码。您将它设置在一个数组中,但同样的逻辑适用。我通常会像这样设置一个单独的mysqli_[appname]_SUID.php 文件(对于具有完全 SUID 访问权限的用户):

    $host="localhost";
    
    if($_SERVER['HTTP_HOST'] === 'www.domain.com'){ // production DB
        $username="production_user";
        $password="production_password";
        $db_name="production_db";
    } else { // dev or stage DB
        $username="dev_user";
        $password="dev_password";
        $db_name="dev_db";
    }
    
    $conn = mysqli_connect($host,$username,$password,$db_name);
    

    这允许很容易修改,并且当你需要使用它时,只需添加需求:

    require_once 'requires/mysqli_[appname]_SUID.php';
    

    你可以走了。不知道这是否也有帮助,只是我的实践。

    【讨论】:

    • 谢谢。绝对没有意思。有用的问题(和答案)。该示例将有助于以后重用。
    • 虽然我得到这个:警告:mysqli_stmt_prepare() 期望参数 1 是 mysqli_stmt,对象在第 15 行的 xxx 中给出 - 这是在 'if($stmt' 行
    • @Graeme - 抱歉,之前没有注意到这一点,您的 mysqli_connect() 声明有问题。它需要去mysqli_connect($host,$user,$password,$database); 我已经用正确的顺序更新了我的答案,以及一个带有示例设置的文档链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2016-03-23
    相关资源
    最近更新 更多