准备好的陈述示例

时间:2014-01-04 20:52:55

标签: php mysqli prepared-statement

在我正在编写的这个新系统中(同时学习PHP),我一直在尝试使用预处理语句但是找不到允许我让这段代码工作的例子。在花了一些相当长的时间之后,我没有准备好的陈述就写了(否则我仍然会被卡住)。

但是,如果有人愿意告诉我如何使用预准备语句实现相同的功能,那就太棒了。我正在使用INSERTUPDATE s的预准备语句,但尚未设法使用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);
?>

1 个答案:

答案 0 :(得分:2)

我会给它一个旋转:

$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声明? - 绑定会为您完成所有这些操作,无需转义字符串(无论如何都无法正常工作)< / LI>
  • 什么是mysqli_stmt_bind_param东西? - 这些是您需要包含的项目:执行语句,问号顺序的数据类型('ss'是字符串,字符串),变量1,变量2(问号顺序的变量)
  • 什么是mysqli_stmt_bind_result内容? - 这是您收到的数据。注意我没有做SELECT *(这在任何场景中都是一个糟糕的主意,总是指定你的列),我只需要两个项目然后绑定到结果变量$id和{{1}我创建的
  • 我习惯的所有$data数组的东西在哪里? - 它已经消失了!绑定语句不是基于使用MYSQLI_ASSOC的行或任何奇怪的行,只是直接的变量
  • 为什么要关闭你的陈述? - 因为你总是应该这样做。总是。

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

希望这有帮助!

编辑:连接建议

就个人而言,我喜欢将我的连接设置保存在一个单独的文件中,这样我就可以添加require而不是在不同的页面中维护代码。您将它设置在一个数组中,但适用相同的逻辑。我通常设置一个单独的$row文件(对于具有完全SUID访问权限的用户),如下所示:

mysqli_[appname]_SUID.php

这允许非常简单的修改,无论何时需要使用它,只需添加require:

$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);

你很高兴。不确定这是否有帮助,只是我的练习。