Задать вопрос
  • Как написать правильный объединенный mysql код для php?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Сколько бесполезных манипуляций.
    public static function getProductsList()
    {
        $query = "select p.id, ...";
        return Db::getConnection()->query($query);
    }

    И mysqli и PDO для объекта результата давным давно предоставляют traversable. А плоский массив при необходимости многократно обходить результат получается элементарным fetchAll() без этой простыни.

    <?php foreach ($productsList as $product): ?>
         <tr>
             <td><?=$product['id']; ?></td>
         </tr>
    <?php endforeach; ?>

    Если бы вы действительно делали var_dump, то уже давно бы заметили, что алиас таблицы ни PDO ни mysqli в результат не предоставляют. Только имена самих полей или алиасы этих полей.

    Ну, это если считать, что PDO::ATTR_DEFAULT_FETCH_MODE у вас установлен в PDO::FETCH_ASSOC или хотя бы в дурацкий дефолтный PDO::FETCH_BOTH.

    В любом случае у вас выключено отображение ошибок. Переключите error_reporting в нормальный девелоперский E_ALL.
    Ответ написан
    2 комментария
  • Если нет поддержки AHCI то стоит ли ставить SSD?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    P35 без AHCI? Вы уверены?
    Integrated Peripherals/On-Chip ATA Devices/On-Chip SATA Controller есть отдельная менюшка и выбрать можно только эмуляцию IDE?
    Ответ написан
    3 комментария
  • Сменил хост получил, Field 'поле' doesn't have a default value?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Проблема в вашем коде. Наконец-то mysql начал об этом говорить. Нельзя писать в таблицу, не указывая явным образом значения для всех полей, не имеющих default значения.

    Вероятно, вы смигрировались на mysql 5.7. Там как раз sql_mode дефолтный наконец-то изменили. А может просто более адекватно sql_mode выставлен админом.
    dev.mysql.com/doc/refman/5.7/en/sql-mode.html
    На сколько помню, за поведение ошибочного insert'а без указания non-default полей отвечают STRICT_ALL_TABLES, STRICT_TRANS_TABLES.
    Ответ написан
    3 комментария
  • На что уходит первый байт fgetss()?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Returns a string of up to length - 1 bytes read from the file pointed

    php.net/manual/en/function.fgetss.php

    В точности как заявлено, так и ведёт себя.
    Ответ написан
    1 комментарий
  • Как правильно примонтировать raid массив в контейнер OpenVZ?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    В openvz есть скрипты на старт контейнера. Вот так mount'у и место
    https://openvz.org/Bind_mounts
    Ответ написан
  • Как провести insert, если одно из вставляемых значений нужно найти с помощью SELECT?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    insert into requests (file_id /*other*/) values((select id from tablename where name = ?) /*, other*/);

    NULL если строки не будет в подзапросе, ошибка - если их будет больше 1.

    insert into requests (file_id /*other*/) 
    select id, /* other const values*/ from tablename where name = ?;

    Если select даст 0 строк - ничего вставлено не будет.
    Одна или больше - столько новых строк и будет вставлено.
    Ответ написан
    Комментировать
  • Почему у nokogiri ключ массива #text?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Ведь $i['#text'] не канает.

    Почему это? Строка как строка. хэштаблице всё равно, что искать.
    Ответ написан
    Комментировать
  • Как отобразить JSON с кириллицей на PHP?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    JSON_UNESCAPED_UNICODE
    Ответ написан
    6 комментариев
  • Как исключить всё кроме определённых символов в регулярном выражении?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Ну так и ограничьте начало и конец совпадения. Спецсимволы ^ и $.
    Ответ написан
    Комментировать
  • 62 градуса - температура для HDD. Сам ПК еще горячее. Что думаете?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Если у вас именно HDD - это за пределами рабочего диапазона.
    knowledge.seagate.com/articles/en_US/FAQ/193771en
    По другим сходу не нашёл, но цифры схожие.

    И очень далеко за пределами оптимального температурного диапазона 35-45С, в котором диски живут статистически дольше всего.
    Ответ написан
    Комментировать
  • Почему type hint ругается на наследника?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Пока нельзя. Наследник должен строго соответствовать контракту родителя.
    https://wiki.php.net/rfc/generics Under Discussion
    Ответ написан
    Комментировать
  • Функция копирования строки БД PostgreSQL, как правильно написать?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    insert into tablename (field1, field2, field3) 
    select field1, field2, 'new values instead field3'
    from tablename
    /*where*/
    Ответ написан
  • Это DDos или ломится вирус?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Это вы DDoS'ите. reply сильно больше входа, плюс если это происходит по 53 порту - классика увеличения мощности UDP флуда через безалаберно настроенные DNS и firewall.

    Перенастройте свой firewall в адекватный режим запрещено всё, что не разрешено явно.
    Ответ написан
    Комментировать
  • Стоит ли делать составные внешние ключи в БД?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    1. внешние ключи должны быть там и те, чтобы гарантировать ссылочную целостность. Должна быть ссылка сочетанием именно двух параметров - значит должна быть ссылка сочетанием пары параметров. Лучше или хуже сюда не применимо. Два разных fk и один составной имеют различное поведение.
    2. для какой именно СУБД? Postgresql следуя стандарту SQL обязывает ссылаться только на уникальное поле. Mysql отступает и в этом вопросе от стандарта и позволяет проверять неуникальное индексированное поле.
    3. см. coding standart конкретного проекта. Обычно никто не обижается против именования: имя таблицы _ имена полей _fk
    4. можно упереться в предел размера индексируемого поля. У postgresql это 1/3 размера странички памяти = 2730 байт по дефолту, у mysql - зависит от кучи факторов.
    Ответ написан
    Комментировать
  • Как правильно сделать SQL запрос?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Включите в sql_mode режим ONLY_FULL_GROUP_BY и тогда, наконец-то, этот странный mysql перестанет разрешать делать странные вещи с группировкой, отчего получаются не менее странные результаты, зависящие от фазы луны .

    www.sql.ru/forum/687908/faq-vyborka-pervoy-posledn...
    Ответ написан
    Комментировать
  • Как прошить HDD Toshiba?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    имеется новый диск

    Ну и в СЦ его.
    Начал выдавать сюрпризы сразу же - как этот расходник можно для чего-то использовать?
    Ответ написан
    Комментировать
  • Проясните работу RAID 1???

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Система обязана продолжать работать.
    Это единственный смысл строить рейд с резервированием данных - продолжать работу при выпадении оговорённого уровнем рейда диска. Больше никакого смысла делать массив с резервированием нет, это ни в коем случае не бекап.

    raid1 на 4 диска, то есть вам нужна ТАКАЯ избыточность хранения, но при этом вы не проверили поведение контроллера? Это странно.
    Ответ написан
  • Что лучше JOIN или использование нескольких таблиц в запросе?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    mysql> explain select test6.i from test6, test9 where test6.i=test9.i;
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                              |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    |  1 | SIMPLE      | test6 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | NULL                                               |
    |  1 | SIMPLE      | test9 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    4 |    25.00 | Using where; Using join buffer (Block Nested Loop) |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    2 rows in set, 1 warning (0,00 sec)
    
    mysql> show warnings;
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Level | Code | Message                                                                                                                                 |
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Note  | 1003 | /* select#1 */ select `test`.`test6`.`i` AS `i` from `test`.`test6` join `test`.`test9` where (`test`.`test9`.`i` = `test`.`test6`.`i`) |
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0,00 sec)
    
    mysql> explain select test6.i from test6 join test9 on test6.i=test9.i;
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                              |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    |  1 | SIMPLE      | test6 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | NULL                                               |
    |  1 | SIMPLE      | test9 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    4 |    25.00 | Using where; Using join buffer (Block Nested Loop) |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
    2 rows in set, 1 warning (0,00 sec)
    
    mysql> show warnings;
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Level | Code | Message                                                                                                                                 |
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Note  | 1003 | /* select#1 */ select `test`.`test6`.`i` AS `i` from `test`.`test6` join `test`.`test9` where (`test`.`test9`.`i` = `test`.`test6`.`i`) |
    +-------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0,00 sec)

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

    Имеет смысл использовать join on по соображениям читаемости человеком, т.к. такой join сразу говорит, по каким полям связаны таблицы, а where органично остаётся для фильтрации.
    Плюс, в случае как у вас со связью по паре одноимённых полей можно написать
    SELECT maker, price FROM Product JOIN PC USING(model)

    Что эквивалентно PC.model = Product.model, но короче и позволяет в дальнейшем ссылаться просто на model - парсер уже знает, что значение поля будет идентично и не будет теряться в догадках, хотели вы получить model из PC или из Product
    Ответ написан
    Комментировать
  • Как в БД подставлять старые значения справочников?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Для начала между работником и учебным заведением связь многие-ко-многим.
    Во-вторых, с чего это для новых работников выбираются только новые значения? Можно быть одновременно новым работником и закончить лет *дцать назад именно бывшее тогда учебное заведение. Выбирать можно из всего списка, либо, что лучше, хранить для учебного заведения год открытия и год закрытия (default null) и выбирать подходящие по годам обучения.
    Если сохраняете ещё и даты обучения - то важно учесть, что учебное заведение может быть закрыто в любой момент между поступлением и выпуском студента. Поступил в одно заведение, выпустился из другого - запросто.

    Если нет особых требований к поиску учебных заведений, то достаточно хранить год закрытия (default null) и ссылку на новую форму после реорганизации, если есть (поэтому тоже default null).
    Для вашего примера будет КГПА например с edu_id = 105, reorg_to_id null и КГПУ со своим edu_id, датой закрытия и reorg_to_id = 105
    Ответ написан
    Комментировать
  • Как обработать коды ошибок PDO?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Переключите PDO::ATTR_ERRMODE в единственный адекватный режим PDO::ERRMODE_EXCEPTION.
    Нормальный поток исполнения - вас не заботят ошибки в SQL, раз метод вернул управление, значит он был выполнен успешно.
    Случилась какая-то ошибка - словили исключение. Если для какой-то конкретной ошибки вам нужна своя реакция - то тогда уже выясняете код именно этой ошибки, смотрите в getCode и реагируете на конкретный код ошибки.
    Ответ написан
    1 комментарий