2011-03-10 22 views
0

我有一個簡單的PHP腳本,根據URL GET參數從MySQL數據庫中拉出一行,只是一個叫做ID的int。如何在mysqli_stmt_fetch失敗時檢索默認行?

如果GET參數是數據庫的無效標識,例如某人輸入了一個不是數據庫中的行的int,或者他們嘗試輸入字符或其他東西,我想顯示一個默認值記錄。

下面的代碼實際上有效,但我覺得它是不好的代碼。我不知道爲什麼,或者我該怎麼做。我知道在運行數據庫查詢之前,我應該驗證ID是一個i​​nt,但是這並不能解決使用無效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 

這適用於所有我能想到並且似乎很安全的情況。任何問題?比我有什麼更好的?

回答

0

首先檢查傳入的$ ID爲焦炭等,並將其設置爲值永遠不會像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) 
+0

我結束了對此的變化。將ID轉換爲PHP中的int意味着我總是以ID爲0(如果ID字符串開始非數字)或int開始字符串。 – Biggles 2011-03-27 20:11:27

0

假設默認記錄有一個ID,然後它可以做在一個查詢中:

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

並且只是將默認ID硬編碼到查詢字符串中。

+0

今天就去了。它在ID無效時顯示默認行,但當ID_is_有效時(默認情況下ID爲1)它也會顯示默認行。 – Biggles 2011-03-23 02:39:57

+0

我想一個XOR而不是一個或將會處理這個。 「一個或另一個但不是兩個」。 – 2011-03-23 14:18:21

+0

我也嘗試過XOR,但在MySQL 5.1上使用phpMyAdmin時,它在ID有效時返回了兩行。而且,由於默認情況下它是通過ID來命令的,所以我不能使用限制,因爲它會返回默認值。爲了解決這個問題,我需要對結果進行排序,但這樣我就不能隨意更改默認ID。嗯。 – Biggles 2011-03-27 19:59:20