Здравствуйте уважаемые PHP профессионалы. Недавно стал вникать в ООП,(коечто понял, но не всё) даже написал свой первый серьёзный класс для БД. Кому интересно вот: http://narod.ru/disk/7977510000/alexander_class.zip.html. У меня вопрос, если нужно защитить базу от инъекций, то метод защиты нужно вставлять в класс который отвечает за соединение с базой или все-так нужно писать отдельный класс.
Не нужно этого делать. Сохраняя на архив на файловом сервере Вы только тратите свое и наше время. Никто не будет вводить каптчи и смотреть порнуху, чтобы скачать архив, а потом распаковать его и посмотреть код. Используйте http://codepaste.ru/ Я думаю, что первое. И можно использовать подготовленные выражения, забыв о слешировании.
Kreker - Спасибо за сайт! И возник вопрос. Подготовленные выражения - это стандартные выражения с вставленными переменными или что-то другое.
http://phpclub.ru/detail/article/mysqli Деструктор для класса базы в данном случае не нужен, потому что по выполнению скрипта соединение закрывается автоматически. SQL_Array() - я бы посоветовал, чтобы этот метод выводил массив не текущего разбираемого Mysql-результата, а массив с данными полной выборки (Т.е. в цикле fetch).
давай я помогу 1. Выбор конкретной базы данных mysql_select_db лучше вынести в отдельный метод и вызывает его из конструктора. Это даст возможность в случае необходимости выбрать другую db. 2. Использование die в классе с точки зрения ООП слишком грубо (даже как-то жестоко). Нужно просто возвращать ошибку в каком-либо виде. А обработка этой ошибки уже будет зависит от приложения, в котором этот класс будет использоваться.
Помещайте в отдельную переменную error и добавьте функцию getError(). Можете возвращать константу self::CONNECTION_ERROR_MESSAGE. Или использовать конструкцию trigger_error. Можете генерировать исключение. Но не умирать же сразу
alexander.pro PHP: <?php if ($this->define == FALSE){ $this->connected = mysql_connect($myhost, $myname, $mypass); mysql_select_db($mydata, $this->connected) or die('Error_Select_Data_Base'); $this->define = TRUE; ?> есть более подходящий вариант использования такого флага. в конструкторе $this->define = false, а в методе, выполняющем запрос PHP: <?php if(!$this->define){ $this->connect(); $this->define = true; } $this->query = mysql_query($sql); ?> то зависит от реализации и степени абстракции. В твоём случае достаточно метода escape() PHP: <?php public function escape($param) { if (is_array($param)) { foreach ($param as $k => $v) { $param[$k] = $this->escape($v); } } else { $param = mysql_real_escape_string($param); } return $param; } ?> если применять отложенное подключение, о чём первоначально писал, то коннект надо проверять ещё и в escape()
Будет интересно посмотреть на класс, написанный почти коллективно. Самому трудно учесть все тонкости.
На данный момент пытаюсь вникнуть в 'подготовленные заявления'... По статьям вроде как все понятно, осталось найти пример без использования MySQLi, а то получается что методы SQL_Connect() и SQL_SelectDB я писал зря. Что не радует!
да вообще зря для mysql писал. Mysqli (improved) — улучшеная версия библиотеки mysql. Все изменения и улучшения происходят имено в mysqli
- тоже интересно. С учетом всего написал: PHP: <?php class MySQL{ private $connected; private $result; private $query; private $define = FALSE; public function __construct($myhost, $myname, $mypass, $mydata){ if (!$this->define){ $this->SQL_Connect($myhost, $myname, $mypass); $this->SQL_SelectDB($mydata); $this->define = TRUE; }else{ die('Close_join'); } } public function __destruct(){ $this->SQL_Close(); } private function SQL_Connect($myhost, $myname, $mypass){ $this->connected = mysql_connect($myhost, $myname, $mypass) or die ('Ошибка!!!'); } private function SQL_SelectDB($mydata){ mysql_select_db($mydata, $this->connected) or die ('Ошибка БД'); } public function SQL_ResultSet($SQLent){ $SQLent = mysql_real_escape_string($SQLent); $this->query = mysql_query($SQLent, $this->connected); } public function SQL_ConnectGet(){ return $this->connected; } public function SQL_Array(){ return mysql_fetch_array($this->query); } private function SQL_Close(){ $this->define = FALSE; if (isset($this->connected)){ mysql_close($this->connected); unset($this->connected); } } } ?>
мдя, и что ты этим хотел сказать? и ещё, долго вчитываться не хотелось PHP: <?php if (!$this->define){ $this->SQL_Connect($myhost, $myname, $mypass); $this->SQL_SelectDB($mydata); $this->define = TRUE; }else{ die('Close_join'); } ?> зачем здесь эти танцы с дефайном? учитывая, что конструктор отработает 1 раз при создании объекта.
Luge Про дефайн я прочитал в народных советах... Чтоб два раза к SQL нельзя было подключиться. Да и вы сами советовали мне так сделать.
Я советовал сделать отложенное подключение, вынести вызов $this->SQL_Connect из конструктора. Чтоб соединялись с базой действительно когда надо сделать запрос, а не при каждой инициализации класса. К тому же, в вашем варианте соединение произойдёт 1 раз после вызова $obj = new MySQL($myhost, $myname, $mypass, $mydata); Думаю,ещё раз вызывать конструктор для подключения к той же базе никто не будет. Точно так же, как и создавать ещё один объект.
а я лоханулся с такой байдой, потому что получилось что в некоторых местах было двойное "спасение" - а это бред