[英]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.