MySQLi可选的WHERE子句取决于条件

时间:2012-08-29 23:51:34

标签: mysql sql mysqli where

在尝试优化某些代码时,我遇到了另一个问题。使用用户组和权限时,我有时需要在用户权限有限时添加WHERE子句。我可以将整个查询放在{ {1}},但这意味着重复相同的代码,除了一行..所以我改变了代码,只根据if条件构建语句,而不是重复整个部分(语句,准备,执行,获取) ..):

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`';
}

乍一看,2.示例可能“更好”,因为没有重复且代码很短,但是当涉及到预处理语句和bind_param()时,第一个示例可能会更好,因为我可以添加< / p>

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

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

直接在$stmt = $db->prepare($sql); $stmt->bind_param('ss', $what, $ever); 内的声明之后......对我来说似乎更安全......

我应该选择哪种解决方案?

1 个答案:

答案 0 :(得分:0)

由于没有其他答案,我想分享我的“解决方案”:

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(如果需要),但不需要重复执行/获取部分。