Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проверка данных, приходящих от пользователя
 
 автор: abord   (24.08.2006 в 17:04)   письмо автору
 
 

Принимаем от пользователя некий id, хочу найти оптимальный и простой способ обработки.
?id = x

$id = 0+(int)$_GET["id"];
if($id > 0){ //иначе ошибка ввели строку или 0 или отрицательное число или ничего
}

Как я понимаю, от вредосных строк мы защищены
Но как защитится от слишком большого числа, или от числового выражения в адресной строке.
Нужно, сравнить число с тем которое может быть.
1 SELECT count(id) FROM table WHERE id = x
Выполнить, такой sql запрос с пришедшим возможно неверным id.
2 SELECT id FROM table WHERE 1
Собрать все id из таблицы и сверить с ними пришедший id. Но если данных очень много выполнять такой запрос не хотелось бы.
3 SELECT max(id) FROM table WHERE 1
Выбрать максимальные id и поставить условие.
Поставить условие типа if(id > 0 && id < $maxid)

Вроде бы третий способ подходит, но возможно я что то упускаю...

   
 
 автор: kasmanaft   (24.08.2006 в 17:35)   письмо автору
 
   для: abord   (24.08.2006 в 17:04)
 

а для чего вы хотите так делать? что будет, если id окажется большим?

   
 
 автор: abord   (24.08.2006 в 18:11)   письмо автору
 
   для: kasmanaft   (24.08.2006 в 17:35)
 

Если п-ль ввел огромный id будет неверный sql запрос
Допустим у меня поле Id типа INT
У него есть свой предел, если число превысит этот предел то вместо него будет занесено значение соответсвующее границе предела.
По мойму оно не надо:)

   
 
 автор: RV   (24.08.2006 в 18:20)   письмо автору
 
   для: abord   (24.08.2006 в 18:11)
 

в таком случае как вы защищаетесь от отсутствующих id в базе.
вот я введу id=4, а у вас такого нет. и что теперь? general protection fault как поговаривала винда.
во-вторых с чего вы взяли что при большом id будет неверным sql запрос?

   
 
 автор: abord   (24.08.2006 в 18:28)   письмо автору
 
   для: abord   (24.08.2006 в 18:11)
 

Решение такое:
Запрос
&goodid=65&count=432


function CheckGoodid(){
  $maxid = getoneresult("SELECT MAX(goodid) FROM goods WHERE 1");
    if($this -> goodid > 0 && $this -> goodid < $maxid){
     if(getoneresult("SELECT count(*) FROM goods WHERE goodid =".$this -> goodid)){
      return TRUE;
     }
  }
    return FALSE;
 }
 function CheckCount(){
  global $maxgoodcount;
    if($this -> count > 0 && $this -> count < $maxgoodcount){
        return TRUE;
  }
    return FALSE;
 }
//getoneresult возвращает одно выбранное значение


вот я введу id=4, а у вас такого нет. и что теперь? general protection fault как поговаривала винда.

Сначала смотрим, что 4 больше 0 и меньше моего максимального id в базе,
а затем SELECT count(*) FROM goods WHERE goodid =4

   
 
 автор: RV   (24.08.2006 в 18:30)   письмо автору
 
   для: abord   (24.08.2006 в 18:28)
 

>Если п-ль ввел огромный id будет неверный sql запрос

покажите пример такого запроса

   
 
 автор: abord   (24.08.2006 в 18:35)   письмо автору
 
   для: RV   (24.08.2006 в 18:30)
 

INSERT INTO `basket` ( `sid` , `dateadd` , `goodid` , `count` )
VALUES (
'0', '0', '100000000000000000000000000', '0'
);


В таблице получается 0 0 2147483647 0

   
 
 автор: RV   (24.08.2006 в 18:42)   письмо автору
 
   для: abord   (24.08.2006 в 18:35)
 

а где неправильный запрос? mysql_error() что то возвращает?
и что за такой id который пользователь сам должен делать?
получается что вы сами не знаете структуру вашей таблицы.
какая первоначальная задача? потому как решение очень странное

   
 
 автор: abord   (24.08.2006 в 18:49)   письмо автору
 
   для: RV   (24.08.2006 в 18:42)
 

Задача корзина, интернет магазина, в пользователь вводит count, количество товара в текстовое поле, конечно он туда не введет 10000000000000, если он нормально делает заказ, но теоритически ему никто не мешает этого сделать. Так же как и ввести например отрицательное число. А зачем мне в таблице заказов бессмысленные значения?
mysql_error() конечно ничего не возвращает, но тем не менее если бы был не INT а TINYINT урезались бы уже достаточно небольшие числа. Почему бы не проверять большие значения?

Насчет goodid тут как и в любом каталоге, можно сделать просто SELECT count(*) FROM goods WHERE goodid =".$this -> goodid и далее товар/рубрика найден/не найден.

Но помойму, условие не повредит
$maxid = getoneresult("SELECT MAX(goodid) FROM goods WHERE 1");
if($this -> goodid > 0 && $this -> goodid < $maxid){
}
Если $this -> goodid > $maxid в данном случае имело место редактирование адресной строки и не подставлять $this -> goodid в запрос, по мойму уже плюс к безопасности...

   
 
 автор: RV   (24.08.2006 в 18:59)   письмо автору
 
   для: abord   (24.08.2006 в 18:49)
 

проверить сколько есть на складе и дальше плясать уже от этого

   
 
 автор: abord   (24.08.2006 в 19:06)   письмо автору
 
   для: RV   (24.08.2006 в 18:59)
 

проверить сколько есть на складе и дальше плясать уже от этого

Не ну можно в goods заделать поле count и через админку бы заполнялось для каждого товара его количество. Это тоже стандартно и мое решение легко расширяемо и для такого случая, но если заказчику это не нужно. Те админу проще не заполнять это поле. Я просто выношу в настройки $maxcount = 10000 согласовав с заказчиком, если сделали заказ на какое нибудь реальное число товаров, то его можно рассматривать, а если ввели например 10000000 то такой заказ даже не пройдет.


Как вы считаете?

   
 
 автор: cheops   (25.08.2006 в 12:20)   письмо автору
 
   для: abord   (24.08.2006 в 17:04)
 

Если вас беспокоит слишком большое число, да можно воспользоваться третьим решением, но обычно это не делают, так как пользователь вряд ли в этом случае что-то реально покупать будет...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования