mysqli 预处理详解

预处理语句及绑定参数

预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高。

预处理语句的工作原理如下:

  1. 预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标记 。例如:INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
  2. 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出
  3. 执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。
原理图:
mysqli 预处理详解_第1张图片

相比于直接执行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 )






你可能感兴趣的:(PHP,mysqli)