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

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

    При переходе с mysql api на mysqli многие не учитывают, что каждое новое обращение к mysqli connect, в отличие от mysql connect, создает новое подключение. И таким обраом из одного и того же скрипта создается множество подключений.

    Ну и обязательный карго культ - как только похапист узнает про pconnect, он тут же тащит его к себе в норку, и огребает те самые too many connections.

    И это при том, что при 150 одновременных коннектах можно держать 50000 онлайн пользователей спокойно. Всего-то надо выкинуть пконнект, создавать соединение строго 1 раз и оптимизировать запросы.
    Ответ написан
  • Как правильно привести значения в массиве к типу int?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В общем, если нужно отсеять нулевые значения, то
    $filter = array_filter($filter, 'intval');
    если оставить, то
    $filter = array_map('intval', $filter);

    Но я смотрю тут уже столько умных рассуждений и заумных вариантов решения. Куда уж мне-то со своими огрызками.
    Ответ написан
    2 комментария
  • Как защитить от спама формы landing page без капчи?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Сделай простую ловушку.
    К примеру, поле для имени назови email, а для емейла - name.
    Ну и проверяй наличие собаки в емейле и отсутствие в имени .
    Ответ написан
  • Как правильно переписать функции php 5 на php 7?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Менять тут надо не тоьлко код, но и подход.
    потому что большая часть старого кода - это бессмысленные телодвижения, которые не приводят ни к какому результату.
    Повторить тоже самое в пхп7 не удастся.

    вместо функции connect надо написать вот такой код
    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'root';
    $pass = '';
    $charset = 'utf8mb4';
    
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    try {
        $mysqli = mysqli_connect($host, $user, $pass, $db);
        mysqli_set_charset($mysqli, $charset);
    } catch (\mysqli_sql_exception $e) {
         throw new \mysqli_sql_exception($e->getMessage(), $e->getCode());
    }
    unset($host, $db, $user, $pass, $charset);

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

    Вместо последнего блока кода
    $result = mysqli_query($mysqli, "SELECT * FROM admin WHERE uid='1'");
    $row = mysqli_fetch_assoc($result);
    $guid_agent = $row_admin['guid_agent'];
    $agent = $row_admin['agent'];

    Но самое главное - это код, где используются переменные в запросах.
    Их переписать так
    $sql = "SELECT * FROM users WHERE id=?"; // знак вопроса вместо переменной
    $stmt = $conn->query($sql); 
    $stmt->bind_param("s", $id); // переменная идет сюда
    $Stmt->execute();
    $result = $stmt->get_result(); // получаем result
    $user = $result->fetch_assoc(); // получаем массив
    Ответ написан
    5 комментариев
  • Как подключится к БД?

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

    Но раз уж спрошено, то правильно подключаться вот так:
    $host = 'booktst.beget.tech';
    $db   = '';
    $user = '';
    $pass = '';
    $charset = 'utf8mb4';
    
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    try {
        $mysqli = mysqli_connect($host, $user, $pass, $db);
        mysqli_set_charset($mysqli, $charset);
    } catch (\mysqli_sql_exception $e) {
         throw new \mysqli_sql_exception($e->getMessage(), $e->getCode());
    }
    unset($host, $db, $user, $pass, $charset); // we don't need them anymore


    Такой вариант подключения снимет сразу целую кучу проблем:
    • пропадут все проблемы связанные с кодировками (сохранятся вопросы вместо русских букв, не работает json_encode()...)
    • пропадут бесполезные сообщения об ошибках как mysqli_fetch_assoc() expects parameter..., место них будет выдаваться нормальное объяснение прочему запрос упал
    • сайт не будет позориться светя ошибками на весь интернет если упала база данных
    Ответ написан
  • PHP скрипт палит базу при неверном подключении?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    А теперь правильный ответ.

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

    Отключать показ ошибок надо для всего РНР целиком.

    И делается это очень просто. Добавляешь всего одну строчку в начало файла:

    ini_set('display_errors', 0);

    и всё - ни одна ошибка не появляется на экране! Причем это будут любые ошибки, а не одна конкретная.

    Но тебе всё равно нужно знать, в чем проблема. Чтобы её исправить. Поэтому сам текст ошибки надо писать в лог на сервере. Это тоже делается одной командой:

    ini_set('log_errors', 1);

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

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

    json_encode()

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ответы все конечно ад кромешный.

    если создать куки для этого то можно поменять скажем id и оказаться на чужом аккаунте так вот есть ли что-то подобное с сессиями

    нет

    насколько безопасна моя сессия

    вполне безопасна. для этого сессии и придуманы
    Ответ написан
  • Получить данные из цикла вида строки?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    прямо в запросе написать select group_concat(id) и сразу получить свою строку.
    Ответ написан
    Комментировать
  • Почему mysql возвращает пустую строку?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Потому что короткий тег наверное
    Ответ написан
    Комментировать
  • Подключение css в MVC системе на PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Используйте нормальный шаблонизатор, Twig.

    Сначала делааете главный шаблон сайта и в нем определяете изменяемые блоки. Самый главный, разумеется, будет пустой блок контент - то, куда пойдет вывод отдельных страниц.
    Также делаете блоки для скриптов и стилей.
    Общие стили сайта определяете в блоке стилей.
    Дальше делаете шаблоны для конкретных страниц, которые наследуют главному шаблону, и в которых заполняется блок контент.
    При этом блок стилей расширяется стилями, нужными конкретно для этой страницы.

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

    Я понимаю что без примера сложно.
    Вот простейший пример того, о чем я писал выше:

    main.twig.html
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
    {% block stylesheets %}
        <link href="/css/main.css" rel="stylesheet">
    {% endblock %}
            <title>{% block title %}Twig Example{% endblock %}</title>
        </head>
        <body>
            {% block content %}{% endblock %}
        </body>
    </html>

    index.twig.html
    {% extends "main.twig.html" %}
    
    {% block content %}
    <h1> index page </h1>
    <li><a href=/page1.php>Page 1</a>
    <li><a href=/page2.php>Page 2</a>
    {% endblock %}

    page1.twig.html
    {% extends "main.twig.html" %}
    
    {% block stylesheets %}
        {{ parent() }}
        <link href="/css/page1.css" rel="stylesheet">
    {% endblock %}
    
    {% block title %}Page 1{% endblock %}
    
    {% block content %}
    <h1> page 1</h1>
    <li><a href=index.php>index</a>
    {% endblock %}
    Ответ написан
    Комментировать
  • Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, bool given in?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Подскажите, пожалуйста, в чём проблема?

    В ДНК. Шутка.

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

    Сначала делаем отдельный файл mysqli.php и пишем в него код соединения. И это не одна строчка.
    Код берем отсюда, подставляем свои значения.

    if (isset($_POST['search'])) {
        require 'mysqli.php';
        $stmt= $mysqli->prepare("SELECT * FROM `persons` WHERE firstname=?");
        $stmt->bind_param("s", $_POST['fname']);
        $stmt->execute();
        $result = $stmt->get_result();
        while($r = mysqli_fetch_assoc($result)){ ?>
                        <tr>
                              <td><?= $r['id']; ?></td>
                              <td><?= $r['firstname']; ?></td>
                              <td><?= $r['lastname']; ?></td>
                              <td><?= $r['age']; ?></td>
                              <td><?= $r['gender']; ?></td>
                              <td><?= $r['city']; ?></td>
                          </tr>
                	<?php
       		}
           	} ?>
    Ответ написан
    Комментировать
  • Как изменить данные из формы и вернуть их снова в массив?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    НЕ ХОТЕЛОСЬ БЫ.
    Все эти идиотские "жернова" выкинуть на помойку.

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

    function addTask($db, $name, $task){
        $sql = "INSERT INTO tasks (name, task) VALUES (?,?)";
        $statement = $db->prepare($sql);
        $statement->execute([$name, $task]);
      }
    Ответ написан
    8 комментариев
  • Где найти простой скрипт авторизации PHP7+MySQL+SESSION+COOKIES?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Простой скрипт авторизации MySQL+SESSION на 7 ничем не отличается от 5.6
    Со времен 5.6 в этой области вообще ничего не изменилось.

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

    Если говорить про совсемпростейший вариант, и нарисовать хтмл форму ты можешь самостоятельно, то вот так
    <?php
    if (empty($_POST['email']) || empty($_POST['pass'])) {
        die ("Enter credentials");
    }
    require 'pdo.php';
    $stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
    $stmt->execute([$_POST['email']]);
    $user = $stmt->fetch();
    
    if ($user && password_verify($_POST['pass'], $user['pass']))
    {
        session_start();
        $_SESSION['user'] = $user;
        header("Location: /dashboard.php");
        exit;
    } else {
        die ("Wrong credentials");
    }
    Ответ написан
    Комментировать
  • Разная длина strlen на разных машинах?

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

    Учись верить фактам, а не своим фантазиям. Очень важное качество для программиста.

    И заодно учись скромности. Если тебе мерещится, что в твоих проблемах виновата страшная бага в пхп, то присмотрись повнимательнее. Увидишь дурацкую опечатку в своем коде.
    Ответ написан
    9 комментариев
  • Как разобрать массив?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ты же только что этот же вопрос задавал
    Ответ написан
  • Как в шаблон вставить php-файл?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не использовать простой шаблонизатор по типу.
    Использовать либо нормальный шаблон затор например Твиг, либо шаблон на чистом пхп
    Ответ написан
    1 комментарий
  • Как убрать ошибку Uncaught Error: Call to a member function fetch_assoc() on bool?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В ужасе выбросить это поделие на помойку.
    Оставить чистый mysqli
    Код соединения взять отсюда https://phpdelusions.net/mysqli/mysqli_connect
    Вместо get_result_array использовать mysqli_fetch_all()

    Если прям так хочется свой собственный класс, как у больших мальчиков, то соединение ложить в конструктор, а get_result_array() должен поддерживать подготовленные выражения.

    Но лучше сначала научиться нормально пользоваться готовым классом mysqli, а только потом городить свою поделку
    Ответ написан
  • Почему не подключается PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Просто скопируй правильное название чарсета там, где брал остальной код.
    Ответ написан
    Комментировать