Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/49: Рейтинг темы: голосов - 49, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87

DbSimple для работы с MySQL – подскажите альтернативу?

15.05.2013, 22:52. Показов 10536. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Для работы с mysql использую библиотеку от Дмитрия Котерова DbSimple.
Недавно начал изучать неймспейсы с автолоадером, а данная библиотека их не поддерживает. Стал переписывать библиотеку и увидел, что он повсеместно использует конструкции вроде "@mysql_*", усомнился и пошёл изучать PDO, но он ужасно многословен!

Подскажите, пожалуйста, лаконичные и защищённые библиотеки? Или можно использовать DbSimple в реальных задачах даже с учётом использования mysql_* и замалчивания ошибок?

Спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.05.2013, 22:52
Ответы с готовыми решениями:

Подскажите альтернативу dll и wpf для java
Спасите, друзья!!!! Очень нужен совет!!!!! Подскажите альтернативу dll и wpf для java

Подскажите программу для работы с базами данных MySQL
Долгое время веду поиск программы, которая может подключиться к удалённой базе MySQL и работать с ней визуально, редактируя данные прямо в...

Предложить альтернативу фильтрации для работы с объемной таблицей
Доброго времени суток, камрады! Есть исходная: Таблица, около 22 тысяч строк на 550 столбцов, все на одном листе. Ради...

12
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
15.05.2013, 22:54
ну помимо mysql и PDO есть еще mysqli, как минимум. Плюс к тому, в тырнете полно других оберток над БД.
0
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87
15.05.2013, 23:45  [ТС]
Если я всё правильно понимаю, для обычного селекта в mysqli необходимо написать следующее (даже если убрать проверки на ошибки и закрытие соединения):
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
 
// Простой селект
$stmt = $mysqli->stmt_init();
$query = 'SELECT * FROM users WHERE chmod = ? AND city = ?';
$stmt->prepare($query);
$stmt->bind_param('ss', $chmod, $city);
$stmt->execute();
$result = $mysqli->query($query);
$result->free();
$stmt->close();
 
// Выбор столбца
$stmt = $mysqli->stmt_init();
$query = 'SELECT city FROM users WHERE chmod = ?';
$stmt->prepare($query);
$stmt->bind_param('s', $chmod);
$stmt->execute();
$result = $mysqli->query($query);
$result->free();
$stmt->close();
С DbSimple тоже самое происходит вот так:
PHP
1
2
3
4
5
6
7
8
require_once 'DbSimple/Generic.php';
$db = DbSimple_Generic::connect('mysql://username:password@localhost/database');
 
// Простой селект
$result = $db->select('SELECT * FROM users WHERE chmod = ? AND city = ?', $chmod, $city);
 
// Выбор столбца
$result = $db->selectCol('SELECT city FROM users WHERE chmod = ?', $chmod);
Две большие разницы и первое выглядит как издевательство (с PDO то же самое примерно)! Три строки вместо огорода, который для DRY не оставляет надежды потому, что код однотипен и повторяется из раза в раз для разных запросов. Да ещё и хоть с короткими, но абсолютно не очевидными параметрами к bind_param() – почему там "s"? А почему одна буква это один параметр? И зачем вообще необходим какой-то statement?

Цитата Сообщение от KOPOJI Посмотреть сообщение
в тырнете полно других оберток над БД
Ради этого и написал – чтобы понять, безопасна ли DbSimple (сам не могу оценить ввиду низких знаний) и, если нет, посоветовали бы более безопасные, но не многословные альтернативы.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
15.05.2013, 23:56
Цитата Сообщение от TrogWarZ Посмотреть сообщение
тоже самое
вообще-то, это далеко не тоже самое. тоже самое на mysqli будет как-то так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
 
// Простой селект
$stmt = $mysqli->prepare('SELECT * FROM users WHERE chmod = ? AND city = ?');
$stmt->bind_param('ss', $chmod, $city);
$stmt->execute();
$result = $stmt->get_result();
 
// Выбор столбца
$stmt = $mysqli->prepare('SELECT city FROM users WHERE chmod = ?');
$stmt->bind_param('s', $chmod);
$stmt->execute();
$result = $stmt->get_result();
Добавлено через 2 минуты
тоже самое на PDO - как-то так
PHP
1
2
3
4
5
6
7
8
9
$db = new PDO('mysql:host=localhost;dbname=database', 'username', 'password');
 
// Простой селект
$res = $db->prepare('SELECT * FROM users WHERE chmod = ? AND city = ?');
$res->execute(array($chmod, $city));
 
// Выбор столбца
$res = $db->prepare('SELECT city FROM users WHERE chmod = ?');
$res->execute(array($chmod));
1
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87
16.05.2013, 00:02  [ТС]
KOPOJI, спасибо, pdo выглядит привлекательнее с точки зрения объёмов.
Подумал, что у Вас очепятка, полез в документацию execute(), но так и не понял – где результат-то получить после её вызова? Куда он возвращается?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
16.05.2013, 00:10
в $res и будет храниться.
потом просто
PHP
1
2
3
4
5
6
7
8
9
//либо
$row = $res->fetch(PDO::FETCH_ASSOC); //для одной записи
//либо
$row = $res->fetchAll(PDO::FETCH_ASSOC); //взять все записи (и поместить в двумерный массив)
//либо 
while($row = $res->fetch(PDO::FETCH_ASSOC)) //в цикле что-то делать с записями (например, выводить)
{
  //to do..
}
Добавлено через 4 минуты
вместо FETCH_ASSOC можно другую константу использовать (например, FETCH_OBJ - в виде объекта, FETCH_NUM - числовой, и т.д.), либо можно установить тип возвращаемых значений через setAttribute()
PHP
1
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
тогда можно будет писать просто
PHP
1
$row = $res->fetch(); //без указания типа возвращаемого значения
по умолчанию FETCH_BOTH - аналогично mysql_fetch_array - т.е. FETCH_ASSOC + FETCH_NUM
0
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87
16.05.2013, 00:57  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
в $res и будет храниться.
Не совсем. Только что проверил на своей тестовой базе:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$diameter = 7;
$height = 15;
 
// DbSimple
require_once 'DbSimple.php';
$db1 = DbSimple_Generic::connect('mysql://username:password@localhost/database');
$result1 = $db1->select('SELECT * FROM flowers WHERE diameter = ? AND height = ?', $diameter, $height);
var_export($result1); echo '<hr/>';
 
// PDO
$db2 = new PDO('mysql:host=localhost;dbname=database', 'username', 'password');
$wtf = $db2->prepare('SELECT * FROM flowers WHERE diameter = ? AND height = ?');
$wtf->execute(array($diameter, $height));
$result2 = $wtf->fetchAll(PDO::FETCH_ASSOC);
var_export($result2); echo '<hr/>';
Вот только тогда будет одинаковый вывод – var_export($wtf) показывает только строку запроса, а не результат запроса.

А ещё вопрос. Как адекватно вернуть одну ячейку таблицы базы? У меня получилось ужасно, да и вообще не понял – почему два плейсхолдера обрабатываются странно?
PHP
1
2
3
4
5
6
7
$column = 'price';
$id = 4;
$db2 = new PDO('mysql:host=localhost;dbname=database', 'username', 'password');
$wtf = $db2->prepare('SELECT ? FROM flowers WHERE id = ?');
$wtf->execute(array($column, $id));
$result2 = $wtf->fetchAll(PDO::FETCH_ASSOC);
var_export($result2); echo '<hr/>'; // (о.0)!! array ( 0 => array ( 'price' => 'price', ), )
Хочется примерно так:
PHP
1
$result1 = $db1->selectCell('SELECT price FROM flowers WHERE id = ?', $id); // '104'
Заглянул в документацию – а там среди параметров только массивы да объекты ): Как вернуть только значение, а не массив/объект? Только записывая вручную?

Добавлено через 13 минут
Почему я сделал название столбца тоже параметром..
PHP
1
2
3
4
$wtf = $db2->prepare('SELECT price FROM flowers WHERE id = ?');
$wtf->execute(array($id));
$result2 = $wtf->fetchAll(PDO::FETCH_ASSOC);
var_export($result2); echo '<hr/>'; // array ( 0 => array ( 'price' => '104', ), )
Поэтому хотел написать такое:
PHP
1
$result22 = $result2['0']['price'];
Выглядит ужасно, да и название столбца повторяется – чтобы обеспечить DRY, вынес в переменную и наткнулся на непонимание почему PDO в данном случае и результат запроса меняет?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
16.05.2013, 01:00
Цитата Сообщение от TrogWarZ Посмотреть сообщение
Не совсем
и к чему эти проверки?
Цитата Сообщение от TrogWarZ Посмотреть сообщение
(о.0)
действительно, о.О - должен выдать ошибку. Т.к. по умолчанию подставляет апострофы вокруг.
Цитата Сообщение от TrogWarZ Посмотреть сообщение
PHP
1
array ( 0 => array ( 'price' => 'price', ),
Цитата Сообщение от TrogWarZ Посмотреть сообщение
Как адекватно вернуть одну ячейку таблицы базы?
Вы невнимательны.
Цитата Сообщение от KOPOJI Посмотреть сообщение
$row = $res->fetch(PDO::FETCH_ASSOC); //для одной записи
Цитата Сообщение от KOPOJI Посмотреть сообщение
$row = $res->fetchAll(PDO::FETCH_ASSOC); //взять все записи (и поместить в двумерный массив)
Цитата Сообщение от TrogWarZ Посмотреть сообщение
Хочется примерно так:
есть FETCH_COLUMN, но лучше написать еще одну строчку.

Добавлено через 1 минуту
Цитата Сообщение от TrogWarZ Посмотреть сообщение
Только записывая вручную?
не понял, про что это.
Цитата Сообщение от TrogWarZ Посмотреть сообщение
результат запроса меняет?
аналогично, не понял про что это.
1
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87
16.05.2013, 01:10  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
Вы невнимательны.
Простите, посыпаю голову пеплом, был невнимателен и пропустил fetch() / fetchAll().

Цитата Сообщение от KOPOJI Посмотреть сообщение
не понял, про что это
Вот этот код даёт ожидаемый результат:
PHP
1
2
3
4
$wtf = $db2->prepare('SELECT price FROM flowers WHERE id = ?');
$wtf->execute(array($id));
$result2 = $wtf->fetch(PDO::FETCH_COLUMN);
var_export($result2); // '104'
А вот этот уже нет – возвращает название столбца, а не результат:
PHP
1
2
3
4
5
$column = 'price';
$wtf = $db2->prepare('SELECT ? FROM flowers WHERE id = ?'); // Добавил плейсхолдер на место названия таблицы
$wtf->execute(array($column, $id)); // добавил переменную перед $id, т.к. плейсхолдер для столбца находится перед плейсхолдером для id
$result2 = $wtf->fetch(PDO::FETCH_COLUMN);
var_export($result2); // 'price'
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
16.05.2013, 01:14
в общем, пропишите сразу после $db = new ... строчку
PHP
1
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
и заключите все в try-catch, чтобы увидеть ошибки.
0
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87
16.05.2013, 01:21  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
и заключите все в try-catch, чтобы увидеть ошибки
Так и сделано, просто я решил опустить эти строки в переписке – никаких исключений (и ошибки с ERROR_WARNING проверил) в блоке кода, который возвращает результат 'price' нет.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
16.05.2013, 01:24
код, который я прописал выше - дописывали?
0
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87
16.05.2013, 01:34  [ТС]
Да. Выглядит всё вот так.
Миниатюры
DbSimple для работы с MySQL – подскажите альтернативу?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.05.2013, 01:34
Помогаю со студенческими работами здесь

Подскажите альтернативу справке MSDN
искал спецификацию на функции net framework, нашел только онлайн справочник на сайте майкрософт, пользоваться которым неудобно. кто-то...

GetPixel не подходит, подскажите альтернативу
Добрый день! пишем с другом программку. На первоначальном этапе она должна считывать пиксели с экрана : получать цвет каждого пикселя в...

Scanf() имеет недостатки ! подскажите альтернативу
Доброго времени суток. Есть программа которая построена в режиме простого меню, то бишь свичем реализовано выбор какую из подпрограмм...

Подскажите пожалуйста логику работы доски объявлений на PHP+MySQL
Подскажите пожалуйста логику работы доски объявлений на PHP+MySQL

Подскажите самый простой способ очистки экрана в консольном Delphi (альтернативу clrscr в pascal)
Желательно покажите на примере любой программы, пожалуйста.


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
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, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru