Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
 Аватар для jugger_off
13 / 13 / 3
Регистрация: 21.12.2013
Сообщений: 225

Класс для работы с базой данных

06.07.2018, 17:10. Показов 3847. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,
Нашел сайт с классом для работы с базой данных:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?php
class DataBase {
 
  private static $db = null; // Единственный экземпляр класса, чтобы не создавать множество подключений
  private $mysqli; // Идентификатор соединения
  private $sym_query = "{?}"; // "Символ значения в запросе"
 
  /* Получение экземпляра класса. Если он уже существует, то возвращается, если его не было, то создаётся и возвращается (паттерн Singleton) */
  public static function getDB() {
    if (self::$db == null) self::$db = new DataBase();
    return self::$db;
  }
 
  /* private-конструктор, подключающийся к базе данных, устанавливающий локаль и кодировку соединения */
  private function __construct() {
    $this->mysqli = new mysqli("localhost", "root", "", "my_db");
    $this->mysqli->query("SET lc_time_names = 'ru_RU'");
    $this->mysqli->query("SET NAMES 'utf8'");
  }
 
  /* Вспомогательный метод, который заменяет "символ значения в запросе" на конкретное значение, которое проходит через "функции безопасности" */
  private function getQuery($query, $params) {
    if ($params) {
      for ($i = 0; $i < count($params); $i++) {
        $pos = strpos($query, $this->sym_query);
        $arg = "'".$this->mysqli->real_escape_string($params[$i])."'";
        $query = substr_replace($query, $arg, $pos, strlen($this->sym_query));
    }
    }
    return $query;
  }
 
  /* SELECT-метод, возвращающий таблицу результатов */
  public function select($query, $params = false) {
    $result_set = $this->mysqli->query($this->getQuery($query, $params));
    if (!$result_set) return false;
    return $this->resultSetToArray($result_set);
  }
 
  /* SELECT-метод, возвращающий одну строку с результатом */
  public function selectRow($query, $params = false) {
    $result_set = $this->mysqli->query($this->getQuery($query, $params));
    if ($result_set->num_rows != 1) return false;
    else return $result_set->fetch_assoc();
  }
 
  /* SELECT-метод, возвращающий значение из конкретной ячейки */
  public function selectCell($query, $params = false) {
    $result_set = $this->mysqli->query($this->getQuery($query, $params));
    if ((!$result_set) || ($result_set->num_rows != 1)) return false;
    else {
      $arr = array_values($result_set->fetch_assoc());
      return $arr[0];
    }
  }
 
  /* НЕ-SELECT методы (INSERT, UPDATE, DELETE). Если запрос INSERT, то возвращается id последней вставленной записи */
  public function query($query, $params = false) {
    $success = $this->mysqli->query($this->getQuery($query, $params));
    if ($success) {
      if ($this->mysqli->insert_id === 0) return true;
      else return $this->mysqli->insert_id;
    }
    else return false;
  }
 
  /* Преобразование result_set в двумерный массив */
  private function resultSetToArray($result_set) {
    $array = array();
    while (($row = $result_set->fetch_assoc()) != false) {
      $array[] = $row;
    }
    return $array;
  }
 
  /* При уничтожении объекта закрывается соединение с базой данных */
  public function __destruct() {
    if ($this->mysqli) $this->mysqli->close();
  }
}
?>
Кто-нибудь может объяснить что такое "Символ значения в запросе"? и параметр $params в getQuery()?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.07.2018, 17:10
Ответы с готовыми решениями:

Класс для работы с базой данных
Подскажите, пожалуйста, гарантирует ли данный класс закрытие connection по завершению работы с ним ? И выскажите свое мнение по поводу...

Класс для работы с базой данных на singleton
использую класс для глобального доступа к единственному экземпляру объекта PDO: class DB { private static $_instance = null; ...

Промежуточный класс для реализации методов работы с базой данных.
Кто-нить писал промежуточный класс для реализации методов работы с базой данных? Если не жалко, дайте, плиз. Хотя бы для ознакомления с...

16
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
06.07.2018, 17:58
Лучший ответ Сообщение было отмечено jugger_off как решение

Решение

Видимо это подобие подготовленных запросов.

Т.е. например вызываете метод select. В $query передаете - "select * from users where id = {?}", а в $param массив значений который надо подставить вместо вопросов - [$user_id].

Вот только зачем использовать какой-то левый велосипед, когда есть например medoo, с нормальной документацией и более мощным функционалом.
1
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
07.07.2018, 09:14
Цитата Сообщение от tarasalk Посмотреть сообщение
когда есть например medoo, с нормальной документацией и более мощным функционалом
ORM = зло
а ещё заметил:
switch БЕЗ default;
"?>" в конце;
try/catch;
@
PHP
1
$output[ $key ] = @$this->pdo->getAttribute(constant('PDO::ATTR_' . $value));
и практически ПОЛНОЕ отсутствие комментариев.
Да и валидатор такой себе...
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
07.07.2018, 10:05
полудух, это не ORM.
И мы уже это обсуждали, для меня ORM не зло, как и для большинства других.
По коду можете отправить пул реквест, вот это будет полезно.
Как правило, хороший код не нуждается в комментариях.
0
07.07.2018, 10:11

Не по теме:

Цитата Сообщение от полудух Посмотреть сообщение
а ещё заметил:
...
try/catch;
try/catch -- тоже зло?

0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
07.07.2018, 19:21
Цитата Сообщение от tarasalk Посмотреть сообщение
полудух, это не ORM.
хм, я видел там все части запроса в БД (кроме WITH, впрочем)
PHP
1
$query = $this->buildRaw($raw, $map);
не ORM, ok.

Как правило, хороший код не нуждается в комментариях.
вот сейчас повесились 100% программистов, сопровождающих чужой код.

Цитата Сообщение от Para bellum Посмотреть сообщение
try/catch -- тоже зло?
ну такое...
Как правило, исключение должно быть возбуждено, лишь если:
• Нет другого способа сообщить об ошибке (например, конструкторов, перегруженных операций и т.д.).
• Ошибка неисправимая (например, нехватка памяти).
• Ошибка настолько непонятная или неожиданная, что никому не придет в голову ее протестировать (например, printf).

Итак, что же плохого в исключениях? На самом деле существует две проблемы. Первой является читаемость. Вам будет тяжело меня убедить, что:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
some_class obj;
try
{
    obj.f();
}
catch( some_class::error &r )
{
    // выполнить действие в случае ошибки
}
 
лучше читается, чем:
if( obj.f() == ERROR )
    // выполнить действие в случае ошибки
В любом случае, если try-блок содержит более одного вызова функций, вы не сможете просто исправить ошибку, потому что вы не сможете узнать, где возникла ошибка.
засада!
(этот пример из C++, но суть одна)

-читаемость + try/catch делает код на 20% больше, если их активно юзать.
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
07.07.2018, 20:50
Цитата Сообщение от полудух Посмотреть сообщение
хм, я видел там все части запроса в БД (кроме WITH, впрочем)
Это query builder.

Цитата Сообщение от полудух Посмотреть сообщение
вот сейчас повесились 100% программистов, сопровождающих чужой код.
Ну и правильно. Меньше говнокодеров будет. К слову, именно комментарии делают код на 20% больше, а не try/catch.

Цитата Сообщение от полудух Посмотреть сообщение
этот пример из C++, но суть одна
Автор этого примера явно не шарит.
Про читабельность:
1) Экспешен позволяет пробрасывать ошибку через весь стек вызовов. Через if же придется писать проверку при каждом вызове функции.
2) Ошибки бывают разные. В итоге будет не один if, а целая пачка.
3) Также в любой момент могут появится новые ошибки. Тут вообще начнется ад, т.к. нереально контролировать что и откуда может придти.

Цитата Сообщение от полудух Посмотреть сообщение
В любом случае, если try-блок содержит более одного вызова функций, вы не сможете просто исправить ошибку, потому что вы не сможете узнать, где возникла ошибка.
Как раз таки наоборот, exception содержит в себе весь стек вызовов, а вот вариант через IF нет.

Ну а истина как обычно посередине. Оба варианта актуальны и активно используются.
1
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
07.07.2018, 21:03
одна из двух целей ORM:
Необходимо также обеспечить интерфейс для CRUD-операций над данными. В общем, необходимо избавиться от необходимости писать SQL-код для взаимодействия в СУБД.
Цитата Сообщение от tarasalk Посмотреть сообщение
К слову, именно комментарии делают код на 20% больше, а не try/catch.
они выкидываются из кода на этапе компиляции, а сопровождение кода именно упрощают

Цитата Сообщение от tarasalk Посмотреть сообщение
Автор этого примера явно не шарит.
Ален Голуб - программист с 1979 года, консультант и преподаватель, специализирующийся на С++, объектно-ориентированном проектировании и операционных системах Microsoft. Он проводит семинары по приглашению частных фирм повсюду на территории США и преподает в филиалах Калифорнийского университета, расположенных в Беркли и Санта-Круз. Он также работает программистом и консультантом по объектно-ориентированному проектированию, используя С и С++ в операционных средах Microsoft Windows, Windows 95, Windows NT и UNIX.

М-р Голуб регулярно пишет для различных компьютерных журналов, включая "Microsoft Systems Journal", "Windows Tech Journal" и изредка "BYTE". Его популярная колонка "Сундучок с С", публиковавшаяся в “Dr.Dobb's Journal” с 1983 по 1987 годы, стала для многих людей первым введением в С. В число его книг входят "Compiler Design in C", "C+C++" и "The C Companion". М-р Голуб сочиняет музыку и имеет лицензию частного пилота.
кстати, к комментариям он относится очень трепетно, а точнее он делает акцент на сопровождении, потому что именно сопровождение составляет основное время жизни ПО:
6.1. Начинайте с комментариев.
Если вы последовали совету в предыдущем правиле, то комментарии для вашей программы уже готовы. Для того, чтобы получить документированное описание реализации, вы просто писали и добавляли вслед за каждым абзацем блоки кода, реализующие качества, описанные в этом абзаце.
Оправдание "у меня не было времени, чтобы добавить комментарии" на самом деле означает "я писал этот код без проекта системы и у меня нет времени воспроизвести его". Если создатель программы не может воспроизвести проект, то кто же сможет?

7.1. В цехе современных программистов нет места примадоннам.
Это следствие из правила чтения. Программисты, которые думают, что их код совершенен, которые отвергают критику, вместо того, чтобы считать ее полезной, и которые настаивают на том, что они должны работать втихомолку, вероятно, пишут тарабарщину, не поддающуюся сопровождению - даже если кажется, что она работает. (Смысловое ударение здесь на слове кажется).
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
07.07.2018, 22:06
Цитата Сообщение от полудух Посмотреть сообщение
одна из двух целей ORM:
А вторая из этих целей:
Необходимо обеспечить работу с данными в терминах классов, а не таблиц данных.
Цитата Сообщение от полудух Посмотреть сообщение
они выкидываются из кода на этапе компиляции, а сопровождение кода именно упрощают
Суть не в этом. Еще раз - хороший код, как правило, не нуждается в комментариях.
Если в коде что-то не понятное типа:
PHP
1
2
3
if (array_key_exists('user_id', $_SESSION)) {
    
}
Не надо писать что это проверка авторизации. Надо вынести это в отдельный метод и дать понятное название.
PHP
1
2
3
if (Auth::check()) {
 
}
Так гораздо понятнее и ничего больше писать не нужно.

Цитата Сообщение от полудух Посмотреть сообщение
программист с 1979 года
Т.е. "старой закалки". В те времена небось исключений вообще не было.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
08.07.2018, 06:20
Цитата Сообщение от полудух Посмотреть сообщение
вы не сможете просто исправить ошибку, потому что вы не сможете узнать, где возникла ошибка.
Почему? Объект Exception содержит в себе всю информацию об ошибке (файл, строка и т.д.).
См. get-методы тут: http://php.net/manual/ru/class.exception.php
Цитата Сообщение от полудух Посмотреть сообщение
-читаемость + try/catch делает код на 20% больше, если их активно юзать.
С 20% Вы переборщили. Если считать построчно, то в 1200 строках 200 строк -- это try/catch? Если в одном блоке try/catch три строки:
PHP
1
2
3
4
5
6
# Пустые не считаются
try {
    
} catch(SomeException $e) {
 
}
то 200 строк -- это ~67 таких блоков. Т.е. через каждые 17 строк надо try/catch добавлять.
Интересно, кто их столько может напихать.
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
08.07.2018, 10:36
Цитата Сообщение от Para bellum Посмотреть сообщение
Почему?
там же написано:
Цитата Сообщение от полудух Посмотреть сообщение
В любом случае, если try-блок содержит более одного вызова функций, вы не сможете просто исправить ошибку, потому что вы не сможете узнать, где возникла ошибка.
поймаете вы ошибку, а какая именно ф-я её сгенерила?
лично мне trigger_error() нравится куда больше

Цитата Сообщение от Para bellum Посмотреть сообщение
Если в одном блоке try/catch три строки:
там же в примере 8 строк против 2х

Цитата Сообщение от tarasalk Посмотреть сообщение
Т.е. "старой закалки". В те времена небось исключений вообще не было.
да вам не угодишь
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
08.07.2018, 15:39
Цитата Сообщение от полудух Посмотреть сообщение
там же написано
Вы читали, что я дальше написал, не? Вопрос "Почему?" -- риторический, далее был аргумент, опровергающий Ваши слова.
Get-методы по ссылке, что я привёл, посмотрите. Там и трассировка и всё, что потребуется, чтобы секунд за 15-20 найти ошибку. И Вашу ненаглядную функцию тоже.
Цитата Сообщение от полудух Посмотреть сообщение
там же в примере 8 строк против 2х
Это уже вопрос к автору кода. Стандартам кодирования он, видимо, не следует. Зачем столько переводов строк (этот вопрос тоже риторический, если что)?
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
08.07.2018, 16:59
ну и где там пример такого плана:
PHP
1
2
3
4
5
6
7
try {
 test1();
 test2();
 test3();
} catch(Exception $e) {
 var_dump($e->getTrace());
}
и чтобы можно было понять, что ошибка именно в test2() ?
вы сами кроме себя не слышите никого.

Добавлено через 1 минуту
Цитата Сообщение от Para bellum Посмотреть сообщение
Зачем столько переводов строк (этот вопрос тоже риторический, если что)?
для читаемости.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
11.07.2018, 07:02
Цитата Сообщение от полудух Посмотреть сообщение
ну и где там пример такого плана
Товарищ, Вам на каждый вариант кода пример нужен? Сами написать и запустить код не можете? На-те:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
 
function test1()
{
    
}
 
function test2()
{
    throw new Exception('Error message');
}
 
function test3()
{
 
}
 
try {
    test1();
    test2();
    test3();
} catch(Exception $e) {
    var_dump($e->getTrace());
}
В распечатке есть такое: 'function' => string 'test2'
Ни на какие мысли не наводит?
Цитата Сообщение от полудух Посмотреть сообщение
вы сами кроме себя не слышите никого.
Вот и я про то же.
Цитата Сообщение от полудух Посмотреть сообщение
для читаемости.
Пусть учит стандарты кодирования.
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
15.07.2018, 15:41
Цитата Сообщение от Para bellum Посмотреть сообщение
Пусть учит стандарты кодирования.
он? А вы вот сможете объяснить разницу между C и C++ так, чтобы студент понял ?

Ладно, давайте посмотрим на это с практической точки зрения.
В коде ведь не должно быть ошибок вовсе. Т.е. все эти try/catch должны сработать 1 раз и сразу же исправляться.
Смысл их плодить, когда можно просто вести отлов всех ошибок через:
error_reporting(E_ALL | E_STRICT);
register_shutdown_function(...);
set_exception_handler(...);
set_error_handler(...);

и выдавать всем юзерам сообщение: "Произошла ошибка и мы уже работаем над её исправлением. Попробуйте снова через 10 минут."
а себе слать мыло с ошибкой, файлом и строкой
По сути вы тоже самое делаете через каждый try/catch. Попытки вместо неработающего кода выдать некую альтернативу считаю кривыми, не имеющими смысла и засоряющими код.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
15.07.2018, 21:21
Цитата Сообщение от полудух Посмотреть сообщение
он?
Он. Если именно он код форматировал.
Цитата Сообщение от полудух Посмотреть сообщение
Т.е. все эти try/catch должны сработать 1 раз и сразу же исправляться.
Сбой связи с БД, сбой интернет-соединения (при обращении к API и т.п.), сбой внутренней службы, сбой при записи на диск, находящийся на другом физическом устройстве (тупо свет моргнул и то устройство перезагрузилось). Список можно продолжать, вплоть до "электрик с-под бадуна резанул не тот кабель".

Сие не может быть "сработано 1 раз и исправлено правками в коде".
Цитата Сообщение от полудух Посмотреть сообщение
Попытки вместо неработающего кода выдать некую альтернативу считаю кривыми
Вы не понимаете разницы между нерабочим кодом и сбоем, не зависящим от кода.

Дальше разговор вести не буду.
1
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
16.07.2018, 01:52
Цитата Сообщение от Para bellum Посмотреть сообщение
Сбой связи с БД, сбой интернет-соединения (при обращении к API и т.п.), сбой внутренней службы, сбой при записи на диск, находящийся на другом физическом устройстве (тупо свет моргнул и то устройство перезагрузилось). Список можно продолжать, вплоть до "электрик с-под бадуна резанул не тот кабель".
Сие не может быть "сработано 1 раз и исправлено правками в коде".
и что вы предлагаете тут делать то? юзеру слать письмо счастья? Особенно, когда кабель порезали - у вас вообще сервер не будет работать!
опять же заглушка в виде "мы работаем над проблемой" тут лучший вариант

зы: сбой БД - эта 5. Если у вас на сайте регулярно сбоит БД, то вы не своим делом занимаетесь.

Цитата Сообщение от Para bellum Посмотреть сообщение
Вы не понимаете разницы между нерабочим кодом и сбоем, не зависящим от кода.
Дальше разговор вести не буду.
вот и славненько, ваши школьные фантазии начинающего админа даже читать скучно.
вы вообще не понимаете, что вам говорят. Всем плевать, что у вас там случилось, они хотят знать, что через 10 минут всё будет работать.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.07.2018, 01:52
Помогаю со студенческими работами здесь

Класс для работы с базой SQL Server
Добрый день. У меня вопрос к знающим людям. Пишу свой класс для работы с базой данных SQL Server в котором есть метод, который возвращает...

Посоветуйте класс для работы с sqlite базой
Всех приветствую. Посоветуйте класс для работы с sqlite базой данных. Именно класс, либо обертку (SQLite). Использовал SQLite, и все вроде...

Класс для управления базой данных
Здравствуйте! Прошу помочь с проблемой. Столкнулся с ней когда стало нужно сделать абстрактный класс. Вот абстрактный класс: public...

Программа для работы с базой данных
Нужно написать программу на Delphi, которая будет работать с базой данных (100 000 записей, формат базы не важен), и должна осуществлять...

Приложение для работы с базой данных
Здравствуйте. Надо было с ноля спроектировать и создать базу данных, затем заполнить данными. Данные заполнял в Маикрософт ЭСКУЭЛЬ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru