0

一部のコードを最適化しようとしているときに、別の質問に出くわしました..ユーザーグループとアクセス許可を使用するとWHERE、ユーザーのアクセス許可が制限されている場合に句を追加する必要がある場合があります.クエリ全体を 内に配置できますがif {...}、それは同じことを繰り返すことを意味します1行を除いてコード..そこで、部分全体(ステートメント、準備、実行、フェッチ..)を繰り返すのではなく、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 に答える