1. PHP / Говнокод #27891

    −9

    1. 1
    2. 2
    Is there PHP mysql_real_escape_string for postgresql?
    pg_escape_string

    https://www.php.net/manual/en/function.pg-escape-string.php

    Запостил: real_escape_string, 23 Декабря 2021

    Комментарии (81) RSS

    • зачем пыхерам постгрес?
      Ответить
    • Даже pg_escape_bytea есть, а вот pg_real_escape_string нету.
      Ответить
    • For those who escape their single quotes with a backslash (ie \') instead of two single quotes in a row (ie '') there has recently been a SERIOUS sql injection vulnerability
      Ответить
    • Nathan Bruer ¶13 years ago
      If your database is a UTF-8 database, you will run into problems trying to add some data into your database...

      for securty issues and/or compatability you may need to use the: utf_encode()
      $my_data = pg_escape_string(utf8_encode($_POST['my_data']));

      --------------

      блядь, ну это реально какая-то альтернативная ветвь Homo. Это может денисовцы?

      Вот вы меня спрашиваете "почему нельзя писать на пхп".
      Вот нельзя с такими людьми находиться на одних ресурсах. Это вопрос гигиены же
      Ответить
      • Этого мудака ещё плюсанули.

        Посмотрел, что за функция utf8_encode. Хуй-ня какая-то. Перекодирует ISO8859-1 в UTF-8, больше ничего не умеет. Т. е. она нужна только мудакам из США и Западной Европы, которые путают свою кодировку с UTF-8.
        Ответить
        • Нужно запретить юникод.
          Ответить
        • Значит, входные данные у них предполагаются в ISO8859-1. Вопрос к тому, кто настраивал веб-сервер.
          Ответить
          • боже, я как в 1998-м году

            кодировки какие-то однобайтовые
            давайте еще рашн апаче вспосмним
            Ответить
            • https://pbs.twimg.com/media/D6VNPRiX4AAhrYg.png
              Ответить
            • Вопрос к «Альфа-банку» в 2019-м году:
              — Но почему тогда, например, скобки (круглые, квадратные, фигурные) не входят в ваш список спецсимволов?

              Ответ SMM-щика «Альфа-банка»:
              — Использование данных символов не рекомендуется, потому что в кодировках разных систем, символы определяется по-разному. Например, если вы создадите пароль в Linux, то потом по этому же паролю в ОС Windows вы не сможете зайти.

              Во вселенной «Альфа-банка» в 2019-м году существуют разные кодировки, поэтому использование в пароле символов за пределами базовой латиницы и цифр не рекомендуется.
              Ответить
              • Ну вообще они в чём-то правы... Юникодная нормализация -- не хуй собачий.
                Ответить
                • Да, с умляутами можно влететь, но не потому что в Windows и в Linux они кодируются по-разному, а потому что есть два способа набора: одним символом и кобенацией (базовой латиницей с надстрочным символом). В арабском и в китайском тоже заморочки с набором есть.
                  Ответить
              • Я бы не рекомендовал использовать в пароле вообще никакие символы.
                Если вы работаете за мейнфреймом с EBDIC, то ваш пароль может не подойти в Linx
                Ответить
              • > «Альфа-банка»
                Одному из комментаторов Banki.ru поддержка «Альфы» ответила, что с 1 октября внедряется комиссия за пополнение карт других банков с «пластика» Альфа-банка: она составит 1,95% (минимум 30 рублей).
                Бегите, глупцы!
                Ответить
            • >13 years ago
              Не возвращайте мне мой 2007-й.
              Ответить
      • > Вот вы меня спрашиваете "почему нельзя писать на пхп".

        тут недавно в дотнет-чате человек пришел. говорит, переписал бейс64, изкоробочный говно.
        спрашиваю, а что со стандартной реализацией не так?
        а он и говорит: нет декодинга и энкодинга в utf-8
        Ответить
    • <?php 
        $db = pg_connect('dbname=foo');
        // This is safe somewhat, since all values are escaped.
        // However PostgreSQL supports JSON/Array. These are not
        // safe by neither escape nor prepared query.
        $res = pg_delete($db, 'post_log', $_POST, PG_DML_ESCAPE);
        if ($res) {
            echo "POST data is deleted: $res\n";
        } else {
            echo "User must have sent wrong inputs\n";
        }
      ?>

      https://www.php.net/manual/en/function.pg-delete.php

      >> safe
      Ответить
      • "safe somewhat"
        Ответить
        • да, как в том пирожке

          я никогда не спал с мужчиной
          ну то есть да, бывало спал
          но спал в том смысле, что без секса
          ну то есть что считать за секс?
          Ответить
          • Твою маманю бы я разъебахал
            Ответить
          • Да с мужчиной-то хрен с ним, а вот с женщиной можно так, то один раз и... и привет.
            Ответить
      • > pg_delete

        Зачем? Зачем?

        На каждую бд своё апи?

        Давным-давно есть ODBC, а также PHP Data Objects. Advanced пыхеры вообще Zend Db заюзают.
        Ответить
        • А какая разница? SQL везде разный, безболезненной миграции ждать глупо.
          Ответить
          • Там пирдолиться с PG_DML_ESCAPE не надо.

            В PDO есть prepared statement.

            А Zend Db это вообще такое недоLINQ-to-SQL (что по идее должно быть портабельно).
            Ответить
            • Да тут тоже поди есть prepared statement?
              Ответить
              • На каждый sql-диалект учить новое api?
                В котором свои заковырки, особенности экранирования и багры.

                > Values must be escaped or the PGSQL_DML_ESCAPE flag must be specified in flags.
                > mysql_real_escape_string
                Итд

                Нет, ну нахуй. Лучше освоить раз универсальное api и писать на нём. И код будет портабельнее.
                Ответить
                • > универсальное

                  Один хер учить детали реализации этого апи под конкретную базу...

                  Портабельной будет только какая-нибудь key-value хуйня отображающая строку в строку. И то какое-нибудь говно вылезет.
                  Ответить
          • разница в том, что не нужно учить разный API, но лишь разные диалекты SQL
            Ответить
            • После просовывания какой-нибудь даты через обобщённое api это впечатление пропадает, как мне кажется.
              Ответить
              • Чем меньше разных API, тем лучше.

                Я не спорю с тем, что "универсальный SQL" это миф.
                но если есть возможность посылать его через одинаковый API (да еще и борться с SQL инъекцией) то чому б нi?
                Ответить
                • Потому что некоторые фишки могут плохо укладываться в обобщённое api.

                  > SQL инъекцией

                  Судя по доке там есть подготовленные запросы.

                  З.Ы. Помнится, PDO драйвер для мускуля вместо подготовки запросов тупо экранировал и клеил... Обобщённое апи такое обобщённое.
                  Ответить
                • При написании кода с использованием транзакций применительно к таблицам, которые их не поддерживают, MySQL будет считать, что транзакция была начата успешно.

                  Не возвращать же ошибку...
                  Ответить
                  • таблицы, неподдерживающие транзакции, это оксюморон.
                    В нормальных СУБД такого не может быть впринципе


                    Боже, как хорошо, что я не имею ни малейшего отношения к пыхоговну и мускульговну, это просто блядь can of worms блядь какой-то
                    Ответить
                • Ну или вот:

                  Драйвер MySQL не поддерживает должным образом PDO::PARAM_INPUT_OUTPUT через PDOStatement::bindParam(); хотя параметр можно использовать, он не обновляется (т.е. фактический вывод игнорируется).

                  Охуенно универсальное апи.
                  Ответить
                  • пыхокал умудрился обосраца и тут

                    А как дела в DAO, ADO, ADO.NET, JDBC, ODBC, PEP 249 и DBI?
                    Все ли сосут, или только пыхокал?
                    Ответить
                    • По-моему все...

                      1) Делаем апи, которое работает везде. Но из практических задач решить может чуть менее чем нихуя.
                      2) Пытаемся сделать апи, которое умеет всё. Иногда криво. Местами через эмуляцию. Один хер весь код в ифдефах.
                      3) Делаем экстеншены к общему апи. И получаем ёбаного уродливого кентавра. И весь код в ифдефах.

                      Выбери свой стул.

                      0) Забиваем хуй на обобщения и отдаём реальное апи базы.
                      Ответить
                      • Делаем API, которое вылядит единнообразно, но в 30% случаев имеет расширения.

                        Сишка тоже может между компиляторами отличаться.

                        Отличаться может трактование SQL, но API:
                        * делаем запрос (текстом)
                        * получаем курсор или таблицу

                        может быть универсальным

                        >все
                        нук покажи мне MySQL-specific говно в JDBC, например?
                        Ответить
                        • Решил усидеть на двух стульях? )))

                          Тогда тебе достанется апи в котором часть функций работает криво или через эмуляцию, а остальные надо тестить ифдефами... Добро пожаловать в реальный мир.
                          Ответить
                          • > через эмуляцию,
                            ради бога

                            хочеш перформанса -- бери реальный API
                            Ответить
                        • > делаем запрос (текстом)
                          > текстом

                          10/10

                          А экранировать его чем? )))

                          > получаем таблицу

                          Тоже текстом?
                          Ответить
                          • > А экранировать его чем? )))
                            mysql_real_escape_string, конечно!

                            > Тоже текстом?
                            CSV в строковой переменной.
                            Ответить
                          • >А экранировать его чем? )))

                            Средствами драйверв
                            https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

                            >Тоже текстом?
                            нет, объектом. По умолчанию можешь конечно переменную только текстом или числом скачать, хочешь специфичных штук -- завязывайся на драйвер
                            Ответить
                        • > MySQL говно в JDBC говне

                          JDBC API implementation notes в доке к коннектору. Ну и заодно соседние разделы про типы данных, даты и т.п.

                          З.Ы. И миллион атрибутов для коннектов и запросов.
                          Ответить
                          • и что? как это влияет на API-то?
                            Хочешь -- не знай как реализована PreparedStatement или что такое DatabaseMetaData, и с типами работай на уровне строк.

                            единственный отсос это
                            >MySQL does not support SQL cursors, and the JDBC driver doesn't emulate them
                            тут и правда плохо
                            Ответить
                            • А про large типы как тебе? Или раздел о том, как не проебать таймзону в датах...

                              Суть в том, что эта дока -- часть апи. И если её не изучить -- можно запросто обосраться.
                              Ответить
                              • Смотри: то, что одинаково не должно отличаться и в API.
                                то, что разное, отличаться должно.

                                Linux и Solaris разные, нельзя писать одинаково приложение под них, но какая-то их часть (позикс) одинаковая.

                                Тоже самое должно быть с СУБД.

                                Если
                                $petuh->query("SELECT * petuh from petuhi");

                                работает одинаково, то и API должен быть одинаковый, а не
                                mysql_query
                                pg_query
                                mssql_query
                                oracle_query

                                итд
                                Ответить
                                • А в JDBC есть какое-то гарантированное подмножество, которое будет работать на всех базах?

                                  Или типа мы тут нахуячили апи на object'ах, а ты иди читай доку по конкретной реализации чтобы догадаться во что их кастовать.
                                  Ответить
                                  • > А в JDBC есть какое-то гарантированное подмножество, которое будет работать на всех базах?

                                    Нет.

                                    Зависит от реализации драйвера.

                                    Например я ради лулзов ставил драйвер для csv (пробовал в squirele).
                                    И там даже update/delete нет. И джойны какие-то анскильные, деталей не помню, но очень урезанный функционал.

                                    Драйвер же просто реализовывает интерфейс. В конце концов он может просто кидать NotImplementedException Upd: тьфу, это .нете. В Йаже UnsupportedOperationException.
                                    Ответить
                                    • > просто реализует интерфейс
                                      > он может просто кинуть NotImplemented

                                      Какое LSP )))

                                      Адепты ООП свою методичку так и не дочитали...
                                      Ответить
                                  • "SELECT * FROM Tablename" будет работать
                                    Ответить
                                • Ну и раз уж зашла речь о позиксе...

                                  Я могу написать прогу, пользуясь только позиксовой докой (ну или стандартом крестов/сишки). И она должна работать на всех системах, что заявили себя как позикс (поддерживают стандарт крестов/сишки).

                                  Могу ли я написать прогу, пользуясь только спекой на JDBC и не поглядывая в вендорские доки? Ну ок, параметры подключения можно подсмотреть или их юзер снаружи передаст.
                                  Ответить
                                  • Да, я ж написал: SELECT * from foo будет работать.

                                    Этого, разумеется, не хватит для продакшена, но хотя бы то, что одинаково, будет выглядеть одинаково.
                                    Ответить
                    • Да везде есть driver-specific питушня, некие функции которые не работают/не реализованы.

                      Но это на порядок проще чем учить driver-specific api.
                      Ответить
                      • Имхо, лучше честное и красивое driver-specific api, чем дырявая абсракция ради абсракции и напяливание совы на глобус.

                        По крайней мере не создаёт иллюзию обобщённости.
                        Ответить
                        • Это не абстракция, а просто предсказуемый интерфейс.

                          датабейз агностицизма никто не обещает в здравом уме
                          Ответить
                          • Вообще-то есть такие библиотеки.
                            Ответить
                            • приведи реальный пример
                              Ответить
                              • Microsoft released Entity Framework, an ORM (Object Relational Mapping) tool, in 2008.

                                Entity Framework gives developers the ability to be abstracted from the underlying relational database management system and allows them to talk to a database using familiar LINQ-based syntax.

                                Entity Framework therefore simplifies the development process and greatly aids in improving productivity while working with a database. Entity Framework does so via a model that serves as a database abstraction. However, this technology is not database agnostic. As a result, if an application needs to be compatible with multiple databases, you have two choices. You could have multiple models, thus duplicating your efforts with each supported RDBMS (Relational Database Management System). Alternatively, you can use single model by deploying a technique that allows you to switch database support during deployment based on your target database.
                                Ответить
                                • >LINQ-based syntax.

                                  так ты пишешь на LINQ, а не на SQL.
                                  Ответить
                                  • However, this technology is not database agnostic.
                                    Ответить
                                    • >Microsoft released Entity Framework, an ORM
                                      > this technology is database agnostic.
                                      Дай угадаю.

                                      List of supported databases:
                                      * Microsoft SQL Server 2012
                                      * Microsoft SQL Server 2016
                                      * Microsoft SQL Server 2019
                                      Ответить
                                  • А вот тут Roshad Kokash пишет database-agnostic фреймворк:

                                    https://rashadkokash.me/framework-agnostic-app/
                                    Ответить
                                    • Смотри: у каждой базы данных свой диалект SQL, потому код на SQL обычно не агностик, и привязан к какой-то конкретной СУБД.

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

                                      Так работают Hibernate, EF, Django ORM, Alchemy, рельсы, и вот то, что пишет Кокаш.

                                      Во всех этих решениях ты не пишешь на голом SQL, а выражаешь мысли в более высокоуровневых терминах, которые затем переводятся на SQL.

                                      Не бывает кросс-процессорного асемблера, но бывает компилятор из си

                                      так и тут
                                      Ответить
    • ничего себе, по слову "пыхокал" говнокодик первая ссылка
      Ответить

    Добавить комментарий