预处理语句及绑定参数
预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高。
预处理语句的工作原理如下:
- 预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标记 。例如:INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
- 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出
- 执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。
原理图:
相比于直接执行SQL语句,预处理语句有两个主要优点:
- 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)
- 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句
- 预处理语句针对SQL注入是非常有用的,因为 参数值发送后使用不同的协议,保证了数据的合法性。
实例:
connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
// 创建预编译对象
$stmt = $mysqli->prepare("INSERT INTO test (id, name) VALUES(?, ?)");
//参数绑定->给?号赋值 这里类型和顺序要一致,类型、赋值和??的顺序要一致
//参数有以下四种类型:
//i - integer(整型)
//d - double(双精度浮点型)
//s - string(字符串)
//b - BLOB(binary large object:二进制大对象)
$stmt->bind_param("is", $id, $name);
// 设置参数
$id = "1";
$name = "Doe";
// 执行
$stmt->execute();
$id = "2";
$name = "asd";
$stmt->execute();
$id = "3";
$name = "gfh";
$stmt->execute();
//关闭预编译
$stmt->close();
//关闭数据库连接
$mysqli->close();
?>
mysqli_stmt 类说明:
如下所示,创建
预编译(mysqli_stmt )对象 $stmt
$stmt = $mysqli->prepare($sql);
mysqli_stmt 属性:
1、int $stmt->affected_rows; 返回上次sql语句执行所影响的行数
2、int $stmt->errno; 返回最近执行的sql语句的错误代码
3、array $stmt->error_list; 最近调用函数的错误列表。每个错误都是一个带有 errno(错误代码)、error(错误文本)和 sqlstate 的关联数组
4、string $stmt->error;
5、int $stmt->field_count; 返回给定语句查询结果集的字段数目
6、int $stmt->insert_id; 获取从先前插入操作生成的标识id
7、int $stmt->num_rows; 返回语句结果集中的行数
8、int $stmt->param_count; 返回执行的sql语句的参数个数
9、string $stmt->sqlstate;
mysqli_stmt 方法:
int
mysqli_stmt::attr_get (
int $attr
)
bool
mysqli_stmt::attr_set (
int $attr
,
int $mode
)
bool
mysqli_stmt::bind_param (
string $types
,
mixed &$var1
[,
mixed &$...
] )
bool
mysqli_stmt::bind_result (
mixed &$var1
[,
mixed &$...
] )
bool
mysqli_stmt::close (
void )
void
mysqli_stmt::data_seek (
int $offset
)
bool
mysqli_stmt::execute (
void )
bool
mysqli_stmt::fetch (
void )
void
mysqli_stmt::free_result (
void )
mysqli_result
mysqli_stmt::get_result (
void )
object
mysqli_stmt::get_warnings (
mysqli_stmt $stmt
)
public
bool
mysqli_stmt::more_results (
void )
public
bool
mysqli_stmt::next_result (
void )
mixed
mysqli_stmt::prepare (
string $query
)
bool
mysqli_stmt::reset (
void )
mysqli_result
mysqli_stmt::result_metadata (
void )
bool
mysqli_stmt::send_long_data (
int $param_nr
,
string $data
)
bool
mysqli_stmt::store_result (
void )