分析理解PHP+MySQL环境中标准的参数化查询方式的源码
<?php
echo '<br/>';//相当于C语言中的"\n",即换行+顶格
error_reporting(E_ERROR);//报告错误为E_ERROR
$mysqli = new mysqli("localhost","root","","sqli");//假定数据库用户名:root,密码为空,数据库:sqli
if($_GET['user'] && $_GET['password']) {
$username = $_GET['user'];
$password = $_GET['password'];
$query = "SELECT filename,filesize FROM preuser WHERE (name = ?) and (password = ?)";
$stmt = $mysqli->stmt_init();
if ($stmt->prepare($query))
{
$stmt->bind_param("ss",$username,$password);
$stmt->execute();
$stmt->bind_result($filename,$filesize);
while ($stmt->fetch()) {
printf ("%s : %d\n",$filename,$filesize);
}
$stmt->close();
}
}
$mysqli->close();
相关函数
mysqli_stmt_get_result() - 从准备好的语句获取结果集
mysqli_stmt_bind_param() - 将变量绑定到准备好的语句作为参数
mysqli_stmt_execute() - 执行准备好的查询
mysqli_stmt_fetch() - 从准备好的语句中获取结果到绑定变量中
mysqli_prepare() - 准备执行一个SQL语句
mysqli_stmt_prepare() - 准备要执行的SQL语句
mysqli_stmt_init() - 初始化一条语句并返回一个用于mysqli_stmt_prepare(调用)的对象
mysqli_stmt_errno() - 返回最近的语句调用的错误代码
mysqli_stmt_error() - 返回最后一条语句错误的字符串描述
error_reporting()函数
定义:
error_reporting() 函数规定报告哪个错误。
该函数设置当前脚本的错误报告级别
该函数返回旧的错误报告级别
语法:
error_reporting(report_level)
参数:
report_level 可选。规定当前脚本的错误报告级别。值数字和常量名都能接受,但是,考虑未来的 PHP 版本的兼容性,推荐使用常量名
报告级别:
值 | 常量 | 描述 |
---|---|---|
1 | E_ERROR | 运行时致命的错误。不能修复的错误。停止执行脚本。 |
2 | E_WARNING | 运行时非致命的错误。没有停止执行脚本。 |
4 | E_PARSE | 编译时的解析错误。解析错误应该只由解析器生成。 |
8 | E_NOTICE | 运行时的通知。脚本发现可能是一个错误,但也可能在正常运行脚本时发生。 |
16 | E_CORE_ERROR | PHP 启动时的致命错误。这就如同 PHP 核心的 E_ERROR。 |
32 | E_CORE_WARNING | PHP 启动时的非致命错误。这就如同 PHP 核心的 E_WARNING。 |
64 | E_COMPILE_ERROR | 编译时致命的错误。这就如同由 Zend 脚本引擎生成的 E_ERROR。 |
128 | E_COMPILE_WARNING | 编译时非致命的错误。这就如同由 Zend 脚本引擎生成的 E_WARNING。 |
256 | E_USER_ERROR | 用户生成的致命错误。这就如同由程序员使用 PHP 函数 trigger_error() 生成的 E_ERROR。 |
512 | E_USER_WARNING | 用户生成的非致命错误。这就如同由程序员使用 PHP 函数 trigger_error() 生成的 E_WARNING。 |
1024 | E_USER_NOTICE | 用户生成的通知。这就如同由程序员使用 PHP 函数 trigger_error() 生成的 E_NOTICE。 |
2048 | E_STRICT | 运行时的通知。PHP 建议您改变代码,以提高代码的互用性和兼容性。 |
4096 | E_RECOVERABLE_ERROR | 可捕获的致命错误。这就如同一个可以由用户定义的句柄捕获的 E_ERROR(见 set_error_handler())。 |
8191 | E_ALL | 所有的错误和警告的级别,除了 E_STRICT(自 PHP 6.0 起,E_STRICT 将作为 E_ALL的一部分)。 |
mysqli_stmt_init() 函数
定义:
mysqli_stmt_init() 函数初始化声明并返回 mysqli_stmt_prepare() 使用的对象。
语法:
mysqli_stmt_init(connection);
参数:
connection 必需。规定要使用的 MySQL 连接。
技术细节
返回值: 返回一个对象。
PHP 版本: 5+
stmt_bind_param()函数
stmt_bind_param( 'ss', $username, $password);
stmt_bind_param($stmt, ‘sss’, $firstname, $lastname, $email);
该函数绑定参数查询并将参数传递给数据库。第二个参数是 “ss” 。s字符告诉 mysql 参数是字符串。
可以是以下四种参数:
i - 整数
d - 双精度浮点数
s - 字符串
b - 布尔值
每个参数必须指定类型,来保证数据的安全性。通过类型的判断可以减少SQL注入漏洞带来的风险
stmt_bind_result()函数
定义
将变量绑定到准备好的语句以存储结果
版本
5+
语法
mysqli_stmt_bind_result ( mysqli_stmt $stmt , mixed &$var1 [, mixed &$... ] )
参数
参数 | 必需的 | 描述 |
---|---|---|
stmt | 是 | 由 mysqli_stmt_init() 返回的 statement 标识。 |
var1 | 是 | 要绑定的变量。 |
… | 否 | 更多变量 |
返回值
成功时返回 TRUE, 或者在失败时返回 FALSE