0

在尝试优化一些代码时,我遇到了另一个问题。使用用户组和权限,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 {...}...里面的声明之后,不知何故,它对我来说似乎更安全...

那么我应该更喜欢哪种解决方案?

4

1 回答 1

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

于 2012-08-31T01:23:57.667 回答