Задать вопрос
Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
Ответы пользователя по тегу PHP
  • MySQLi: зачем нужна проверка соединения connect_errno?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Все правильно, никакая проверка здесь не нужна.

    Ошибки должен отлавливать обработчик ошибок. Который уже будет сам решать - что показать на экране, а что записать в лог.
    Ответ написан
    7 комментариев
  • PHP. Singletone для pdo. Как реализовать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ответ на этот вопрос очень простой.

    - Если ты пишешь процедурный код, то в синглтоне нет никакого вреда, а только одна польза.
    - Если же ты пишешь объектный код, то синглтон тебе просто не нужен, поскольку в объект при создании всегда можно передать инстанс класса для работы с БД и присвоить переменной класса.

    по поводу реализации

    1. Как уже сказали выше, какой-то странный метод getInstance(). Если каждый раз вызывать с парасетрами, то какой вообще смысл в синглтоне? Сделай хотя бы два метода, один коннект, а второй гетинстанс.
    2. Не очень понятно почему две статические переменные, и какая за что отвечает. почему бы не оставить одну?
    3. Если уж делать синглтон, то лучше избавляться от лишней писанины, и обращаться напрямую к методам для работы с БД: `DB::insertId()` будет поудобнее, чем `DB::getInstance()->insertId()`
    4. Учитывая неудобство метода PDO::execute(), будет полезным подправить классиков и добавить метод, который будет выполнять запрос с параметрами и вернет стейтмент. Пример можно посмотреть здесь: https://phpdelusions.net/pdo/pdo_wrapper
    Ответ написан
    Комментировать
  • PHP mysqli_fetch_all() всегда возвращает типы данных в соответствии с типами данных столбцов?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Всегда, если использовался prepared statement.
    Ответ написан
    Комментировать
  • Real_escape_string($var) выдает ошибку почему???

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Потому что функцию sanitizeString надо выкинуть на помойку, чарсет задавать сразу после коннекта, а для запросов использовать подготовленные выражения
    Ответ написан
    Комментировать
  • Мультиязычный сайт php + mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Всего-то надо использовать правильную константу ПДО
    $lang = $pdo->query("SELECT `key`, `english` FROM language")->fetchAll(PDO::FETCH_KEY_PAIR);
    echo $lang['solved'];
    Ответ написан
    Комментировать
  • Добавить универсальности к запросам БД из PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Следует понимать, что даже с использованием перечисленных выше инструментов, без "ручной" сборки запроса не обойтись.

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

    - куча времени, убитого на поиски, адаптацию, и допиливание означенного автопостроителя
    - эмоции вида "как эта №%;%:?У#$^№ вообще работает??!" когда через пол-года придется добавить какое-либо новое поле
    - апофеоз, когда потребуется добавить условие, не поддерживаемое автопострителем, какое-нибудь IF EXISTS

    Поверьте, затраты на написание запроса вручную (неважно, через убогое mysql_query или Доктрину) - ничто по сравнению с возможностью **прочитать и понять**, для чего, вообще, данный код нужен, и как он это делает.

    Поэтому излишняя автоматизация бывает очень вредна. И гоняться за ней не стоит.
    Ответ написан
    1 комментарий
  • Как правильно сформировать запрос mysql в pdo?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    PDO к вопросу не имеет ни малейшего отношения.

    Вопрос только в том, как определить, нужен ли нам запрос UPDATE или INSERT. причем вопросы высосан из пальца. Начинающие пользователи пхп очень часто предаются мечтаниям вместо того чтобы писать код. И из таких мечтаний получаются вопросы типа
    В методе save мы можем получить все id из базы и сравнить их с id новой новости

    Если бы автор занимался написанием кода, а не мечтаниями, то сразу бы увидел, что никакого id у новой записи в принципе нет, и быть не может. Что и является признаком, по которому мы определяем, какой запрос выполнить. И таким образом задача "получить все id из базы и сравнить их с id новости" исчезает сама собой, а в месте с ней и страхи про ужасную нагрузку на БД.

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

    - синтаксис запроса для обновление выглядит как UPDATE news SET title=:title, text=:text WHERE id=:id'
    - даже если нам нужно было бы првоерять существование ид в базе, для этого не нужно выбирать ид всех новостей. Достаточно запросить одну запись с интересующим нас ид.
    Ответ написан
    Комментировать
  • Fatal error: Call to a member function fetch_assoc() on a non-object in как исправить?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Этот неловкий момент, когда SO.RU делает Тостера, как стоящего: mysql_fetch_array() expects parameter 1 to be reso...

    Если коротко, то перед соединением с БД надо написать волшебную строчку
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    запустить свой скрипт и узнать, что не так с этим хостом.
    Ответ написан
    Комментировать
  • Как при использовании PDO привязать массив значений в условие IN?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Классическое решение:

    <?php
    $ids=array(1,2,3,7,8,9);
    $in  = str_repeat('?,', count($arr) - 1) . '?';
    $stmt = $db->prepare('SELECT * FROM table  WHERE id IN($in)');
    $stmt->execute($ids);
    Не слишком красиво, но зато безопасно.
    Ответ написан
  • Как получить параметры колонки при выборки данных через SELECT?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Сколько ответов, и ни одного правильного

    PDOStatement::getColumnMeta
    Ответ написан
  • Можно ли при запросе из БД получить цифру?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Перевожу на понятный язык ответ DevMan:

    Чтобы получить данный функционал, необходимо, чтобы были соблюдены два условия:

    - модуль pdo_mysql должен быть собран на базе mysqlnd. проверяется через phpinfo()
    - для запроса используются родные подготовленные выражения, что достигается установкой PDO::ATTR_EMULATE_PREPARES в false
    Ответ написан
    Комментировать
  • Что лучше, свой фреймворк или сторонний?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    > "велосипед" который будет обновляться самой командой в соответствиями с требованиями проекта?

    Проблема в том, что требования бизнес-процесса всегда имеют больший приоритет перед необходимостью технической модернизации. И в реальности внутренний фремворк никогда не обновляется (ну, если только конечно вы не Баду с 100500 девопсов), и через пару лет разработчики начинают чувствовать себя питекантропами.

    Следует понимать, что используя мейнстримный фремворк, вы получаете обновления на халяву. Обновления, над которыми работают тысячи людей - ресурс, которого у коллектива системы "междусобочик" никогда не будет.

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

    Это значит, что фреймворк использовался только для украшения, а бизнес-логика писалась по-старинке, овнокодом.
    Мы месяц назад поменяли мажорную версию Симфони, с 2.3 на 3.2. Переделки потребовались, но чисто механические, по замене нескольких устаревших функций.
    Достаточно следовать рекомендованным практикам, использовать рекомендованные инструменты и апгрейд не будет настолько болезненным.

    Плюс я считаю, что болезненность апгрейда в любом случае преувеличена, и несравнима с переездом с самопала.

    > Как обычно поступают команды, когда используется сторонний фреймворк, постоянно обновляют его версию в проекте или остаются на старой версии?

    Хотя бы за мажорной версией следовать необходимо.
    Ответ написан
    3 комментария
  • Как получить данные трёхмерным массивом?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Интересная задачка.
    Клнечно, она была бы еще интереснее, если бы ты сразу написал нужный запрос, но и так хорошо.

    В общем, можно попробовать похимичить с константами PDO::FETCH_*. То есть запросить избыточные данные, с дублированием элементов меню, и упорядочить константами. На праздники поиграюсьпоиграюсь

    Хотя трехмерный получить наверное не получится. Ключами юудет имя меню а значениями - массив с сабменю
    Ответ написан
    Комментировать
  • Подготовленные запросы или подготовленные процедуры?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Нет, преимуществ не будет, а вот неудобства значительные. Чтобы поменять запрос или просто посмотреть его логику, придется лезть в бд, что очень неудобно.

    Да и старик Оккам не одобряет.
    Ответ написан
    1 комментарий
  • Какой способ подключения PHP к apache лучше?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Для тех, кто спрашивает, лучший вариант - модуль. Чтобы потом не было вопросов "ой у меня это не работает!"

    С точки зрения производительности - nginx + php-fpm под линуксом
    Ответ написан
    4 комментария
  • Как лучше кэшировать данные postgresql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    У начинающих программистов кэширование - это какой-то фетиш. И они пытаются впихнуть его куда угодно, без малейшего повода. А точнее, повод - это собственные страхи, порожденные невежеством
    Ответ написан
  • Альтернатива checkbox или как его заставить возвращать false если он не активен?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Был старый-старый хак, думаю, что он работает и сейчас
    <input type = hidden name = cbx value = 0>
    <input type = checkbox name = cbx value = 1>


    Работает, как я понимаю, за счет того, что последующее значение затирает предыдущее.
    То есть, запрос выглядит как
    ..&cbx=0&cbx=1&...
    в итоге в скрипте получается что-то вроде идущих подряд
    $_GET['cbx'] = 0;
    $_GET['cbx'] = 1;

    И в итоге остается только один.

    Отсюда становится понятно, что важно соблюдать порядок - хидден должен идти всегда первым.
    Ответ написан
    1 комментарий
  • Как правильно распределить отправку формы: файлы на один сервер, данные - на другой?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Открою тебе секрет: "подмонтировать" можно не только в "локальной сети".
    А отправлять форму надо на сервер приложений целиком.
    На раздающих же статику серверах пхп даже не установлен, и никаких проверок и обработок они не сделают.
    Поэтому шлёшь на один сервер, а он - после проверки и обработки - отдает на облако
    Ответ написан
    Комментировать
  • Какой должен быть синтаксис SQL запроса в php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Синтаксис SQL не отличается ничем.
    Отличается только способ подстановки переменных.

    Во-первых, запросы должны исполняться не через mysql_query, а через PDO
    В-вторых, на месте переменных должны стоять знаки вопроса, а сами переменные - передаваться в запос при исполнении:
    $stmt = $pdo->prepare("UPDATE `users` SET `name`=? WHERE id=?");
    $stmt->execute(array($name, $id));
    Ответ написан
    2 комментария
  • Неправильно работает скрипт, что я делаю не так?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Проблем у тебя две
    1. Ты используешь mysqli, а должен использовать PDO
    2. Самая главная проблема - ты не читаешь описание функции в документации. За это в хороших местах бьют линейкой по пальцам. То есть вот ты сам себе выдумываешь назначение функции, втюхиваешь ее себе в код, а потом удивляешься, почему ничего не работает! Ну так естественно, что не работает - и не должно.

    В общем, так как ты хочешь, работает в PDO функция fetchAll(). Поэтому быстро переходишь на PDO. Как соединяться написано здесь, а код переписываешь так:
    $data = $db->query('SELECT * FROM news');
    foreach($data as $res){
    Ответ написан
    Комментировать