Проверка значения $_GET['id']

Slaughter

Новичок
Проверка значения $_GET['id']

есть таблица из сайтов
есть id каждого сайта

пишу: http://server/links.php?id=5
вот хочу проверить id (id=цифра? если да, то все супер, если нет, то работает функция err())

Вот скрипт:

PHP:
//функция ошибки
function err()
{
  $page="error.php";
  header("Location: $page");
}

//функция вывода ссылки (сайта)
function show_link()
{
  //обращение к базе
}

//сам скрипт
if ($_SERVER['REQUEST_METHOD']=='GET')
{
  $table="links";

  //смотрим max значение id
  $querya = "SELECT `id` FROM `$table`";
  $res=mysql_query($querya,$link);
  $k=0;
  while ($line = mysql_fetch_array($res))
  {
    $id[$k]=$line[0];
  }
  $idmax = $id[$k];
  
  $id=$_GET['id'];

  //дальше идет проверка, которая почему-то работает через раз)))
  if (empty($_GET['id']))
  {
    err();
  }
  elseif ($_GET['id'])
  {
    if (!preg_match("/^[0-9]+$/", $_GET['id'])) err();
  }
  else
  {
    err();
  }
	
  if (($id>=1)&&($id<=$idmax))
  {
    show_link();
  }
  else
  {
    err();
  }
}
else
{
  err();
}
но по загадочным обстоятельствам половина ссылок работает как надо (т.е. выводит err();), а другая половина не работает (я так понимаю, скрипт продолжает открывать сайт)
Ну, например, если я введу:
http://server/links.php?id=5dsffsdf
то в первом случае сработает err()
а во втором продолжит работать скрипт и вытащит из базы сайт с id=5

еще хочу заметить, что не работют только определенные id
что делать? или как лучше это сделать?

Спасибо.
 

yaniks

новичок
зачем так много проверок?
и листание всех записей mysql
делаешь сразу select .... where id= $_GET['id']

если запись есть то ok иначе err
 

Johannes

Guest
is_int() проверка на значение integer
intval() - приведение значения к integer

А вообще то рекомендую в ман почаще глядеть...
 

Slaughter

Новичок
Вот, я не много изменил код... но все равно не работает...((
PHP:
if ($_SERVER['REQUEST_METHOD']=='GET')
{
  $id=$_GET['id'];
  if (is_int($id))
  {
     if (empty($_GET['id']))  err();
     if ($_GET['id'])
     {
        if (!preg_match("/^[0-9]+$/", $_GET['id'])) err();
     }
     else
    {err();}
   }
   else
   {err();}
	
  $table="links";
  $query=mysql_query("SELECT `id` FROM `$table` where `id` = '$id'",$link);
  if ($query)
  {
     show_link();
  }
  else
    {err();}
  mysql_close($link);
}
else
{err();}
 

Slaughter

Новичок
а если вместо строчки $id=$_GET['id'];
ставлю $id=$_GET['id']*1;, все равно не работает...
 

Slaughter

Новичок
Это простое приведение к числовому типу.
да это-то понятно...


Такая же ерунда...((
PHP:
if ($_SERVER['REQUEST_METHOD']=='GET')
{
  $id=$_GET['id']*1;
  if(isset($_GET['id']))
  { 
    if(is_int($id))
    { 
      $table="links";
      $query=mysql_query("SELECT `id` FROM `$table` where `id` = '$id'",$link);
      if ($query)
      {
         show_link();
      }
      else
      {err();}
      mysql_close($link);
    } 
    else
    {err();}
  }
  else
  {err();} 
}
else
{err();}
 

Kirs

Fireman
Если тебе нужна простая проверка на наличие числа:

PHP:
(empty($_GET["id"]) || !ereg("^[0-9]+$", $_GET["id"]) || $_GET["id"] == 0) ? err() : $id = $_GET["id"];
 
Сверху