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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ответ легко ищется поисковиком
    Ответ написан
    Комментировать
  • Как правильно записать массив с данными в базу данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Как правильно записать массив с данными в базу данных?

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

    Они уже в массиве.

    Кто ж этим детям, которые строку в базу данных записать не могут, доступ к работе с деньгами даёт?..
    Он же ведь запишет. С пятью ошибками и десятком уязвимостей...
    Ответ написан
  • Как получить наличие ошибок всех запросов в одном execute()?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если принять, что запросы разные, а не как здесь, то не маяться дурью, а выполнить два запроса.
    $PDO = ConnectDB();
    $PDO->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $stm = $PDO->prepare(
        'INSERT INTO table
        (name)
        VALUES
        (:name1)
        ON DUPLICATE KEY UPDATE
        other = :name1'
    );
    $stm->bindParam(':name1', 'value1', PDO::PARAM_STR);
    $stm = $PDO->prepare(
        'INSERT INTO table
        (name)
        VALUES
        (:name2)
        ON DUPLICATE KEY UPDATE
        other = :name2;'
    );
    $stm->bindParam(':name2', 'value2', PDO::PARAM_STR);
    $stm->execute();

    если вставка одинаковых полей в одну таблицу, то очевидно мультиинсерт
    Ответ написан
  • Как выполнить CURL с POST данными в виде массива?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ответ написан
    Комментировать
  • Почему данные не отображаются на сайте?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Шикарный путь программиста - C++, C#, RedBean. Такое движение по наклонной в пропасть.

    Впрочем, с таким логическим аппаратом неудивительно.
    то есть сначала мы выводим форму со списком.
    ниже по коду, уже после вывода списка, записываем изменения в этом списке.
    А потом удивляемся, почему это вдруг надо обновить страницу, чтобы список эти изменения отобразил!

    (про то что статус меняем на user, а проверяем либо yes, либо no, я уже молчу)

    Ну ооочень сложный вопрос, аж три подписчика горят желанием узнать, какой баг в операционной системе вызывает такое неочевидное поведение.
    Ответ написан
  • Как запретить работу функции за пределами страницы с формой?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Перед тем как строить движки сайтов по MVC, надо сначала прочитать букварь по веб-разработке.
    И узнать из него, что
    - РНР запускается на сервере. А все формы отображаются в браузере у пользователя.
    - РНР запускается заново на каждый запрос.
    - на странице с формой никаких функций РНР нет. РНР со всеми своими функциями остался на сервере
    - РНР знать ничего не знает ни про какие страницы. Он видит только НТТР запросы. Который приходят не "со страниц", а от НТТР клиента. Который может быть браузером, а может быть какой угодно другой программой. Но даже если и браузер, то опять же, запрос приходит не "со страницы". А из НТТР клиента. В теории, клиент может сообщить серверу, какую страницу он запрашивал перед этим, но как правильно сказано в соседнем ответе, эту информацию легко подделать.
    - все значения констант, установленные про вызове одного скрипта, тоже остались на сервере, и если после этого обратиться к совсем другому скрипту, то он знать ничего не знает про то что делал первый.

    И уже самостоятельно сделать из этой информации вывод о том, что
    Запретить "ссылке отрабатывать самостоятельно, за пределами страницы с формой" невозможно.

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

    Для того, чтобы они перестали, достаточно просто назвать вещи своими именами. И со страницы регистрации отправлять клиента не на скрипт, который отправляет почту, а на скрипт, который занимается регистрацией.
    Ответ написан
    Комментировать
  • Как сохранить текст с тегами в базе и выводить?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    htmlpurifier но в мильон раз лучше будет использовать вместо дебильного html нормальный markdown
    Ответ написан
  • Экранирование символов при отправке формы POST php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это какая-то чушь. Сам РНР ничего не экранирует.
    И никаких "универсальных" способов экранирования нет. Про 7.3 и минус тоже какая-то глупость.

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

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

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

    А после этого узнать про такую штуку как сессии, и научиться использовать их вместо кук для хранения секретной для пользователя информации.
    Ответ написан
    Комментировать
  • Применимы ли генераторы для переиспользования кода?

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

    А вот "для оптимизации потребления памяти" генераторы не подходят от слова "совсем".
    Я не в первый раз уже вижу на Тостере эту чушь, и очень хотел бы знать, кто эту идиотскую мульку здесь запустил.

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

    "Большой массив" уже сожрал кучу памяти, и экономить тут уже нечего. Поздно пить Боржоми, когда почки отказали.
    Память экономит получение данных из внешнего источника не целиком, а по одному элементу
    А генератор всего лишь может замаскировать такое получение под работу с массивом.

    В моем коде требуется несколько раз переиспользовать foreach вложенный в foreach.


    Скорее всего генератор здесь будет бессмысленным.
    Чтобы понять, насколько здесь нужна какая-либо оптимизация, надо привести ИСХОДНЫЙ код, про который вдруг в голову ударила идея что его надо обязательно "оптимизировать"
    Ответ написан
    2 комментария
  • Почему не ищет новость в базе по заголовку?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    https://habr.com/ru/post/563530/

    Как правильно написал galaxy в комментариях, если база что-то "не находит", надо переводить обе строки в бинарное представление с помощью bin2hex() и смотреть разницу.

    и потом по результатам добавить str_replace
    Ответ написан
    Комментировать
  • Как добавить данные в БД через HTML-форму?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Сначала учимся правильно соединяться.
    В случае mysqli это
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect($host, $user, $pass, $db_name);
    $link->set_charset("utf8mb4");

    И никаких ужасов с "Соединение не установлено" тут быть не должно.

    После этого выполняем запрос INSERT. Причем запросы мы всегда пишем так, чтобы данные в БД попадали отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
    Для этого надо
    • Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    • Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
    • Привязать переменные к запросу.
    • Выполнить подготовленный ранее запрос с помощью с помощью execute()

    В mysqli это будет так
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("sssss", $title, $discription, $date, $path);
    $stmt->execute();

    bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

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

    Весь код, который добавляет запись в БД, должен быть расположен ДО любого вывода.
    После обработки запроса методом POST необходимо перенаправить клиента куда-нибудь методом GET и завершить работу скрипта. Делается это функцией header с заголовком location: . после которой написать exit;
    Соответственно, никаких ужасов с "Запись добавлена".

    Кстати, немного удобнее с БД работать не через mysqli, а чрез PDO, Тем более что там колупаться с bind_param не нужно, а можно сразу отправить все данные в execute

    Подключение
    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'root';
    $pass = '';
    $port = "3306";
    $charset = 'utf8mb4';
    $options = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset;port=$port";
    $pdo = new \PDO($dsn, $user, $pass, $options);


    Выполнение запроса
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->execute([$title, $discription, $date, $path]);
    Ответ написан
    1 комментарий
  • Как добавить значение из одной коллекции в другую если выполняется условие?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В цикле. В данном случае - вложенном.
    А если бы основная коллекция индексировалась через id, а не цыферками, то можно было бы обойтись одним.
    Ответ написан
    Комментировать
  • Возможно ли как-то оптимизировать json_decode?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Нет, "оптимизировать json_decode" нельзя.

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

    Распарсить, положить в базу, при изменении данных менять их в базе, искать по-человечески, через SQL.
    А редис тут вообще никаким боком не упёрся.
    Ответ написан
    8 комментариев
  • Как правильно настроить PHP mailer?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Перед настройкой почтового клиента в меню «Настройки» почтового ящика на вкладке «Почтовые программы» необходимо отметить флажок в пункте «Я хочу получить доступ к почтовому ящику с помощью почтового клиента».
    https://help.rambler.ru/mail/mail-pochtovye-klient...


    Ну и помимо этого, никогда не надо выдавать себя за кого-то другого. За фишинг могут больно побить палками. Времена, когда во from можно было подставить какой угодно адрес, давно прошли.
    Ответ написан
    2 комментария
  • Почему я получаю ошибку 500?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это написано в логе ошибок веб-сервера.
    Ответ написан
    Комментировать
  • Почему возникает ошибка SQLSTATE[42000] при запросе обновления в базе данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Потому что бессмысленный говнокод.
    У меня племянница трёхлетняя так дом строит: деревья, мишку плюшевого, колеса от грузовика - всё в дело идёт.
    Но ей хотя бы ума хватает не класть сверху мороженое. А тут всё вперемешку - SQL кривой, prepare используется там где не нужно, и не используется где нужно, каким-то боком mysqli...

    Переменные не пишут прямо в запрос. А передают отдельно. Потому что именно от этого все ошибки и происходят.
    И как раз для этого и используют PDO, с pepare и execute

    $options = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dbh = new PDO('mysql:dbname=database;host=localhost;charset=$charset', 'usr', 'password', $options);
    
    $stmt = $dbh->prepare("UPDATE posts SET content = ? WHERE id = ?");
    $stmt->execute([$content,$id]);
    echo "Пост - " . $id . PHP_EOL;
    Ответ написан
    Комментировать