国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
SQL的Where語句 | 酷殼 - CoolShell.cn
userphoto

2010.05.20

關注

SQL的Where語句

2009年12月1日

某DBA在查看自己的數(shù)庫日志的時候,看到了數(shù)據庫服務器上出現(xiàn)了很多很怪異的SQL的Where條件語句,是下面這個樣子:(所有的where語句前都有了一個叫“1=1”的子條件)呵呵。

要理解這個事情的原因其實并不難。只要你是一個編寫數(shù)據庫的程序員,你就會知道——動態(tài)生成where后的條件的“麻煩”,那就是條件的“分隔”-and或or。下面聽我慢慢說來。

我們知道,大多數(shù)的查詢表單都需要用戶輸出一堆查詢條件,然后我們的程序在后臺要把這些子條件用and組合起來。于是,把and加在各個條件的中間就成為了一件“難事”,因為你的程序需要判斷:

  • 如果沒有條件的話,則不需要where
  • 如果只有一個條件的話,不需要and.
  • 如果有多個條件的話,
    • 如果and是持續(xù)加在每個條件后面的話,那么就要判斷是否是最后一個條件,因為最后一個不能加and.
    • 同樣,如果and是要加在每個條件前面的話,你就需要判斷是否是第一個,如果是,那就不加。

真是TMD太煩了,所以,編程“大拿”引入了“1=1”條件語句。于是,編程的難度大幅度下降,你可以用單一的方式來處理這若干的查詢子條件了。而1=1應該會被數(shù)據庫引擎優(yōu)化時給去掉了。

1 <pre><code>$query = "SELECT name FROM table WHERE 1=1 ";
2   
3 foreach($clauses as $key => $value){
4     $query .= " AND ".escape($key)."=".escape($value)." ";
5 }
6 </code></pre>

呵呵,DBA怎么能夠理解我們瘋狂程序員的用心良苦啊

另外,在這里說一下,這樣的做法看似很愚蠢,但很有效,在PHP的世界中,也有人使用下面這樣的做法——使用了PHP的implode函數(shù)。

01 <pre><code>/**
02  * @param string $base base of query, e.g. UPDATE table SET
03  * @param string $logic logic for concatenating $assoc, e.g. AND
04  * @param array $assoc associative array of `field`=>'value' pairs to concatenate and append to $base
05  * @param string $suffix additional clauses, e.g. LIMIT 0,30
06  * @return string
07  */
08 function construct_sql($base, $logic, $clauses, $suffix='')
09 {
10     // initialise array to avoid warnings/notices on some PHP installations
11     $queries = array();
12   
13     // create array of strings to be glued together by logic
14     foreach($clauses as $key => $value)
15         $queries[] = "`" . escape($key) . "`='" . escape($value) . "'";
16   
17     // add a space in case $base doesn't have a space at the end and glue clauses together
18     $query .= " " . implode(" $logic ",$queries) . " " . $suffix . ";";
19   
20     return $query;
21 }
22   
23 /**
24  * @param string $str string to escape for intended use
25  * @return string
26  */
27 function escape($str)
28 {
29     return mysql_real_escape_string($str);
30 }
31 </code></pre>

于是,我們可以這樣使用:(為什么我們要在update語句后加上“Limit 1”呢?這個關系到性能問題,關于這方面的話題,你可以查看本站的《MySQL性能優(yōu)化的最佳20+條經驗

01 <pre><code>$updates = array(
02     'field1'=>'val1'
03     'field2'=>'val2'
04 );
05 $wheres = array(
06     'field1'=>'cond1',
07     'field2'=>'cond2'
08 );
09 echo construct_sql(construct_sql("UPDATE table SET", ", ", $updates) . " WHERE ", " AND ", $wheres),"LIMIT 1");
10 </code></pre>
11 <pre></pre>

下面是輸出結果:

1 UPDATE table SET `field1`='val1', `field2`='val2' WHERE `field1`='cond1' AND `field2`='cond2' LIMIT 1;

 

(全文完)

 

(17 人打了分,平均分: 4.47 )
 Loading ...

 

陳皓 編程語言, 軼事趣聞 , ,

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
前端學PHP之PDO預處理語句
php下mysql數(shù)據庫操作類
PHP中的MySQLi擴展學習(三)mysqli的基本操作
OledbHelper ,c#訪問OLEDB數(shù)據源的一個數(shù)據訪問層公共接口文件
數(shù)據庫連接類,繼承自PDO
ecshop源碼分析
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服