簡體   English   中英

MySQLi 可選 WHERE 子句取決於 if 條件

[英]MySQLi optional WHERE clause depending on if condition

在嘗試優化一些代碼時,我遇到了另一個問題。使用用戶組和權限,當用戶權限有限時,我有時需要添加WHERE子句。我可以將整個查詢放在if {...}中,但是這意味着除了一行之外重復相同的代碼。所以我更改了代碼,僅根據 if 條件構建語句,而不是重復整個部分(語句、准備、執行、獲取..):

if (in_array('Edit own', $_SESSION['user_r']))
{
    $sql = 'SELECT
                `news_id`
            FROM
                `news`
            WHERE
                `news_user_id` = "' .$_SESSION['user_id']. '"';
}
else if (in_array('Edit all', $_SESSION['user_r']))
{
    $sql = 'SELECT
                `news_id`
            FROM
                `news`';
}

我知道也可以使用語句中的 if 條件來“拆分”語句,如下所示:

$sql = 'SELECT
            `news_id`
        FROM
            `news`';

if (in_array('Edit own', $_SESSION['user_r']))
{
     $sql .= ' WHERE
                 `news_user_id` = "' .$_SESSION['user_id']. '"';
}

乍一看,2. 示例可能“更好”,因為沒有重復並且代碼很短,但是當涉及到准備好的語句和 bind_param() 時,第一個示例可能會更好,因為我可以添加

$stmt = $db->prepare($sql);
$stmt->bind_param('ss', $what, $ever);

直接在if {...}內的語句之后......不知何故它對我來說似乎更安全......

那么我應該更喜歡哪種解決方案?

由於沒有其他答案,我想分享我的“解決方案”:

if (in_array('Edit own', $_SESSION['user_r']))
{
    $sql = 'SELECT
                `news_id`
            FROM
                `news`
            WHERE
                `news_user_id` = ?';

    $stmt = $db->prepare($sql);
    $stmt->bind_param('i', $_SESSION['user_id']);

}
else if (in_array('Edit all', $_SESSION['user_r']))
{
    $sql = 'SELECT
                `news_id`
            FROM
                `news`';

    $stmt = $db->prepare($sql);
}

$stmt->execute();
$stmt->bind_result($news_id);
...

正如我的問題中已經提到的,我現在使用 if 語句來構建整個語句。 這樣,我可以在 if 語句中使用 bind_param(如果需要),但不需要重復執行/獲取部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM