thinkphp3.2.3 原生sql参数绑定的修改

浏览:741 发布日期:2019/02/21 分类:技术分享
thinkphp3.2.3没有原生sql数据绑定的功能,但我喜欢用原生的sql,所以就加上了原生sql的参数绑定,以提高安全。修改和使用如下:

第一部分:修改thinkphp3.2.3\Library\Think\Model.class.php,加上:


/**
* 加上参数绑定
* 2019-02-21
*/

public function statementPrepare($sql){
$sql = $this->parseSql($sql,$parse);
return $this->db->statementPrepare($sql);
}

public function statementBindParam($key, $value){
return $this->db->statementBindParam($key, $value);
}

public function statementQuery(){
return $this->db->statementQuery();
}

public function statementExecute(){
return $this->db->statementExecute();
}


第二部分:修改thinkphp3.2.3\Library\Think\Db\Driver.class.php,加上:

/**
* 添加参数绑定:statementQuery, statementExecute, statementPrepare, statementBindParam
* 2019-02-21
*/

public function statementPrepare($str){
$this->initConnect(false);
if ( !$this->_linkID ){
return false;
}
$this->queryStr = $str;
//释放前次的查询结果
if ( !empty($this->PDOStatement) ){
$this->free();
}
N('db_query',1);
// 记录开始执行时间
G('queryStartTime');
$this->PDOStatement = $this->_linkID->prepare($str);

if(false === $this->PDOStatement){
throw_exception($this->error());
}
}


public function statementBindParam($key, $value){
$this->PDOStatement->bindParam($key, $value);
}

/**
* 执行查询 返回数据集
* @access public
* @param string $str sql指令
* @param boolean $fetchSql 不执行只是获取SQL
* @return mixed
*/
public function statementQuery() {
if(false === $this->PDOStatement){
throw_exception($this->error());
}
$result = $this->PDOStatement->execute();
$this->debug(true);
if(false === $result){
$this->error();
return false;
} else {
return $this->getResult();
}
}


public function statementExecute(){
if(false === $this->PDOStatement){
throw_exception($this->error());
}
$result = $this->PDOStatement->execute();
$this->debug(true);
if ( false === $result) {
$this->error();
return false;
} else {
$this->numRows = $this->PDOStatement->rowCount();
if($flag || preg_match("/^\s*(INSERT\s+INTO|REPLACE\s+INTO)\s+/i", $this->queryStr)) {
$this->lastInsID = $this->getLastInsertId();
return $this->lastInsID;
}
return $this->numRows;
}
}



第三部分,使用参数绑定的例子:

public function testStatement(){
$id = 50;
$title = '金字塔';
$sql = "SELECT title FROM ".C('DB_PREFIX')."warrant WHERE id > :id AND title LIKE :title";
M()->statementPrepare($sql); //预处理
M()->statementBindParam(':id', $id); //参数绑定
M()->statementBindParam(':title', '%'.$title.'%'); //参数绑定
$select = M()->statementQuery(); //查询
dump($select);
}


最佳答案
评论( 相关
后面还有条评论,点击查看>>