注意:⽆参数调⽤函数在php7中会判错,但是php5不会,所以版本利⽤有限跟进delete⽅法
路径:ThinkPHP/Mode/Lite/Model.class.php
public function delete($options=array())
{
$pk=$this->getPk();
if(empty($options)&&empty($this->options['where'])){
// 如果删除条件为空则删除当前数据对象所对应的记录
if(!empty($this->data)&&isset($this->data[$pk])){
return$this->delete($this->data[$pk]);
}else{
return false;
}
}
if(is_numeric($options)|| is_string($options)){
// 根据主键删除记录
if(strpos($options,',')){
$where[$pk]=array('IN',$options);
}else{
$where[$pk]=$options;
}
$options=array();
$options['where']=$where;
}
// 根据复合主键删除记录
if(is_array($options)&&(count($options)>0)&&is_array($pk)){
$count=0;
foreach(array_keys($options)as$key){
if(is_int($key)){
$count++;
}
}
thinkphp3
if(count($pk)==$count){
$i=0;
foreach($pk as$field){
$where[$field]=$options[$i];
unset($options[$i++]);
}
$options['where']=$where;
}else{
return false;
}
}
// 分析表达式
$options=$this->_parseOptions($options);
if(empty($options['where'])){
// 如果条件为空不进⾏删除操作除⾮设置 1=1
return false;
}
if(is_array($options['where'])&&isset($options['where'][$pk])){
$pkValue=$options['where'][$pk];
}
if(false===$this->_before_delete($options)){
return false;
}
$result=$this->db->delete($options);//数据库驱动类中的delete()
if(false!==$result&&is_numeric($result)){
$data=array();
if(isset($pkValue)){
$data[$pk]=$pkValue;
$data[$pk]=$pkValue;
}
$this->_after_delete($data,$options);
}
// 返回删除记录个数
return$result;
}
在第⼆次调⽤delete⽅法时,调⽤了数据库驱动类中的delete
路径:ThinkPHP/Library/Think/Db/Driver.class.php
public function delete($options=array())
{
$this->model=$options['model'];
$this->parseBind(!empty($options['bind'])?$options['bind']:array());
$table=$this->parseTable($options['table']);
$sql='DELETE FROM '.$table;
if(strpos($table,',')){
// 多表删除⽀持USING和JOIN操作
if(!empty($options['using'])){
$sql.=' USING '.$this->parseTable($options['using']).' ';
}
$sql.=$this->parseJoin(!empty($options['join'])?$options['join']:'');
}
$sql.=$this->parseWhere(!empty($options['where'])?$options['where']:'');
if(!strpos($table,',')){
// 单表删除⽀持order和limit
$sql.=$this->parseOrder(!empty($options['order'])?$options['order']:'')
.$this->parseLimit(!empty($options['limit'])?$options['limit']:'');
}
$sql.=$this->parseComment(!empty($options['comment'])?$options['comment']:'');
return$this->execute($sql,!empty($options['fetch_sql'])? true :false);
}
关键代码:
$table=$this->parseTable($options['table']);
$sql='DELETE FROM '.$table;
return$this->execute($sql,!empty($options['fetch_sql'])? true :false);
这⾥$table经过parseTable函数后拼接到sql语句中,最后执⾏sql语句
跟进parseTable
protected function parseTable($tables)
{
if(is_array($tables)){
/
/ ⽀持别名定义
$array=array();
foreach($tables as$table=>$alias){
if(!is_numeric($table)){
$array[]=$this->parseKey($table).' '.$this->parseKey($alias);
}else{
$array[]=$this->parseKey($alias);
}
}
$tables=$array;
}elseif(is_string($tables)){
$tables=explode(',',$tables);
array_walk($tables,array(&$this,'parseKey'));
}
return implode(',',$tables);
}
其中的数据经过parseKey处理,跟进
protected function parseKey(&$key)
{
return$key;
}
直接返回,⽆任何过滤
那么最后返回结果执⾏execute⽅法
跟进,该函数开头有初始化连接操作
$this->initConnect(true);
跟进
protected function initConnect($master=true)
{
if(!empty($this->config['deploy']))
// 采⽤分布式数据库
{
$this->_linkID=$this->multiConnect($master);
}else
/
/ 默认单数据库
if(!$this->_linkID){
$this->_linkID=$this->connect();
}
}
再跟进connect
public function connect($config='',$linkNum=0,$autoConnection=false)
{
if(!isset($this->linkID[$linkNum])){
if(empty($config)){
$config=$this->config;
}
try{
if(empty($config['dsn'])){
$config['dsn']=$this->parseDsn($config);
}
if(version_compare(PHP_VERSION,'5.3.6','<=')){
// 禁⽤模拟预处理语句
$this->options[PDO::ATTR_EMULATE_PREPARES]=false;
}
$this->linkID[$linkNum]=new PDO($config['dsn'],$config['username'],$config['password'],$this->options);
}catch(\PDOException $e){
if($autoConnection){
trace($e->getMessage(),'','ERR');
return$this->connect($autoConnection,$linkNum);
}elseif($config['debug']){
E($e->getMessage());
}
}
}
return$this->linkID[$linkNum];
}
这⾥控制 $this->config 来连接数据库,⽤mysql类来实例化
因此我们只需要在Mysql下配置好数据库配置即可
pop链构造
最终利⽤链
__destruct()->destroy()->delete()->Driver::delete()->Driver::execute()->Driver::initConnect()->Driver::connect()->
构造:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。