我們可以使用extract()函數,比如在接收頁面指令碼的最前面加上extract($_POST);extract($_GET);這樣的語句,匯出幾個用於表單處理的超級變數數組值,如以下代碼所示:
@extract(i_addslashes($_POST), EXTR_OVERWRITE); @extract(i_addslashes($_GET), EXTR_OVERWRITE); @extract(i_addslashes($_COOKIE), EXTR_OVERWRITE); @extract(i_addslashes($_SESSION), EXTR_OVERWRITE); |
我們看一個使用extract匯出為正常變數的指令碼例子
<?php // 將$_GET和$_POST超級變數數組擷取的變數轉為正常的變數,這樣直接顯示變數名稱即可 extract($_GET); extract($_POST); echo "您好, $username $age"; ?> <form action="" method="post"> 姓名:<input type="text" name="username" id="username" /> 年齡:<select name="age"> <option value=">16">小於16</option> <option value="16-30" selected>16-30</option> <option value="31-50">31-50</option> <option value="51-80">51-80</option> </select></td> <input type="submit" name="btn_submit" value="提交" /> </form>
|
實現的介面如圖5-5所示。
本章介紹什麼是萬用字元、如何使用萬用字元以及怎樣使用LIKE操作符進行通配搜尋,以便對資料進行複雜過濾。
8.1 LIKE操作符
前面介紹的所有操作符都是針對已知值進行過濾的。不管是匹配一個還是多個值,測試大於還是小於已知值,或者檢查某個範圍的值,共同點是過濾中使用的值都是已知的。但是,這種過濾方法並不是任何時候都好用。例如,怎樣搜尋產品名中包含文本anvil的所有產品?用簡單的比較操作符肯定不行,必須使用萬用字元。利用萬用字元可建立比較特定資料的搜尋模式。在這個例子中,如果你想找出名稱包含anvil的所有產品,可構造一個萬用字元搜尋模式,找出產品名中任何位置出現anvil的產品。
萬用字元(wildcard) 用來匹配值的一部分的特殊字元。
搜尋模式(search pattern) 由字面值、萬用字元或兩者組合構成的搜尋條件。
萬用字元本身實際是SQL的WHERE子句中有特殊含義的字元,SQL支援幾種萬用字元。
為在搜尋子句中使用萬用字元,必須使用LIKE操作符。LIKE指示MySQL,後跟的搜尋模式利用萬用字元匹配而不是直接相等匹配進行比較。
謂詞 操作符何時不是操作符?答案是在它作為謂詞(predi- cate)時。從技術上說,LIKE是謂詞而不是操作符。雖然最終的結果是相同的,但應該對此術語有所瞭解,以免在SQL文檔中遇到此術語時不知道。
8.1.1 百分比符號(%)萬用字元
最常使用的萬用字元是百分比符號(%)。在搜尋串中,%表示任何字元出現任意次數。例如,為了找出所有以詞jet起頭的產品,可使用以下SELECT語句:
此例子使用了搜尋模式'jet%'。在執行這條子句時,將檢索任意以jet起頭的詞。%告訴MySQL接受jet之後的任一字元,不管它有多少字元。
區分大小寫 根據MySQL的配置方式,搜尋可以是區分大小寫。如果區分大小寫,'jet%'與JetPack 1000將不匹配。
萬用字元可在搜尋模式中任意位置使用,並且可以使用多個萬用字元。下面的例子使用兩個萬用字元,它們位於模式的兩端:
搜尋模式'%anvil%'表示匹配任何位置包含文本anvil的值,而不論它之前或之後出現什麼字元。
萬用字元也可以出現在搜尋模式的中間,雖然這樣做不太有用。下面的例子找出以s起頭以e結尾的所有產品:
重要的是要注意到,除了一個或多個字元外,%還能匹配0個字元。%代表搜尋模式中給定位置的0個、1個或多個字元。
注意尾空格 尾空格可能會干擾萬用字元匹配。例如,在儲存詞anvil時,如果它後面有一個或多個空格,則子句WHERE prod_name LIKE '%anvil'將不會匹配它們,因為在最後的l後有多餘的字元。解決這個問題的一個簡單的辦法是在搜尋模式最後附加一個%。一個更好的辦法是使用函數(第11章將會介紹)去掉首尾空格。
注意NULL 雖然似乎%萬用字元可以匹配任何東西,但有一個例外,即NULL。即使是WHERE prod_name LIKE '%'也不能匹配用值NULL作為產品名的行。