2011-03-10 6 views
0

URL GET 매개 변수에 기반한 MySQL 데이터베이스에서 행을 가져 오는 간단한 PHP 스크립트가 있는데, ID라고하는 int입니다.mysqli_stmt_fetch가 실패했을 때 기본 행을 검색하는 방법은 무엇입니까?

DB에 행이 아닌 int를 입력하거나 GET 매개 변수가 데이터베이스에 대해 유효하지 않은 ID가되거나 문자 또는 무언가를 입력하려고하면 기본값을 표시하고 싶습니다. 기록.

다음 코드는 실제로 작동하지만 잘못된 코드라고 생각합니다. 왜, 또는 내가 뭘해야하는지 잘 모르겠습니다. 데이터베이스 쿼리를 실행하기 전에 ID가 int인지 확인해야하지만 유효하지 않은 ID가 사용되면 해결할 수 없습니다.

이렇게 적절한 질문을하기 위해, mysqli_stmt_fetch가 false를 반환하면 어떻게 복구해야합니까?

쉽게 이동 내가 PHP의 int로 ID 캐스팅이에 SQL 쿼리를 변경 한 일부 의견과 실험에, 그래서 나는, 나는 덩어리 :-)

$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); 
} 

확인 해요 알고 :

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

이 방법은 내가 생각할 수있는 모든 경우에 적용되며 안전합니다. 어떤 문제? 내가 가진 것보다 낫지?

답변

0

먼저 체크 들어오는 $의 ID 문자에 대한 그래서 당신의 테이블에 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

나는 이것의 변형을 위해 끝났다. PHP에서 ID를 int로 캐스팅한다는 것은 ID 문자열이 ID가 아닌 문자열로 시작되는 경우 항상 ID가 0으로 끝나거나 문자열을 시작한 int로 끝나는 것을 의미합니다. – Biggles

0

를 사용, 그것은 할 수있다 단일 쿼리에서

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

그리고 쿼리 문자열에 기본 ID를 하드 코딩하면됩니다.

+0

오늘 이걸로 가야 겠어. ID가 유효하지 않을 때 기본 행을 표시하지만 ID가 유효 할 때 기본 행을 표시합니다 (기본값은이 경우 ID가 1입니다). – Biggles

+0

나는 대신 xor를 사용하거나 그걸 처리 할 것입니다. "하나 또는 다른 하나는 아니지만 둘 다". –

+0

XOR을 시도했지만 MySQL 5.1에서 phpMyAdmin과 함께 사용하면 ID가 유효 할 때 두 행을 모두 반환했습니다. 그리고 기본적으로 ID로 주문하므로 기본값을 반환하므로 제한을 사용할 수 없습니다. 이 문제를 해결하려면 작동 결과가 필요하지만 기본 ID를 임의로 변경할 수는 없습니다. 흠. – Biggles

관련 문제