找回密碼
 立即註冊
搜索
熱搜: 活動 交友 discuz
查看: 437|回復: 0

Where

[複製鏈接]

257

主題

38

回帖

1138

積分

管理員

積分
1138
發表於 2023-5-25 11:03:42 | 顯示全部樓層 |閱讀模式

條件

將數據從數據庫顯示給最終用戶時,您可能需要能夠過濾最終用戶看到的數據(例如,基於帳戶權限或其他一些訪問權限)。在SQL中,您可以使用WHERE條件執行此操作- 編輯器PHP庫還提供了一種Editor->where()方法來公開此功能並允許複雜的條件表達式。

值得注意的是,應用的條件Editor->where()僅用於數據提取在編寫數據(創建編輯動作)時,您應該使用Field->set()Field->setValue()方法。這些將在下面設置字段值部分中詳細討論

此外,在將數據寫入數據庫時,應注意所寫數據將由應用where條件選擇如果寫入的數據與應用的條件不匹配,則表中不會顯示該數據(如果用戶編輯了一行而導致可能導致可能混淆的行為,並且由於無法讀取而消失了!)。

用法簡單

在最簡單的形式中,該Editor->where()方法有三個參數:

  1. columnName - 要應用條件的列名稱
  2. value - 檢查條件的值 - 這會自動轉義
  3. operator-條件運算符(如=<>,等)。此參數是可選的 - 默認值為=

一個簡單的例子是:

1
$editor->where( 'user_id', 12 );

即只選擇表中的行user_id = 12

使用所有三個選項,我們可以使用以下選項來選擇age大於18的所有行

1
$editor->where( 'age', 18, '>' );

多種條件

只需Editor->where()多次調用(每個條件​​一次),就可以對錶應用多個條件。例如,讓我們結合上面的兩個例子:

1
2
3
$editor
    ->where( 'user_id', 12 )
    ->where( 'age', 18, '>' );

user_id = 12 AND age > 18選擇匹配的行請注意,在簡單用例中,多個Editor->where()語句將使用AND邏輯運算符。

空值

在使用數據庫執行條件操作時,搜索空值(或反向,搜索空)通常很有用。Editor庫將接受本機PHP null作為空值。例如,以下內容等同於SQL age IS NULL條件:

1
$editor->where( 'age', null );

所述IS NOT NULL表達可通過的第三個參數被使用Editor->where()方法-具體為!=

1
$editor->where( 'age', null, '!=' );

複雜的用法

簡單的用例可能很有用,但是Editor->where()當您使用匿名函數時,會發現方法的真正功能:

1
2
3
$editor->where( function $q ) {
    ...
} );

一個參數傳遞到匿名函數中,Query該實例Editor將用於數據庫查詢它將使。這意味著您可以訪問Query類的所有方法Query->where()Query->and_where()並且Query->or_where()有關類及其方法的完整詳細信息,請參閱PHP API文檔Query)。

age用匿名函數編寫上面例子給我們:

1
2
3
$editor->where( function $q ) {
    $q->where( 'age', 18, '>' );
} );

事情開始變得有趣的是方法的第四個參數Query->where()(注意它與Editor->where()不同) - 第四個參數是一個可選的布爾參數,它將指示查詢是否應該綁定(即轉義)值。默認情況下,它將是,但禁用綁定意味著我們可以傳入SQL語句,數組和其他復雜表達式。

例如,考慮以下選擇過去14天內的所有記錄(這是MySQL特定的SQL,但顯示的PHP可用於所有數據庫類型):

1
2
3
$editor->where( function $q ) {
    $q->where( 'date''DATE_ADD( NOW(), INTERVAL -14 DAY )''>=', false );
} );

沒有第四個參數,DATE_ADD(...)它將作為一個字符串進行轉義,但是false傳入它不會,因此可以進行評估(即WHERE date >= DATE_ADD( NOW(), INTERVAL -14 DAY ))。

外部變量

您可能經常希望使用在匿名函數範圍之外定義的變量作為條件的一部分 - 例如考慮:

1
2
3
4
$userId = 12;
 
$editor->where( function $q ) {
    $q->where( 'id'$userId ); // will throw an error!!
} );

由於PHP範圍變量的方式,$userId除非我們使用該use()指令,否則參數在匿名函數內是不可訪問的

1
2
3
$editor->where( function $q use $userId ) {
    $q->where( 'id'$userId );
} );

這在PHP匿名函數文檔中有詳細解釋

分組條件

與簡單的用例一樣,只需多次調用條件方法,就可以將多個條件應用於復雜查詢。條件的組合是從左到右,並且基於所謂的方法(即or_where()and_where())。

有點盜夢空間像這些方法都可以接受這將組條件閉合方法本身。考慮以下:

1
2
3
4
6
7
8
$editor->where( function $q ) {
    $q
        ->where( 'age''18''>' )
        ->or_where( function $r ) {
            $r->where( 'name''Allan' );
            $r->where( 'location''Edinburgh' );
        } );
} );

以上將產生以下SQL:

1
2
3
WHERE age > 18 OR (
    name 'Allan' AND location = 'Edinburgh'
)

簡單OR條件

在使用編輯器時使用OR條件執行查詢,需要進行分組,如下所示。這是必需的,因為編輯器會在需要時將其自己的條件附加到查詢中。例如,在讀取最近編輯的數據時,將添加主鍵值作為條件以確保僅讀取該記錄。對條件進行分組可確保編輯器添加的條件與您自己的條件之間不會出現錯誤的交互。

1
2
3
4
6
7
8
$editor->where( function $q ) {
    $q->where( function $r ) {
        $r->where( 'name''Allan' );
        $r->or_where( 'location''Edinburgh' );
    } );
} );
 
// Resulting SQL: WHERE (name = 'Allan' OR location = 'Edinburgh')

子選擇

SQL WHERE語句不僅限於簡單值和函數調用 - 您還可以使用子選項,其中檢查的值本身是另一個查詢的結果。使用可選的綁定參數,Query->where()我們可以在編輯器查詢中使用子選擇。

以下示例將選擇所有行,這些行的accessLevel值在access的查詢結果數組中

1
2
3
$editor->where( function $q ) {
    $q->where( 'accessLevel''(SELECT id FROM access WHERE level LIKE "%admin%")''IN', false );
} )

這些表達式可以隨意變得複雜!

綁定提交的數據

到目前為止,我們已經處理了非用戶提交的數據,但是如果您已經閱讀了有關SQL安全性的任何信息,那麼在處理用戶數據時您將了解SQL注入攻擊危險必須正確轉義此數據!如果使用複雜表達式,其中Query條件方法的綁定參數設置為false,則必須使用該Query->bind()方法執行此操作。

請考慮以下示例,其中屬性city作為HTTP POST請求的一部分提交:

1
2
3
4
$editor->where( function $q ) {
    $q->where( 'location''(SELECT id FROM cities WHERE name LIKE :city)''IN', false );
    $q->bind( ':city''%'.$_POST['city'].'%' );
} );

如果您已經使用PHP的PDO完成了任何工作,那麼您將立即熟悉它。

設置字段值

如上所述,類的條件運算符Editor適用於只讀數據 - 而不適用於寫入數據庫的數據。在寫入數據庫時,您可能希望編輯器編寫不在用戶提交表單中的特定值。例如,updated_date列或可能屬於查詢條件的任何其他內容。

這可以使用Field->set()Field->setValue()方法完成:

  • Field->set() 用於指定何時應該寫入字段 - 它可以是以下之一:
    • true - 與Field::SET_BOTH(默認)相同
    • false - 與...一樣 Field::SET_NONE
    • Field::SET_BOTH - 在create和edit命令上設置數據庫值
    • Field::SET_NONE - 從不設置數據庫值
    • Field::SET_CREATE - 僅在create上設置數據庫值
    • Field::SET_EDIT - 僅在編輯時設置數據庫值
  • Field->setValue() 是寫入數據庫時要使用的值。

請考慮以下兩個字段:創建日期字段和更新字段:

1
2
3
4
6
7
8
9
10
11
$editor->field(
    new Field( 'created' )
        ->set( Field::SET_CREATE )
        ->setValue( date("Y-m-d H:i:s") )
);
 
$editor->field(
    new Field( 'updated' )
        ->set( Field::SET_EDIT )
        ->setValue( date("Y-m-d H:i:s") )
);

此方法還可用於將可能存儲在會話中的信息(例如編輯器的id)寫入數據庫:

1
2
3
4
$editor->field(
    new Field( 'last_author' )
        ->setValue( $_SESSION['user_id'] )
);


您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

Archiver|手機版|小黑屋|DoIT 科技論壇

GMT+8, 2025-6-15 21:28 , Processed in 0.031747 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回復 返回頂部 返回列表