<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # [更新] `5.1.25`查詢參數綁定的改進 >[danger] `V5.1.25`版本已經發布了,該版本主要對查詢的參數綁定做了一些優化和改進,本文略為講解下一些改進的細節以及注意事項。 ## 自動參數綁定 可能很多開發者在使用`ThinkPHP`的時候并沒有特別注意到查詢參數綁定,因為幾乎所有的查詢都是自動參數綁定的。例如,下面是一個很普通的查詢: ``` Db::name('user')->where('id', 10)->find(); ``` 拋開如何把查詢構造器語法解析為最終的SQL,實際在執行最終的解析SQL的時候會先經過下面的三個步驟。 ``` // 預處理 $PDOStatement = $PDO->prepare('SELECT * FROM user WHERE id = :id'); // 參數綁定 $PDOStatement->bindValue('id', 10, PDO::PARAM_INT); // 執行SQL查詢 $PDOStatement->execute(); ``` 而自動參數綁定其實是在解析最終SQL的時候處理完成的,也就是把`id`的實際值使用`:id`占位符處理,然后在綁定數據中進行命名占位符的綁定對應,最終交由`bindValue`方法統一處理。 因此,基本上你不需要關注參數綁定的存在,也不需要進行手動參數綁定,只有在少數原生查詢或者字符串條件的情況下,才需要手動進行參數綁定,一般來說有下面兩種參數綁定方式。 ``` // 使用?占位符綁定 Db::query("select * from think_user where id=? AND status=?", [8, 1]); Db::name('user') ->where('where id=? AND status=?', [8,1]) ->select(); // 使用命名占位符綁定 Db::name('user') ->where('where id=:id AND status=:status', ['id' => 8, 'status' => 1]) ->select(); Db::execute("update think_user set name=:name where status=:status", ['name' => 'thinkphp', 'status' => 1]); ``` >[danger] 除了上述的手動綁定方式外,`Query`類還提供了一個`bind`方法用于指定查詢的參數綁定,但并不建議使用,因為使用查詢表達式查詢的數據都會進行自動參數綁定,這個情況下進行手動綁定是多余的,對性能也不會有任何的提升。 ## 性能優化 因為`5.1`版本一直以來為了直觀,采用的都是命名(占位符)的綁定方式,但由于命名綁定的方式需要檢測是否存在相同的命名,以及做出避免沖突的處理,從而帶來了一定的性能開銷,這個性能開銷在你的數據量特別大的情況下(例如`insertAll`了大量的數據)會變得非常明顯,而真正開銷最大的地方其實是在每次獲取實際的查詢SQL都會進行命名綁定的參數替換。 >[info] 出于性能的優化考慮,`5.1.25`版本開始底層改為`?`占位符處理查詢參數綁定,但并不影響你在**使用原生查詢**的時候使用命名占位符綁定。 此次改進后,對于大量數據的查詢性能會有明顯的提升。之前版本如果使用`insertAll()`方法批量寫入1000條數據的性能開銷在`3s`左右(這是一個幾乎奔潰的性能),性能甚至遠遠不如模型類的`saveAll()`方法大約`0.04s`(因為`saveAll`方法是每次寫入一條數據)。改進后使用`insertAll()`方法批量寫入1000條數據的性能開銷在`0.03s`左右,性能略好于模型類的`saveAll()`方法大約`0.04s`,效果還是比較顯著的。 如果你不幸暫時沒有辦法升級到`5.1.25`版本以上,那么建議你在使用`insertAll`方法批量寫入大數據的時候,改為下面的方式。 ``` // 多次寫入,每次寫入100條 Db::name('user')->limit(100)->insertAll($data); ``` 那么有什么注意事項呢?我們知道,PDO的參數綁定是不支持`?`占位符和命名占位符混合使用的。當你在查詢構造器中使用了命名占位符的話,系統會自動轉化為`?`占位符的方式,包括下面幾種情況。 ``` // 使用命名占位符綁定 系統會自動轉換為?占位符方式 // 因此必須確保你的變量綁定順序和占位符順序一致 // 正確 Db::name('user') ->where('where id=:id AND status=:status', ['id' => 8, 'status' => 1]) ->select(); // 正確 Db::name('user') ->where('where id=? AND status=?', [ 8, 1]) ->select(); // 正確但不建議使用 Db::name('user') ->where('where id=:id AND status=?', ['id' => 8, 1]) ->select(); // 錯誤 Db::name('user') ->where('where id=:id AND status=:status', [ 'status' => 1, 'id' => 8]) ->select(); ``` 另外,查詢構造器的`whereExp`和`whereRaw`方法中的參數綁定也會進行自動轉換。 ``` Db::name('user') ->whereRaw('where id=:id AND status=:status', ['id' => 8, 'status' => 1]) ->select(); ``` 但原生查詢則不做任何轉換(只要你使用統一的占位符方式即可),因此下面的手動參數綁定不做任何處理,并且依然有效。 ``` // 使用?占位符綁定 Db::query("select * from think_user where id=? AND status=?", [8, 1]); // 使用命名占位符綁定 Db::execute("update think_user set name=:name where status=:status", ['name' => 'thinkphp', 'status' => 1]); ``` >[danger] 最后,再次強調,不要手動使用`bind`方法進行參數綁定,沒有必要,而且會導致不可預知的問題。 ## 浮點型支持 PDO參數綁定對浮點型并沒有做特殊的支持,尤其是在PHP`7.2+`版本開始,對`PDO::PARAM_INT`綁定類型更為嚴格后,導致浮點型會被自動處理為整數。 為了更好的支持浮點型的參數綁定,ThinkPHP`5.1.25`版本引入了一個內置常量`Connection::PARAM_FLOAT`作為內部自動參數綁定的綁定類型,自動對浮點型的數據內部按照`PDO::PARAM_STR`進行參數綁定,但在生成SQL語句的時候仍然按照浮點型數據進行處理。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看