if(isset($_GET['id']) and intval($_GET['id'])!=="")
{
$bar_sql = mysql_query("SELECT * FROM `bar` WHERE `id`='".$_GET['id']."'");
$bar = mysql_fetch_array($bar_sql);
}
else
{
echo "Ошибка";
}
Спустя 2 минуты, 2 секунды (13.07.2012 - 09:23) vagrand написал(а):
if(isset($_GET['id']))
{
$bar_sql = mysql_query("SELECT * FROM `bar` WHERE `id`='".intval($_GET['id'])."'");
$bar = mysql_fetch_array($bar_sql);
}
Спустя 1 минута, 58 секунд (13.07.2012 - 09:25) 12345 написал(а):
На а так как я, что, не правильно разве?
Спустя 1 час, 27 минут, 23 секунды (13.07.2012 - 10:53) Placido написал(а):
Цитата (12345 @ 13.07.2012 - 09:25) |
На а так как я, что, не правильно разве? |
Не правильно. Во-первых, если придет строка, то условие выполнится (так как intval() в возвращает целое число или 0, а это в любом случае !== ''), а во-вторых, в таком варианте, если в $_GET['id'] ничего не придет, то условие не выполнится (сработает isset()), и вылетит нотис "undefined index".
Спустя 7 минут, 22 секунды (13.07.2012 - 11:00) 12345 написал(а):
ну а вот так? :)
:D
if(isset($_GET['id']))
{
if(intval($_GET['id'])>="0")
{
$bar_sql = mysql_query("SELECT * FROM `bar` WHERE `id`='".$_GET['id']."'");
$bar = mysql_fetch_array($bar_sql);
}
}
else
{
echo "Ошибка";
}
:D
Спустя 17 минут, 12 секунд (13.07.2012 - 11:17) TMake написал(а):
Цитата (12345 @ 13.07.2012 - 12:00) |
ну а вот так? |
Зачем лепить огороды. При увеличении кода существует вероятность того, что ты можешь забыть указать условие intval. Применяй данную конструкцию непосредственно в запросе
Спустя 33 минуты, 23 секунды (13.07.2012 - 11:51) Guest написал(а):
Нужно не проверять на условие, а просто фильтровать приходящие данные.
Проверка условия это алгоритмы, фильтры это безопасность.
Проверка условия это алгоритмы, фильтры это безопасность.
Спустя 20 минут, 54 секунды (13.07.2012 - 12:12) AlmazDelDiablo написал(а):
Как-то так.
Если $_GET['id'] существует, приводим ее к числу, иначе создаем переменную с ошибкой. И далее проверяем, не является ли $id нулем и нет ли $error`ов.
Если $_GET['id'] существует, приводим ее к числу, иначе создаем переменную с ошибкой. И далее проверяем, не является ли $id нулем и нет ли $error`ов.
isset( $_GET['id'] ) ? $id = (int)$_GET['id'] : $error = 1;
if( !$error AND $id > 0 )
{
$bar_sql = mysql_query("SELECT * FROM `bar` WHERE `id`='{$id}'");
$bar = mysql_fetch_array($bar_sql);
}
else
{
echo "Ошибка";
}
Спустя 1 час, 13 минут, 14 секунд (13.07.2012 - 13:25) I++ написал(а):
<?
if(isset($_GET['id']))
{
// * - в SELECT плохой тон, выборку данных нужно делать, только по нужным данным.
$bar_sql = mysql_query('SELECT * FROM `bar` WHERE `id` = '.(int)$_GET['id']); // Кавычки кавычкам рознь, " и ' разные вещи.
// $bar_sql а может тут false? Ниже код будет кидать ошибку.
if($bar_sql !== false) // Это будет быстрее чем if($bar_sql)
$bar = mysql_fetch_array($bar_sql); // Заменить на mysql_ fetch_ assoc или mysql_fetch_ row ибо быстрее.
else
echo 'Нет результатов';
}
else
{
echo 'Ошибка'; // Кавычки кавычкам рознь
}
?>
intval проигрывает в производительности (int)
Спустя 1 час, 55 минут, 25 секунд (13.07.2012 - 15:20) kamanch написал(а):
I++
Цитата |
if(isset($_GET['id'])) |
Если в гет придет строка, то условие все равно сработает, и пойдет ненужная нам уже обработка данных.
if(isset($_GET['id']) and is_numeric($_GET['id']) and $_GET['id'] > 0){
.......................
} else {
echo "не число";
}
или
if(isset($_GET['id']) and intval($_GET['id']) >0)
Спустя 25 минут, 9 секунд (13.07.2012 - 15:45) Placido написал(а):
Цитата (h.n.81 @ 13.07.2012 - 15:20) |
if(isset($_GET['id']) and is_numeric($_GET['id']) and $_GET['id'] > 0)...или if(isset($_GET['id']) and intval($_GET['id']) >0) |
... и если в $_GET['id'] ничего не пришло, получаем нотис "undefined index".
Спустя 29 минут, 31 секунда (13.07.2012 - 16:15) kamanch написал(а):
Попробовал оба варианта при
Нотисов не пришло.
error_reporting(E_ALL);
Нотисов не пришло.
Спустя 2 часа, 28 минут, 25 секунд (13.07.2012 - 18:43) 12345 написал(а):
А не легче сделать так? :)
Если $_GET['id'] = 0, то скрипт не выполняется. Хороший фильтр :D
Так будет безопасно? <_<
if(filter_var($_GET['id'], FILTER_VALIDATE_INT)))
{
$bar_sql = mysql_query("SELECT * FROM `bar` WHERE `id`='".$_GET['id']."'");
$bar = mysql_fetch_array($bar_sql);
}
Если $_GET['id'] = 0, то скрипт не выполняется. Хороший фильтр :D
Так будет безопасно? <_<
Спустя 9 минут, 44 секунды (13.07.2012 - 18:53) Placido написал(а):
Цитата (h.n.81 @ 13.07.2012 - 16:15) |
Попробовал оба варианта при error_reporting(E_ALL); Нотисов не пришло. |
Да, действительно. После невыполнения первого условия все, что стоит после AND, проверяться не будет. Не знал.
Называется это Short-circuit evaluation. После некоторых поисков информации на эту тему, оказалось, что внятного описания данного "поведения" в официальной документации PHP нет. Об этом же говорят и на stackoverflow.
Спустя 4 часа, 19 минут, 18 секунд (13.07.2012 - 23:12) I++ написал(а):
Свернутый текст
Цитата (h.n.81 @ 13.07.2012 - 16:20) | ||
I++
Если в гет придет строка, то условие все равно сработает, и пойдет ненужная нам уже обработка данных. if(isset($_GET['id']) and is_numeric($_GET['id']) and $_GET['id'] > 0){ или if(isset($_GET['id']) and intval($_GET['id']) >0) |
И часто строки приходят из формы по гету если там предполагалось число? или по гет запросу тыча на ссылке?
Лишняя обработка, проверять строго входящие данные, в условии этого не стояло.
В данном примере если будет строка, то (int)$_GET['id'] вернет 0, что обычно является дефолтным значением.
Ну потычет какой нибудь чувак этот гет с id, да и успокоится.