Как получить строку по умолчанию при сбое mysqli_stmt_fetch? - PullRequest
0 голосов
/ 10 марта 2011

У меня есть простой PHP-скрипт, который извлекает строку из базы данных MySQL на основе параметра GET URL, просто int, называемый, скажем, ID.

Если параметр 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);
}

ОК, поэтому с некоторыми отзывами и экспериментами я произнесID как int в PHP и изменил SQL-запрос на это:

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

Это работает для всех случаев, о которых я могу думать, и кажется безопасным.Любые проблемы?Лучше, чем у меня было?

Ответы [ 2 ]

0 голосов
/ 10 марта 2011

Если у записи по умолчанию есть идентификатор, то это можно сделать одним запросом:

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

и просто закодируйте идентификатор по умолчанию в строку запроса.

0 голосов
/ 10 марта 2011

Сначала проверьте входящий $ ID для char и т. Д. И установите для него значение, которое никогда не будет идентификатором в вашей таблице, затем используйте запрос

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)
...