在尝试优化某些代码时,我遇到了另一个问题。使用用户组和权限时,我有时需要在用户权限有限时添加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);
内的声明之后......对我来说似乎更安全......
我应该选择哪种解决方案?
答案 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(如果需要),但不需要重复执行/获取部分。