• Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

    @popov654 Автор вопроса
    Ипатьев,
    Потому что там нет никакого подготовленного мульти запроса. Ни с плейсхолдерами, ни без.

    А что тогда есть? Я так и не понял. prepare() же вызывается PDO-шный?

    как обычно, там соврали

    Слабо в лицо это человеку сказать, который там отвечал? :)

    с какого перепугу-то он будет закрывать

    В случае PDO SQL запроса не через prepare() - вроде закрывает.
    Написано
  • Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

    @popov654 Автор вопроса
    Akina,

    По мнению разработчиков, основное назначение подготовленного запроса - итеративные процедуры

    Кстати, это странное мнение, учитывая, что я изучал разработку под Android, и там при прямой работе с SQLite подготовленные запросы используются буквально везде.

    Понятно, что движки разные, но всё-таки странно сводить всё к хранимым процедурам... :)
    Написано
  • Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

    @popov654 Автор вопроса
    Akina, кроме того, я проведу ещё один эксперимент - хочу добавить в этот мультизапрос плейсхолдеры и сделать его параметризованным. Может, тогда он упадёт...
    Написано
  • Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

    @popov654 Автор вопроса
    Akina, мы все в этом обсуждении упустили одну очень важную деталь.

    Дело в том, что у меня падает не на мультизапросе, который я пытаюсь вызвать через prepare(), а на следующем запросе, но только в том случае, если я не сброшу переменную, и таким образом во внутреннем объекте в драйвере не вызовется деструктор.

    Как вообще такое возможно? Если подготовленные мультизапросы не работают и не должны работать, почему мы не падаем с ошибкой прямо на этом запросе? А мы не падаем - я проверял, данные вставляются в таблицу в полном объёме, кроме того, если бы мы упали, как мне объяснили на StackOverflow, это было бы отражено в результате. Но я получал результат, и он был пустой.

    Таким образом, проблема в том, что дефолтный режим запросов - unbuffered query, но драйвер в случае мультизапроса сам не закрывает соединение, ожидая этого действия от PHP (конец жизни переменной) либо от программиста.

    Так вот я и спрашиваю, нафига так сделано и какая в этом логика...

    А вместо этого мы свели вопрос к тому, что я плохо от инъекций защитил код.
    Написано
  • Как установить PHP в режиме отладки под Ubuntu?

    @popov654 Автор вопроса
    ThunderCat, я перепроверил - в этой папке есть файлы .so, но не все, которые у меня включены. Но он ругается на возможность загрузить даже те, которые там есть :(
    Написано
  • Как установить PHP в режиме отладки под Ubuntu?

    @popov654 Автор вопроса
    При чём я не понимаю, почему он ищет в /usr/lib/php/20210902, я явно указывал в php.ini другую папку для расширений, и он это игнорирует. Впрочем, проблема в том, что я этих модулей вообще ни в одной папке не вижу. Но под апачем он откуда-то их берёт
    Написано
  • Как установить PHP в режиме отладки под Ubuntu?

    @popov654 Автор вопроса
    alex ~  php -c /etc/php/8.1/apache2/php.ini --ini
    PHP Warning:  PHP Startup: Unable to load dynamic library 'curl' (tried: /usr/lib/php/20210902/curl (/usr/lib/php/20210902/curl: cannot open shared object file: No such file or directory), /usr/lib/php/20210902/curl.so (/usr/lib/php/20210902/curl.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
    
    Warning: PHP Startup: Unable to load dynamic library 'curl' (tried: /usr/lib/php/20210902/curl (/usr/lib/php/20210902/curl: cannot open shared object file: No such file or directory), /usr/lib/php/20210902/curl.so (/usr/lib/php/20210902/curl.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
    PHP Warning:  PHP Startup: Unable to load dynamic library 'fileinfo' (tried: /usr/lib/php/20210902/fileinfo (/usr/lib/php/20210902/fileinfo: cannot open shared object file: No such file or directory), /usr/lib/php/20210902/fileinfo.so (/usr/lib/php/20210902/fileinfo.so: undefined symbol: _emalloc_large)) in Unknown on line 0
    
    Warning: PHP Startup: Unable to load dynamic library 'fileinfo' (tried: /usr/lib/php/20210902/fileinfo (/usr/lib/php/20210902/fileinfo: cannot open shared object file: No such file or directory), /usr/lib/php/20210902/fileinfo.so (/usr/lib/php/20210902/fileinfo.so: undefined symbol: _emalloc_large)) in Unknown on line 0
    PHP Warning:  PHP Startup: Unable to load dynamic library 'mbstring' (tried: /usr/lib/php/20210902/mbstring (/usr/lib/php/20210902/mbstring: cannot open shared object file: No such file or directory), /usr/lib/php/20210902/mbstring.so (/usr/lib/php/20210902/mbstring.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
    
    Warning: PHP Startup: Unable to load dynamic library 'mbstring' (tried: /usr/lib/php/20210902/mbstring (/usr/lib/php/20210902/mbstring: cannot open shared object file: No such file or directory), /usr/lib/php/20210902/mbstring.so (/usr/lib/php/20210902/mbstring.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
    PHP Warning:  PHP Startup: Unable to load dynamic library 'mysqli' (tried: /usr/lib/php/20210902/mysqli (/usr/lib/php/20210902/mysqli: cannot open shared object file: No such file or directory), /usr/lib/php/20210902/mysqli.so (/usr/lib/php/20210902/mysqli.so: undefined symbol: mysqlnd_global_stats)) in Unknown on line 0
    
    Warning: PHP Startup: Unable to load dynamic library 'mysqli' (tried: /usr/lib/php/20210902/mysqli (/usr/lib/php/20210902/mysqli: cannot open shared object file: No such file or directory), /usr/lib/php/20210902/mysqli.so (/usr/lib/php/20210902/mysqli.so: undefined symbol: mysqlnd_global_stats)) in Unknown on line 0
    PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo_mysql' (tried: /usr/lib/php/20210902/pdo_mysql (/usr/lib/php/20210902/pdo_mysql: cannot open shared object file: No such file or directory), /usr/lib/php/20210902/pdo_mysql.so (/usr/lib/php/20210902/pdo_mysql.so: undefined symbol: mysqlnd_get_client_info)) in Unknown on line 0
    
    Warning: PHP Startup: Unable to load dynamic library 'pdo_mysql' (tried: /usr/lib/php/20210902/pdo_mysql (/usr/lib/php/20210902/pdo_mysql: cannot open shared object file: No such file or directory), /usr/lib/php/20210902/pdo_mysql.so (/usr/lib/php/20210902/pdo_mysql.so: undefined symbol: mysqlnd_get_client_info)) in Unknown on line 0
    PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo_sqlite' (tried: /usr/lib/php/20210902/pdo_sqlite (/usr/lib/php/20210902/pdo_sqlite: cannot open shared object file: No such file or directory), /usr/lib/php/20210902/pdo_sqlite.so (/usr/lib/php/20210902/pdo_sqlite.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
    
    Warning: PHP Startup: Unable to load dynamic library 'pdo_sqlite' (tried: /usr/lib/php/20210902/pdo_sqlite (/usr/lib/php/20210902/pdo_sqlite: cannot open shared object file: No such file or directory), /usr/lib/php/20210902/pdo_sqlite.so (/usr/lib/php/20210902/pdo_sqlite.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
    Configuration File (php.ini) Path: /usr/local/lib
    Loaded Configuration File:         /etc/php/8.1/apache2/php.ini
    Scan for additional .ini files in: (none)
    Additional .ini files parsed:      (none)
    Написано
  • Как установить PHP в режиме отладки под Ubuntu?

    @popov654 Автор вопроса
    Дмитрий, вроде бы оно там включено, но я ещё раз проверю
    Написано
  • Как установить PHP в режиме отладки под Ubuntu?

    @popov654 Автор вопроса
    Но я же указал вебовский php.ini через ключ командной строки, и всё равно не работает
    Написано
  • Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

    @popov654 Автор вопроса
    Akina,
    основное назначение подготовленного запроса - итеративные процедуры,

    итеративные конструкции в MySQL появились только в 8 версии,

    Какое-то противоречие :) Или я просто не понимаю, что такое итеративные конструкции?
    Написано
  • Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

    @popov654 Автор вопроса
    Vitsliputsli,
    при существенном усложнении хранения и обработки

    Ну я не вижу там существенного усложнения обработки, кроме необходимости предварительно правильно разделить мультизапрос по точке с запятой. А малая вероятность, что кто-то захочет так сделать - так себе аргумент, чтобы создавать особые правила-исключения :)

    Кроме того, драйвер мог бы сам делать это разделение хотя бы в режиме эмуляции, ИМХО, раз уж там всё равно один запрос уходит, а не три.

    завтра может быть другой или кто-то получит его доступ

    В таком случае инъекции станут меньшей из наших проблем. У нас source of truth - это именно гугл-документы, а не база. База нужна, например она хранит профили пользователей, результаты прохождения тестов, завершённые квесты - но она в некотором смысле вторична.

    Ну и в крайнем случае, мне проще в цикле применить mysql_real_escape_string() или аналог, ну или просто проэкранировать все одиночные кавычки в строках (не факт, что этого достаточно, но существуенно усложнит атаку).
    Написано
  • Как подменить видеопоток на камере android смартфона?

    Без обид, но звучит как попытка сделать какой-то скам. Обычно изображение с камеры интересует сотрудника банка при смене привязанного к аккаунту номера :)
    Написано
  • Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

    @popov654 Автор вопроса
    Ипатьев, к тому же вы зря так иронизируете. Баги случаются иногда. Только между PHP 7.4 и PHP 8.0 в PDO расширении было исправлено 3-4 бага, из которых два связаны именно с этой областью (некорректное чтение данных из множественных наборов результатов, не совсем корректная обработка ошибок). Там даже номера исправленных багов стоят, так что можете проверить, что я не нафантазировал.

    И в принципе, если бы не то обстоятельство, что это и правда ограничение MySQL, и ошибка прилетает именно с сервера - это был бы стопроцентный баг в модуле.

    А так это просто странное решение авторов СУБД, которое можно пытаться обойти, а можно забить.
    Написано
  • Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

    @popov654 Автор вопроса
    Ипатьев,
    что причина в вашей неспособности работать с документацией

    Про это нет в документации. По крайней мере, в "быстрых обзорах PDO для начинающих". То, что мне скинули - это вообще документация для C, а не для PHP, и она не от авторов PHP. А раз этого нет - значит, или косяк в документации, или в реализации.

    Эту проблему можно решить как минимум тремя путями: разрешить подготовленные мультизапросы в СУБД; сделать обход этой проблемы в драйвере, поделив мультизапрос на отдельные запросы; сделать патч DBAL в Doctrine, который сделает то же самое - проверит, есть ли точки с запятой вне литералов, и если есть, то поделит на отдельные запросы и исполнит их в цикле.

    И я не знаю как с первым, но вторые два фикса я мог бы написать даже сам, это не атомный реактор спроектировать.

    Мне просто странно, что никто до меня до этого не догадался. Или всем лень?
    Написано
  • Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

    @popov654 Автор вопроса
    Ипатьев,
    Ну или попытаться написать этот код самому

    Вы про какой именно код? Я знаю, как можно исправить эту ошибку в конкретном тестовом коде, но меня те варианты не очень устраивают, не красиво всё это выглядит. Ваш же вариант лучше, но в нём несколько больше строк и он сложнее читается.

    Вам надо уяснить для себя, что защита от инъекций системы "проверенный человек вводит, мамой клянус!" - это детский лепет

    Это ещё почему? Если один человек вводит, наверное он не станет вводить данные, которые могут привести к инъекции. Тем более, это гугл-таблица, и на значительную часть ячеек там уже наложены ограничения формата.

    Вам надо освежить память и вспомнить, что mysql_query вообще никогда не позволяла мультизапросы

    Возможно, и правда, наверное я сам это придумал. Но вот mysqli уже позволяет, правда через специальную функцию/метод - mysqli_multi_query().
    Написано
  • Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

    @popov654 Автор вопроса
    Ипатьев,
    Парсер в PDO вообще ни разу не полноценный, а простая заменялка плейсхолдеров

    Он дробит строку на токены по наборам символов. Глубже не копал, но такое там есть, регулярки для этого используются.
    Написано
  • Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

    @popov654 Автор вопроса
    Vitsliputsli,
    MySQL не поддерживает множественные запросы для подготовленных выражений

    А вы не знаете, почему был выбран разработчиками такой принцип?
    Написано
  • Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

    @popov654 Автор вопроса
    Ипатьев, так потому я и сделал на коленке второй пример, потому что уже было понятно, что проблема не в Doctrine, а ниже :)

    В смысле, я хочу сказать, что если бы работал парсер Doctrine (на самом деле я заглянул в код, где выбрасывается исключение, и там просто делегация вызова идёт всегда в PDOStatement) - то поведение было бы разным в этих примерах, а оно одинаковое.
    Написано
  • Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

    @popov654 Автор вопроса
    Ипатьев, во-первых, я вчера почитал код pdo_mysql, и понял, что там есть два режима - эмуляции и нативный. То есть, я полагаю, сам он тоже подстановку делать умеет, на всякий пожарный.

    Во-вторых, я проверил на более старых версиях PHP, до 8.0. Сначала мне показалось, что там это работает идеально, как мне и хотелось бы, но потом я понял, что там всё хуже - ошибка проглатывается и часть операций не исполняется.
    Написано
  • Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

    @popov654 Автор вопроса
    Akina, спасибо, теперь я начал понимать, что там происходит под капотом. Я раньше был уверен, что подстановку (prepare) делает именно PHP, точнее драйвер. В Doctrine вон этим код DQL парсера вообще занимается. Не знал про специальную SQL команду для этого.

    Да, я вчера догадался задним числом про точку с запятой в литералах. Но вообще, почему бы и не написать такой парсер? Слишком ресурсоёмко? Так можно сделать его отключаемым. Ведь не все запросы реально длинные, и не все длинные запросы требуют подстановок.
    Написано