预处理的优势
预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)。
绑定参数减少了服务器带宽,你只需要发送查询的参数,而不用每次都发送整个语句。
预处理语句针对
SQL
注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。
生成预处理语句
说明
面向对象风格
mysqli_stmt mysqli::prepare( string $query)
过程化风格
mysqli_stmt mysqli_prepare( mysqli $link, string $query)
生成预处理语句,并返回一个 stmtment
对象,用于对该语句进行进一步的操作。查询必须由单个 SQL
语句组成。
必须使用 mysqli_stmt::bind_param()
和(或) mysqli_stmt::bind_result()
将参数标记绑定到应用程序变量,然后才能执行该语句或获取行。
创建 mysqli_stmt
对象的其他方式:
mysqli::stmt_init()
虽然不推荐,但目前仍然可以使用
new mysqli_stmt()
创建
以上两种方式,结合 mysqli_stmt::prepare()
使用,与单独使用 mysqli::prepare()
等效
参数
link 连接标识(仅过程化风格需要此参数)
query SQL语句
返回值
返回一个 stmtment
对象,失败则返回 false
绑定变量到预处理语句
说明
面向对象风格
bool mysqli_stmt::bind_param( string $types, mixed &$var1[, mixed &$...] )
过程化风格
bool mysqli_stmt_bind_param( mysqli_stmt $stmt, string $types, mixed &$var1[, mixed &$...] )
绑定变量到预处理语句中的参数标记位。
此变量作为引用被绑定,并只在 mysqli_stmt::execute() 被调用的时候才取其值。
参数
stmt 由
mysqli::prepare()
或mysqli::stmt_init()
返回的statement
标识。(仅过程化风格需要此参数)types 变量类型
包含一个或多个字符的字符串(多个字符直接没有分隔符,如
si
),这些字符为相应的绑定变量指定类型:i 对应变量的类型为 integer
d 对应变量的类型为 double
s 对应变量的类型为 string
b 对应变量的类型为 blob
var1
可变数量的变量。变量的数目和
types
的长度必须与语句中的参数个数匹配
返回值
true
或 false
将结果集中的列绑定到变量
说明
面向对象风格
bool mysqli_stmt::bind_result ( mixed &$var1 [, mixed &$... ] )
过程化风格
bool mysqli_stmt_bind_result ( mysqli_stmt $stmt , mixed &$var1 [, mixed &$... ] )
将结果集中的列依次绑定到变量。绑定的变量数量要与结果集中的总列数一致。
mysqli_stmt::bing_result()
需要搭配 mysqli_stmt::fetch()
使用
参数
stmt 由
mysqli::prepare()
或mysqli::stmt_init()
返回的statement
标识。(仅过程化风格需要此参数)var1 要绑定的变量
返回值
true
或 false
。
mysqli_stmt::bind_param 在 mysqli_stmt::execute 之前绑定,一次绑定可以多次复用
mysqli_stmt::bind_result 在 mysqli_stmt::execute 之前或之后绑定,一次绑定可以多次复用
$stmt = mysqli::prepare($sql);
$stmt->bind_param('s', $name);
//可变数量的参数列表
$result = null;
$stmt->bind_result($result);
$name = 'f';
$stmt->execute();
while ( $stmt->fetch()) {
print_r($result);
}
$name = 'd';
$stmt->execute();
while ( $stmt->fetch()) {
print_r($result);
}
执行预处理语句
说明
面向对象风格
bool mysqli_stmt::execute ( void )
过程化风格
bool mysqli_stmt_execute ( mysqli_stmt $stmt )
执行 mysqli::prepare()
创建的预处理语句。如果是 INSERT
UPDATE
DELETE
语句,则在执行后可以使用 $mysqli_stmt->affected_rows
获得受影响的行数;如果是 SELECT
语句,则在执行后可以使用处理结果集的函数 mysqli_stmt::bind_result()
或 mysqli_stmt::get_result()
参数
- stmt 由
mysqli::prepare()
或mysqli::stmt_init()
返回的statement
标识。(仅过程化风格需要此参数)
返回值
true
或 false
从预处理语句中提取结果到绑定变量
说明
面向对象风格
bool mysqli_stmt::fetch ( void )
过程化风格
bool mysqli_stmt_fetch ( mysqli_stmt $stmt )
将预处理语句中的结果提取到 mysqli_stmt::bind_result()
绑定的变量中。
参数
- stmt 由
mysqli::prepare()
或mysqli::stmt_init()
返回的statement
标识。(仅过程化风格需要此参数)
返回值
true
或 false
从预处理语句中传输结果集到本地
说明
面向对象风格
bool mysqli_stmt::store_result ( void )
过程化风格
bool mysqli_stmt_store_result ( mysqli_stmt $stmt )
从预处理语句中传输结果集到本地。之后使用 mysqli_stmt::bind_result()
和 mysqli_stmt::fetch()
从本地存储中提取结果到绑定变量。
参数
- stmt 由
mysqli::prepare()
或mysqli::stmt_init()
返回的statement
标识。(仅过程化风格需要此参数)
返回值
true
或 false
从预处理语句中获得结果集
说明
面向对象风格
mysqli_result mysqli_stmt::get_result ( void )
过程化风格
mysqli_result mysqli_stmt_get_result ( mysqli_stmt $stmt )
从预处理语句中获得结果集,一次性取回所有结果集存储在本地,之后通过 mysqli_result::fetch*
系列函数处理。
参数
- stmt 由
mysqli::prepare()
或mysqli::stmt_init()
返回的statement
标识。(仅过程化风格需要此参数)
返回值
成功返回 mysqli_result
对象,失败返回 false
释放与结果集关联的内存
说明
面向对象风格
void mysqli_stmt::free_result( void)
过程化风格
void mysqli_stmt_free_result( mysqli_stmt $stmt)
释放由 mysqli_stmt::store_result()
分配的存储结果集的内存
参数
- stmt 由
mysqli::prepare()
或mysqli::stmt_init()
返回的statement
标识。(仅过程化风格需要此参数)
返回值
没有返回值
关闭预处理语句
说明
面向对象风格
bool mysqli_stmt::close( void)
过程化风格
bool mysqli_stmt_close( mysqli_stmt $stmt)
关闭预处理语句,释放未处理的句柄
参数
- stmt 由
mysqli::prepare()
或mysqli::stmt_init()
返回的statement
标识。(仅过程化风格需要此参数)
返回值
true
或 false
与 mysqli
对象的属性含义一样的属性
错误代码
$errno
错误描述
$error
错误编码
$sqlstate
错误数组
$error_list
最后一次插入时自动生成的id
$insert_id
受影响的行数
$affected_rows
以上几个 mysqli_stmt
对象属性与 mysqli
对象的属性含义一样,参考这里
与 mysqli_result
对象的属性含义一样的属性.
返回总列数
$field_count
返回总行数
$num_rows