• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Класс для работы с БД

  • Автор темы vital
  • Дата начала
V

vital

Вобщем-то уже давно сделал для себя простой класс для работы с бд, а сейчас пришло в голову выложить его сюда. Класс - элементарен до ужаса, но такая цель у меня и стояла, что бы работать было максимально просто, без каких-либо заморочек. Он даже скорее может служить шаблоном для развития, нежели готовым решением, но мне нравится и так..
PHP:
<?php
class DB
{
private $connected=false;
private $hwnd=null;
var $dbhost;
var $dbuser;
var $dbpass;
var $dbname;
public function __construct ($dbhost, $dbuser, $dbpass, $dbname) //Собственно конструктор, думаю, очевидно что ему передается. Коннект с бд происходит тут же и устанавливаем флаг что мы коннектед.
{
$this->dbhost=$dbhost;
$this->dbuser=$dbuser;
$this->dbpass=$dbpass;
$this->dbname=$dbname;
$this->connect();
$this->connected=true;
}
public function handle () //Это просто возвращает указатель на текущее соединение, если оно есть. Надо для использования функций типа mysql_error() и нек-х других, которым надо его передавать.
{
if ($this->connected)
{
return $this->hwnd;
}
else
{
return null;
}
}
private function connect () //Ф-я в которой соединяемся с бд... Приват - ибо руками ее трогать не надо. см.ниже
{
if (!$this->connected)
{
$this->hwnd=mysql_connect($this->dbhost,$this->dbuser,$this->dbpass);
mysql_select_db($this->dbname,$this->hwnd);
mysql_query('SET NAMES `windows-1251`'); //Устанавливаетя кодировка.. Можно сделать отдельное свойство, но мне было лень и не надо абсолютно)
$this->connected=true;
}
}
public function query ($query) //Собсно основная ф-я. Передаем запрос, проверка соеденены ли с бд, если нет, то соеденяемся и выполняем запрос, возвращает рез-т.
{
if (!$this->connected)
{
$this->connect();
$this->connected=true;
}
$res=mysql_query($query, $this->hwnd);
return $res;
}
public function disconnect () //Ну это тоже очевидно..
{
if ($this->connected)
{
mysql_close($this->hwnd);
}
}
}
?>
Собственно, вот и все. Вся работа сводится к
Код:
$db=new DB($dbhost, $dbuser, $dbpass, $dbname);
$sql=$db->query('SELECT * FROM table');
Ну и дальше все как всегда, mysql_fetch_array() и иже с ними..
 
D

Dimka Inc

Пара вопросов:
1. Зачем в методе query($query) присутствует присвоение: $this->connected=true;
Создаётся впечатление, что независимо от того, произошло соединение или нет, устанавливаем признак, что соединение установлено.
2. Если описан метод handle(), возвращающий в зависимости от состояния соединения или хэндл соединения, или null, игнорировать его и везде использовать сам хэндл? Ведь тогда, если соединение разорвали, мы будем обращаться к хэндлу несуществующего соединения.

------
Всех благ! :)
 
V

vital

Зачем в методе query($query) присутствует присвоение: $this->connected=true;
Соединение устанавливается там же, строчкой выше. Нету ифа на удачность.. Ну может и стоило, но как-то в голову тогда не пришло) Я был уверен, что не ошибусь в параметрах. Там везде где коннект() нету этого ифа.
Если описан метод handle()
В этом правы, это я исправил.. Потом.. Буду дома поправлю.
 
A

Alien193

Код:
$db=new DB($dbhost, $dbuser, $dbpass, $dbname);
$sql=$db->query('SELECT * FROM table');
Как-то не добавляет удобства, с таким же успехом я могу написать
PHP:
$db=mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname,$db);
$sql=mysql_query('SELECT * FROM table');
для чего собственно и созданы эти функции.
Особого удобства класс не добавляет, да и защиты нет.
вот это удивило :) обычно имя hwnd используется в языках программирования использующих пользовательский интерфейс. Дословно hwnd расшифровывается Handle Window, т.е. указатель на окно (форму). Не знаю к чему оно здесь использовалось, конечно это не принципиально ;)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!