Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Нужен совет по созданию класса для работы с базой

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Нужен совет по созданию класса для работы с базой
cyberx
Отправлено: 08 Мая, 2010 - 15:44:25
Post Id


Новичок


Покинул форум
Сообщений всего: 30
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




Решил создать класс для работы с базой, но не знаю стоит или нет его делать, или все таки лучше использовать обычный метод. Вот простенький класс

PHP:
скопировать код в буфер обмена
  1.  
  2. class DB
  3. {
  4. function connect()
  5. {
  6. $db = new mysqli("localhost", "user", "pass", "bd");
  7. $db->query("SET CHARSET SET utf8");
  8. $db->query("SET NAMES 'utf8'");
  9. $this->query = $db;
  10. return $db;
  11. }
  12.  
  13.  
  14.  
  15. function select($select)
  16. {
  17. if ($result = $this->query->query($select))
  18. {
  19.  if($result->num_rows > 0)
  20.  {
  21.   $row = $result->fetch_assoc();
  22.   return $row;
  23.  }
  24.  else
  25.  {
  26.   return FALSE;
  27.  }
  28. }
  29. else
  30.  {
  31.   return FALSE;
  32.  }
  33. $result->close();
  34. }
  35.  
  36.  
  37.  
  38. }
  39.  
  40. $DB = new DB();
  41. $DB->connect();
  42.  
  43.  
  44. $select = $DB->select("SELECT `name` FROM `users` WHERE `id`='1'");
  45. echo  $select['name'];
  46.  


Все работает, но опасаюсь что в функция select могу передать все что угодно, даже если фильтровать могут передать не то что мне нужно. Если сделать так то тут явно указываю что вывести

PHP:
скопировать код в буфер обмена
  1.  
  2. $db = new mysqli("localhost", "user", "pass", "bd");
  3. $db->query("SET CHARSET SET utf8");
  4. $db->query("SET NAMES 'utf8'");
  5.  
  6.  
  7.  
  8. if ($result = $db->query("SELECT `name` FROM `users` WHERE `id`='1'"))
  9. {
  10.  if($result->num_rows > 0)
  11.  {
  12.   $row = $result->fetch_assoc();
  13.   echo $row['name'];
  14.  }
  15.  else
  16.  {
  17.   die;
  18.  }
  19. }
  20. else
  21.  {
  22.   die;
  23.  }
  24. $result->close();
  25.  


Какой метод безопасней и все таки лучше использовать?
 
 Top
valenok Модератор
Отправлено: 08 Мая, 2010 - 15:55:31
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




Фильтровать нужно всегда.
Варианта у тебя 2.

Либо до передачи запроса оболочке(твоему классу)
Либо уже в самой оболочке.
Оба варианта имеют право жить.

Первый вариант с фильтрацией до оболочки выглядит так:
$DB->query("SELECT `a` FROM `b` WHERE `c`=".intval('d'));

Второй может выглядеть так:
$DB->select("SELECT `a` FROM `b` WHERE `c`=? AND `d`=?, Array
(
"1' OR 1=1 ; --",
"paramD"
));

И твоя оболочка сама экранирует параметры перед вставкой.

Второй метод хорош тем, что программисту не придется вспоминать об экранировании.
Первый выглядит лучше =)


-----
Truly yours, Sasha.
 
My status
 Top
cyberx
Отправлено: 08 Мая, 2010 - 16:25:17
Post Id


Новичок


Покинул форум
Сообщений всего: 30
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




Меня больше настораживает

$DB->select("SELECT `name` FROM `users` WHERE `id`='1'");

В эту функцию могут же записать

$DB->select("SELECT `passwd` FROM `users` WHERE `id`='1'");

Функция select выводы то что ей передают и могут передать

"SELECT `passwd` FROM `users` WHERE `id`='1'"

Фильтровать и тут тоже можно
if (!intval($id))
{
die;
}
$DB->select("SELECT `name` FROM `users` WHERE `id`='".$id."'");
 
 Top
JustUserR
Отправлено: 09 Мая, 2010 - 15:08:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




valenok пишет:
Второй метод хорош тем, что программисту не придется вспоминать об экранировании.
В принципе это достаточно полезный метод который по сути является препарирование запроса Однако я бы предпочел экранировать вручную поскольку в большом PHP-скрипте со множественной обработкой данных бывает трудно за всем следить - а также препарирование усложняет динамическую генерацию SQL-запросов
cyberx пишет:
Фильтровать и тут тоже можно
А не проще использовать функцию mysql_real_escape_string которая вдобавок ко всему экранирует символы с учетом кодировки соединени с БД и текущей локалью


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
cyberx
Отправлено: 09 Мая, 2010 - 19:43:13
Post Id


Новичок


Покинул форум
Сообщений всего: 30
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




Вот пока решил сделать таким методом, не смог это вставить в один класс. Защищает от частых запросов и кэширует

PHP:
скопировать код в буфер обмена
  1.  
  2. if ($stmt = $DB->prepare("SELECT `id` FROM `users` WHERE `login` = ? AND `password` = ? AND `activation` = ?"))
  3. {
  4.  $login = mysqli_real_escape_string($DB,$login);
  5.  $passwd = mysqli_real_escape_string($DB,$passwd);
  6.  $act = 1;
  7.  $stmt->bind_param("ssi",$login,$passwd,$act);
  8.  $stmt->execute();
  9.  $stmt->bind_result($id);
  10.  $stmt->store_result();
  11.  if ($stmt->num_rows > 0)
  12.   {
  13.    echo $id;
  14.   }
  15.  else
  16.   {
  17.    die;
  18.   }
  19.  
  20. $stmt->close();
  21.    
  22. }
  23. else
  24. {
  25.  die;
  26. }
  27.  
  28. $DB->close();
  29.  
 
 Top
valenok Модератор
Отправлено: 09 Мая, 2010 - 21:18:57
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




JustUser, если ты клонишь в сторону prepared statements, то там речь скорее о производительности, нежели о внимательности программиста.


-----
Truly yours, Sasha.
 
My status
 Top
JustUserR
Отправлено: 10 Мая, 2010 - 01:50:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




valenok пишет:
JustUser, если ты клонишь в сторону prepared statements, то там речь скорее о производительности, нежели о внимательности программиста.
Вообще да - но я предпочитают экранирование а не препарирование


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB