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
Форумы портала PHP.SU :: Версия для печати :: Нужен совет по созданию класса для работы с базой
Форумы портала PHP.SU » PHP » Программирование на PHP » Нужен совет по созданию класса для работы с базой

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

1. cyberx - 08 Мая, 2010 - 15:44:25 - перейти к сообщению
Решил создать класс для работы с базой, но не знаю стоит или нет его делать, или все таки лучше использовать обычный метод. Вот простенький класс

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.  


Какой метод безопасней и все таки лучше использовать?
2. valenok - 08 Мая, 2010 - 15:55:31 - перейти к сообщению
Фильтровать нужно всегда.
Варианта у тебя 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"
));

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

Второй метод хорош тем, что программисту не придется вспоминать об экранировании.
Первый выглядит лучше =)
3. cyberx - 08 Мая, 2010 - 16:25:17 - перейти к сообщению
Меня больше настораживает

$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."'");
4. JustUserR - 09 Мая, 2010 - 15:08:03 - перейти к сообщению
valenok пишет:
Второй метод хорош тем, что программисту не придется вспоминать об экранировании.
В принципе это достаточно полезный метод который по сути является препарирование запроса Однако я бы предпочел экранировать вручную поскольку в большом PHP-скрипте со множественной обработкой данных бывает трудно за всем следить - а также препарирование усложняет динамическую генерацию SQL-запросов
cyberx пишет:
Фильтровать и тут тоже можно
А не проще использовать функцию mysql_real_escape_string которая вдобавок ко всему экранирует символы с учетом кодировки соединени с БД и текущей локалью
5. cyberx - 09 Мая, 2010 - 19:43:13 - перейти к сообщению
Вот пока решил сделать таким методом, не смог это вставить в один класс. Защищает от частых запросов и кэширует

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.  
6. valenok - 09 Мая, 2010 - 21:18:57 - перейти к сообщению
JustUser, если ты клонишь в сторону prepared statements, то там речь скорее о производительности, нежели о внимательности программиста.
7. JustUserR - 10 Мая, 2010 - 01:50:02 - перейти к сообщению
valenok пишет:
JustUser, если ты клонишь в сторону prepared statements, то там речь скорее о производительности, нежели о внимательности программиста.
Вообще да - но я предпочитают экранирование а не препарирование

 

Powered by ExBB FM 1.0 RC1