mysqli 预处理语句(prepared)

mysqli 函数据支持prepared 语句的使用,它们对于在执行大量具有不同数据的相同查询时,可以提高执行速度。他们也可以免受SQL 注入

prepared 语句的基本思想是可以向mysql 发送需要执行的查询模板,然后在单独发送数据。我们可以向相同的prepared 语句发送大量相同的数据;这个特性对批处理的插入操作来说是非常有用的。

一.把mysqli 连接,单例封装到一个类里面

<?php
class Myconnect {
	// 主机名
	const HOSTNAME = "127.0.0.1";
	// 用户名
	const USERNAME = "root";
	// 密码
	const PASSWORD = "123456";
	// 数据库名
	const DBNAME = "liuxingyu";
	// mysql 的编码
	const MYSQL_CHARSET = "utf8";
	private static $instance;
	private $dbconn;
	/**
	 * 私有构造方法
	 */
	private function __construct() {
		$this->dbconn = mysqli_connect ( self::HOSTNAME, self::USERNAME, self::PASSWORD, self::DBNAME );
		$this->dbconn->set_charset ( self::MYSQL_CHARSET );
	}
	/**
	 * 获取mysql 连接实例
	 *
	 * return @mysqli
	 */
	public function getDbconn() {
		return $this->dbconn;
	}
	/**
	 * 放克隆
	 */
	private function __clone() {
	}
	/**
	 * 获取数据库的连接实例
	 *
	 * @return DBconnectsinglon
	 */
	public static function getDbinstance() {
		if (! (self::$instance instanceof self)) {
			self::$instance = new self ();
		}
		return self::$instance;
	}
}
?>

=. 插入的prepared 下面我们就讲解这个语句吧
<?php
require_once dirname ( __FILE__ ) . "/Myconnect.php";
$tilte = $_POST [title];
$content = $_POST [content];
$tim = time ();
$db = Myconnect::getDbinstance ();
$query = "insert into lxy(title,content,tim) values(?,?,?)";
$stmt = $db->getDbconn ()->prepare ( $query );
$stmt->bind_param ( sss, $tilte, $content, $tim );
$stmt->execute ();
$ro = $stmt->affected_rows;
echo $ro;

dbconn = mysqli_connect ( self::HOSTNAME, self::USERNAME, self::PASSWORD, self::DBNAME ); $this->dbconn->set_charset ( self::MYSQL_CHARSET ); } /** * 获取mysql 连接实例 * * return @mysqli */ public function getDbconn() { return $this->dbconn; } /** * 放克隆 */ private function __clone() { } /** * 获取数据库的连接实例 * * @return DBconnectsinglon */ public static function getDbinstance() { if (! (self::$instance instanceof self)) { self::$instance = new self (); } return self::$instance; } } ?> =. 插入的prepared 下面我们就讲解这个语句吧 getDbconn ()->prepare ( $query ); $stmt->bind_param ( sss, $tilte, $content, $tim ); $stmt->execute (); $ro = $stmt->affected_rows; echo $ro;
当设置查询时不是替换前面已经生成的变量,而是在每一段数据的位置设置问好,在这些问号的周围,不能在设置问号或其他的分界符号

$stmt = $db->getDbconn ()->prepare ( $query ); 构建一个语句对象或需要用来完成实际处理的资源

$stmt->bind_param() 告诉php那些变量应该被问号所代替,第一个参数是一个格式化字符串,与printf()使用的格式化字符串不同。在这里,所指替代问号变量的类型,s 表示

字符串 d 表示双精度 i表示整数 b表示 blog 在这个参数后,必须列出与语句中的问号数量相同的变量。他们将依次被替换.

$stmt->execute(); 函数 将真正运行这个查询。我们可以访问受影响行数并关闭这个语句。

经验分享 程序员 微信小程序 职场和发展