Дело такое: вот думаю как рациональнее сделать проверку и делать ли её вообще. Может кто сталкивался с подобной ситуацией, посоветуйте пожалуста. Запросы передаются скрипту методом GET, скрипт уже делает выборку из базы по переданным параметрам. Вот думаю, как сделать так, чтобы перед запросом на вывод результата, делать проверку на наличие переданного параметра в таблице БД, если не существует то 404. Все передаваемые параметры цифровые, перед запросом к базе как лучше обрабатывать, чтобы обезопасить от SQL-иньекций?
Два варианта. Либо проверять, что это число и вываливаться в противном случае. Либо приводить к числовому типу принудительно.
на данный момент вся моя проверка сводится к: Код (Text): $id = htmlentities($_GET[id]); if (!preg_match("|^[\d]+$|", $id)) { header ("location: index.php"); } может еще добавить что то, или изменить. Но как вот мне проверять, присутствует ли значение в базе.. подключаться и перебирать все значения чтоли.
Сказали же, is_numeric: Код (Text): if (is_numeric($_GET['id'])) echo 'Йа число!'; Сказали же, приводить к числовому типу: Код (Text): $id = (int)$_GET['id']; Да, перебирать. Уникальные поля перебираются быстро. Индексированные медленнее, но тоже быстро. Код (Text): $sql = 'select 1 from таблица where id = "'.$id.'" limit 1'; limit 1, ибо хз чё у тебя там с полями.
Это работает конечно, но с точки зрения педанта это не правильно (это накладывает ограничения к числам а так-же нарушило бы типизацию если бы она в РНР была)
А если бы у бабушки был хрен, то она была бы дедушкой. В PHP нет типизации (что шикарно). Про ограничение я не понял, а то как бы ответил!
сделал так: Код (Text): if (isset($_GET[id])){ $id = $_GET[id]; if (empty($id)){ header ("location: index.php"); } if (!ctype_digit($id)) { echo $error; exit; } else { $row = mysql_query ("SELECT id FROM table WHERE id=$id LIMIT 1", $db); $arrow = mysql_fetch_array($row); if ($arrow == false){ echo $error; exit; } } } Вроде работает, может есть какие то серьезные ошибки.. выслушаю и приму к сведению.
1 - signed int может быть только от -2147483647 до 2147483648 2 - "123ksdi8398hv" == "123" http://php.ru/forum/viewtopic.php?p=86887#86887 http://dkflbk.nm.ru/php_basic_err_1.html
Vladson, 1) Ыгыгы. Да, определённо для id int auto_increment и домашней странички этого мало. 2) Сними очки и брось гитару, у меня же написано в посте и про is_numeric().
1 - Числовые значения используются не только для "id int auto_increment" 2 - Вторая причина (123ksdi8398hv) так-же важна Одень очки и возьми гитару, у меня про него написано раньше чем у тебя Для опытных программистов шикарно, а новичков это только приучивает к раздолбайству
Да нет, не наоборот, именно по началу привыкаешь к таким приёмам как приведение к числовому типу, а потом (когда начинаешь работать не с простой выборкой по ID, а со всякими другими числами) отвыкнуть очень сложно, долгое время уходит на то чтоб понять почему нифига не пашет...
1) А тут - да и это очевидно, когда ты без очков и без гитары. 2) Ну, да. Важна для количества псевдо-аргументов. А я!.. А я!... А я написал про is_numeric() ещё в 1996!!111111