我有一个简单的 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
这适用于我能想到的所有情况,并且似乎是安全的。任何问题?比我有的更好吗?