Database - класс для работы с mysqli

Статус
В этой теме нельзя размещать новые ответы.

~WR~

Новичок
Посмотрел по диагонали.

1. Наверное, самая частая ошибка - доверие ключам массива. Можно закрыть backtick и дальше написать что угодно.
2. Вот это неправильно:
Данный класс при формировании SQL-запроса не занимается проставлением ограничивающих кавычек для одиночных
заполнителей скалярного типа, таких как ?i и ?s. Это сделано по идеологическим соображениям, автоподстановка кавычек
может стать ограничением для возможностей SQL.
Создаем таблицу, в ней поле varchar с индексом.
Пишем значения: '12345', 'Вася', 'Петя'.

При поиске по non-numeric строкам кавычки появятся, и индекс будет использоваться.
При поиске по строке '12345' кавычек не будет, и индекс будет проигнорирован.
 

damner2

Новичок
Василий М.
1. Нет возможности указать порт/сокет при коннекте.
2. Статичными свойствами (queries, list_fields) ты убиваешь возможность использовать несколько экземпляров классов для разных коннектов.
 

Василий М.

Новичок
~WR~
верно, это дыра:
PHP:
$user = array('name' => 'Василий', 'age`=25, adress="123"; #' => '30', 'adress' => 'Москва, ул. Деловая, 20');
INSERT INTO `test` SET `name` = "Василий", `age`=25, adress="123"; #` = "30", `adress` = "Москва, ул. Деловая, 20"
ка кэто можно победить? не читать же перед каждым запросом информацию о таблице?

damner2
ок поправлю позже
2. Статичными свойствами (queries, list_fields) ты убиваешь возможность использовать несколько экземпляров классов для разных коннектов.
ок подумаю над этим
 

Василий М.

Новичок
Создаем таблицу, в ней поле varchar с индексом.
Пишем значения: '12345', 'Вася', 'Петя'.

При поиске по non-numeric строкам кавычки появятся, и индекс будет использоваться.
При поиске по строке '12345' кавычек не будет, и индекс будет проигнорирован.
кто мешает искать с кавычками? Ставте себе их на здоровье.
 

Absinthe

жожо
Кавычки должны вставлять библиотека, а не пользователь.
Мое мнение.
 

Василий М.

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

Расскажите, как нужно float преобразовывать перед вставкой в базу.
 

riff

Новичок
Мне кажется, правильнее информировать об ошибке типа:
PHP:
$value = str_replace(',', '.', $value);
if (!is_numeric($value)) {
    throw new Exception(...
//если всё ок, то и не надо обрабатывать
 

hell0w0rd

Продвинутый новичок
riff, а давайте на драйвер повесим еще что ни будь? Валидацию уже повесили.
Задача драйвера запихнуть данные в базу, запихнуть именно такие данные какие ему сунули. Если предполагается что в переменной float - значит нужно ее взять и засунуть как float, а не выдумывать
 

Василий М.

Новичок
hell0w0rd, отчасти ты прав. поэтому мой драйвер и имеет 2 режима - либо принудительно преобразуем к нужному типу, либо до свидания.

вот как раз преобразование к нужному типу у меня и вызвало вопросы. достаточно ли для вставки в mysql просто (float) $var сделать?
 

hell0w0rd

Продвинутый новичок
Василий М.,
PHP:
 throw new Exception(__METHOD__ . ': ' . mysqli_error($this->lnk));
механизм исключений сам собой предполагает наличия информации о том, где исключение брошено и еще, при не правильных аргументах хорошо бы кидать InvalidArgumentException, как на пример тут:
PHP:
    public function setDatabaseName($database_name)
    {
        if (!$database_name)
        {
            throw new Exception(__METHOD__ . ': Не указано имя базы данных');
        }
 

hell0w0rd

Продвинутый новичок
Василий М., а чего еще может быть нужно? В случае с плейсхолдерами использовать нужно PDO::pARAM_STR, который по умолчанию и так используется.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху