分析理解PHP+MySQL环境中标准的参数化查询方式的源码
<?php
echo '<br/>';
error_reporting(E_ERROR);
$mysqli = new mysqli("localhost","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
|