我有一個簡單的PHP腳本,根據URL GET參數從MySQL數據庫中拉出一行,只是一個叫做ID的int。如何在mysqli_stmt_fetch失敗時檢索默認行?
如果GET參數是數據庫的無效標識,例如某人輸入了一個不是數據庫中的行的int,或者他們嘗試輸入字符或其他東西,我想顯示一個默認值記錄。
下面的代碼實際上有效,但我覺得它是不好的代碼。我不知道爲什麼,或者我該怎麼做。我知道在運行數據庫查詢之前,我應該驗證ID是一個int,但是這並不能解決使用無效ID的整數時要執行的操作。
所以爲了使這是一個適當的問題,我應該如何從mysqli_stmt_fetch恢復返回false?
悠着點,我知道我是一個結點:-)
$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);
}
OK,所以有一些反饋和實驗,我投的ID在PHP一個int,改變了SQL查詢到這個:
SELECT `col1`, `col2`, `col3`
FROM `table`
WHERE `ID` = ?
UNION
SELECT `col1`, `col2`, `col3`
FROM `table`
WHERE `ID` = 1
LIMIT 1
這適用於所有我能想到並且似乎很安全的情況。任何問題?比我有什麼更好的?
我結束了對此的變化。將ID轉換爲PHP中的int意味着我總是以ID爲0(如果ID字符串開始非數字)或int開始字符串。 – Biggles 2011-03-27 20:11:27