Heim > Backend-Entwicklung > PHP-Tutorial > thinkphp3.2.0 setInc-Methode

thinkphp3.2.0 setInc-Methode

小云云
Freigeben: 2023-03-19 19:18:01
Original
1923 Leute haben es durchsucht

Dieser Artikel enthält hauptsächlich eine umfassende Analyse des Quellcodes der setInc-Methode von thinkphp3.2.0, die hoffentlich für alle hilfreich ist. Folgen wir dem Herausgeber und schauen wir uns das an. Ich hoffe, es kann allen helfen.

Schauen wir uns zunächst das offizielle Beispiel von setInc an:

Erfordert ein Feld und einen automatisch inkrementierten Wert (Standard ist 1)

Anhand des folgenden Beispiels analysieren wir Schritt für Schritt, wie die unterste Ebene implementiert wird:

<?php
namespace Home\Controller;
use Think\Controller;

class TestController extends Controller {
  public function test() {
    $tb_test = M(&#39;test&#39;);
    $tb_test->where(['id'=>1])->setInc('test_number',2); //每次添加2
    dump($tb_test->getLastSql());
    //string(67) "UPDATE `tb_test` SET `test_number`=test_number+2 WHERE ( `id` = 1 )"
  }
}
Nach dem Login kopieren

Der erste Schritt muss darin bestehen, den Quellcode der setInc-Methode zu finden:

Hier habe ich die globale Suchmethode von phpstrom verwendet und festgestellt, dass sich setInc unter projThinkPHPLibraryThinkModel.class.php befindet

/**
   * 字段值增长
   * @access public
   * @param string $field 字段名
   * @param integer $step 增长值
   * @return boolean
   */
  public function setInc($field,$step=1) {
    return $this->setField($field,array('exp',$field.'+'.$step));
  }
Nach dem Login kopieren

Sie können sehen, dass hier die setField-Methode verwendet wird, und dann exp custom verwenden Ausdruck zum Festlegen von $field = $ field + $step An diesem Punkt verstehen wir ein wenig über das Prinzip.

Aber die Frage kommt wieder. Wie wird setField implementiert? Suchen Sie unter derselben Datei die setField-Methode:

/**
   * 设置记录的某个字段值
   * 支持使用数据库字段和方法
   * @access public
   * @param string|array $field 字段名
   * @param string $value 字段值
   * @return boolean
   */
  public function setField($field,$value='') {
    if(is_array($field)) {
      $data      =  $field;
    }else{
      $data[$field]  =  $value;
    }
    return $this->save($data);
  }
Nach dem Login kopieren

Hier sehen wir die häufig verwendete Speichermethode, wobei $data[$field] = $value; eigentlich $data['test_number'] = array ist ("exp", "test_number+2")

Dann schauen wir uns die am häufigsten verwendete Speichermethode an:

/**
   * 保存数据
   * @access public
   * @param mixed $data 数据
   * @param array $options 表达式
   * @return boolean
   */
  public function save($data='',$options=array()) {
    if(empty($data)) {
      // 没有传递数据,获取当前数据对象的值
      if(!empty($this->data)) {
        $data      =  $this->data;
        // 重置数据
        $this->data   =  array();
      }else{
        $this->error  =  L('_DATA_TYPE_INVALID_');
        return false;
      }
    }
    // 数据处理
    $data    =  $this->_facade($data);
    // 分析表达式
    $options  =  $this->_parseOptions($options);
    $pk     =  $this->getPk();
    if(!isset($options['where']) ) {
      // 如果存在主键数据 则自动作为更新条件
      if(isset($data[$pk])) {
        $where[$pk]     =  $data[$pk];
        $options['where']  =  $where;
        unset($data[$pk]);
      }else{
        // 如果没有任何更新条件则不执行
        $this->error    =  L('_OPERATION_WRONG_');
        return false;
      }
    }
    if(is_array($options['where']) && isset($options['where'][$pk])){
      $pkValue  =  $options['where'][$pk];
    }    
    if(false === $this->_before_update($data,$options)) {
      return false;
    }    
    $result   =  $this->db->update($data,$options);
    if(false !== $result) {
      if(isset($pkValue)) $data[$pk]  = $pkValue;
      $this->_after_update($data,$options);
    }
    return $result;
  }
Nach dem Login kopieren

Das Wichtigste ist $options = $this-> _parseOptions ($options); und $result = $this->db->update($data,$options); Ersteres konvertiert die Parameter in ein String-Array zum Spleißen von SQL, und letzteres ruft projtptestThinkPHPLibraryThinkDb.class.php auf Die Aktualisierungsmethode unten:

/**
   * 更新记录
   * @access public
   * @param mixed $data 数据
   * @param array $options 表达式
   * @return false | integer
   */
  public function update($data,$options) {
    $this->model =  $options['model'];
    $sql  = 'UPDATE '
      .$this->parseTable($options['table'])
      .$this->parseSet($data)
      .$this->parseWhere(!empty($options['where'])?$options['where']:'')
      .$this->parseOrder(!empty($options['order'])?$options['order']:'')
      .$this->parseLimit(!empty($options['limit'])?$options['limit']:'')
      .$this->parseLock(isset($options['lock'])?$options['lock']:false)
      .$this->parseComment(!empty($options['comment'])?$options['comment']:'');
    return $this->execute($sql,$this->parseBind(!empty($options['bind'])?$options['bind']:array()));
  }
Nach dem Login kopieren

Am Ende wird tatsächlich die Ausführungsmethode der Treiberklasse projThinkPHPLibraryThinkDbDriverMysql.class.php verwendet.

/**
   * 执行语句
   * @access public
   * @param string $str sql指令
   * @return integer|false
   */
  public function execute($str) {
    $this->initConnect(true);
    if ( !$this->_linkID ) return false;
    $this->queryStr = $str;
    //释放前次的查询结果
    if ( $this->queryID ) {  $this->free();  }
    N('db_write',1);
    // 记录开始执行时间
    G('queryStartTime');
    $result =  mysql_query($str, $this->_linkID) ;
    $this->debug();
    if ( false === $result) {
      $this->error();
      return false;
    } else {
      $this->numRows = mysql_affected_rows($this->_linkID);
      $this->lastInsID = mysql_insert_id($this->_linkID);
      return $this->numRows;
    }
  }
Nach dem Login kopieren

Verwenden Sie abschließend die unterste Ebene von mysql_query, um die SQL-Anweisung auszuführen.

Bisher wurde der Quellcode von setInc grob überprüft. Ich glaube, dass jeder ein besseres Verständnis dafür hat, wie setInc ausgeführt wird.

Verwandte Empfehlungen:

ThinkPHP3.2.3-Methode zur statischen Seitenimplementierung

ThinkPHP3.2-Implementierung der gemeinsamen Nutzung benutzerdefinierter Paginierungsstile

Thinkphp3.2 löst das Problem, dass beim Hochladen mehrerer Dateien nur eine Datei hochgeladen wird

Das obige ist der detaillierte Inhalt vonthinkphp3.2.0 setInc-Methode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage