0

我有一个简单的 PHP 脚本,它根据 URL GET 参数从 MySQL 数据库中提取一行,只是一个称为 ID 的 int。

如果 GET 参数是数据库的无效 ID,例如有人输入的 int 不是数据库中的行,或者他们尝试输入字符或其他内容,我想显示默认记录。

下面的代码确实有效,但我觉得它是糟糕的代码。我只是不确定为什么,或者我应该做什么。我知道我应该在运行数据库查询之前验证 ID 是一个 int,但这并不能解决当使用一个无效 ID 的整数时该怎么做。

因此,为了使这个问题成为一个正确的问题,我应该如何从返回 false 的 mysqli_stmt_fetch 中恢复?

放轻松,我知道我是个小块头:-)

$ID = (int)$_GET["id"];

$query = "SELECT `col1`, `col2`, `col3` FROM `table` WHERE `ID` = ?";

if ($stmt = mysqli_prepare($connection, $query))
{
    mysqli_stmt_bind_param($stmt, "i", $ID);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_bind_result($stmt, $var1, $var2, $var3);
    if (!mysqli_stmt_fetch($stmt))
    {   
        $ID = 1; //A record I know exists and will always exist
        mysqli_stmt_bind_param($stmt, "i", $ID);
        mysqli_stmt_execute($stmt);
        mysqli_stmt_bind_result($stmt, $var1, $var2, $var3);
        mysqli_stmt_fetch($stmt);
    }
    mysqli_stmt_close($stmt);
}

好的,通过一些反馈和实验,我在 PHP 中将 ID 转换为 int 并将 SQL 查询更改为:

SELECT `col1`, `col2`, `col3`
FROM `table`
WHERE `ID` = ?
UNION
SELECT `col1`, `col2`, `col3`
FROM `table`
WHERE `ID` = 1
LIMIT 1

这适用于我能想到的所有情况,并且似乎是安全的。任何问题?比我有的更好吗?

4

2 回答 2

0

首先检查传入的 $ID 是否为 char 等,并将其设置为永远不会作为表中 ID 的值,然后使用查询

SELECT col1, col2, col3 FROM table WHERE ID = :id
union all 
SELECT col1, col2, col3 FROM table WHERE ID = 1 /* may :defaut_id if */
where not exist (select 1 from table WHERE ID = :id)
于 2011-03-10T19:03:54.077 回答
0

假设默认记录有一个 id,那么它可以在单个查询中完成:

select ...
from ...
where (id = ?) or (id = $default_id)

并将默认 ID 硬编码到查询字符串中。

于 2011-03-10T19:06:59.253 回答