Задать вопрос
  • Ошибка: 150 «Foreign key constraint is incorrectly formed» при создании новой таблицы?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это дебильное сообщение об ошибке, но если выполнить команду SHOW ENGINE INNODB STATUS, то там, под заголовком LATEST FOREIGN KEY ERROR будет нормальное объяснение, что конкретно не так.
    Ответ написан
    Комментировать
  • Как лучше взять данные из большого файла по ключу не перебирая строки?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Удивительно. Судя по истории вопросов, человек вроде бы занимается программированием почти 10 лет, с 2016 года.
    Но до сих пор рассуждает, как Чебурашка:
    - Гена, давай я понесу чемоданы, а ты понесёшь меня!

    можно ли как-то эту нагрузку снизить


    Можно. Для этого надо разместить эти строки в базе данных.
    Ответ написан
    2 комментария
  • Почему ошибка 502 после миграции с PHP 8.2 на PHP 8.3?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ошибка 502 обычно означает кривые настройки сервера. То есть надо или трясти админов этого "хостинга где всё кнопочками" или учиться настраивать сервер самостоятельно и переезжать на впс.

    И на будущее.
    было записано только то, что вызывается 502 ошибка, а не причина почему она вызвана.

    Правило: даже если вы не понимаете, что написано в сообщении об ошибке, или думаете, что оно бессмысленное, все равно его надо скопировать его в свой вопрос целиком.
    Ответ написан
    Комментировать
  • Не работает часть скрипта PHP при смены PHP 7 на 8?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В 7 версии этот код тоже не работает
    Ответ написан
    Комментировать
  • Как отладить плавающий баг проверки капчи?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Так же, как и любое взаимодействие браузера с сервером - через инструменты разработчика, вкладка "Сеть".
    Если "сессия не записывается", в 99% случаев это значит что браузер не прислал сессионную куку.
    И в инструментах разработчика надо смотреть заголовки запросов браузера и ответов сервера, смотреть есть ли в куках идентификатор сессии, и если есть - то какой.

    Плюс обычная отладка на стороне сервера, в частности дамп массива $_SESSION при каждом запросе, отображение всех ошибок, и так далее. Не бином ньютона
    Ответ написан
  • Как сохранить mysql базу?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    На будущее, формат, в котором сохраняется БД, называется "дамп".
    А дальше всё просто, как сохранить дамп в mysql workbench
    Ответ написан
    Комментировать
  • Объясните CASE WHEN THEN?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    $this->database()->query('UPDATE ' . $this->database()->getTable('ad') . ' SET view = 0 WHERE ad_id = 34');
    $this->database()->query('UPDATE ' . $this->database()->getTable('ad') . ' SET view = 1 WHERE ad_id = 35');
    $this->database()->query('UPDATE ' . $this->database()->getTable('ad') . ' SET view = 2, amount=466 WHERE ad_id = 36');

    И не делайте себе мозги.
    Вы и сейчас-то смотрите на этот запрос как баран на новые ворота. А через месяц и вовсе перестанете понимать, что имели в виду.
    Ответ написан
    Комментировать
  • Заполнить не существующими датами из бд в графике apexcharts?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Принцип заполнения пустых дат всегда один и тот же:
    • получаем данные запроса в массив, который индексируем датой
    • создаем итоговый массив в цикле, подставляя значение из БД, если оно существует


    // получаем
    $sql = 'SELECT DATE(datetime) `date`, count(id) `count` FROM sells WHERE id != 1 GROUP BY DATE(datetime)';
    $result = $conn->query($sql);
    $sales = [];
    // индексируем
    while($row = mysqli_fetch_array($result)) {
        $sales[$row['date']] = $row['count'];
    }
    // создаем нужный интервал
    $begin = new DateTime($date_begin);
    $end = new DateTime($date_end);
    $interval = DateInterval::createFromDateString('1 day');
    $period = new DatePeriod($begin, $interval, $end);
    // заполняем итоговый массив
    $result = [];
    foreach ($period as $day) {
        $date = $day->format("Y-m-d");
        $result[$date] = $sales[$date] ?? 0;
    }
    // выводим
    echo "var rows=".json_encode(array_keys($result));
    echo "var values=".json_encode(array_values($result));


    Даты начала и конца обычно задаются заранее. Но если их надо получить из результатов запроса, то
    $date_begin = array_key_first($sales);
    $date_end = array_key_last($sales);
    Ответ написан
  • Функция str_replace() не работает?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В строке не должно быть никакого"
    Надо взять железную линейку, и надавать по рукам тому, кто писал этот код.
    После этого убрать из кода все вызовы функции htmlscpacialchars, все filter_var c идиотским FILTER_SANITIZE_STRING и вообще никак не портить входящие данные
    И после этого спокойно удалять из строки обычную двойную кавычку.

    А выводить любые данные через нормальный шаблонизатор.
    Ответ написан
    1 комментарий
  • Интеграция Telegram с CRM системой. Что посоветуете?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Классический вопрос "как на... обмануть систему".
    Если хотите нормальный сервис - то никак. Не надо. Никого. Обманывать.
    И никогда не строить на этом архитектуру.

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

    А вот если речь о том, чтобы сотрудники (или скорее всего CRM) сами писали пользователям, то через бота. А заказчик пусть спускается из мира грёз на землю.
    Ответ написан
    Комментировать
  • Как скрестить ElasticSearch и MySQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос в заголовке абсолютно нормальный
    Эластик в связке с Mysql используется сплошь и рядом.
    Элементарно по той простой причине, что возможности как фасетного, так и полнотекстового поиска в Mysql оставляют желать лучшего. Да и живым поиском грузить основную БД тоже слишком затратно.

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

    Дружат их элементарно, к примеру на РНР пишется простой индексатор, который по крону читает данные из Mysql и обновляет индексы в Эластике.
    https://www.elastic.co/guide/en/elasticsearch/clie...

    А то что в теле вопроса написан бред - ну так это автор явно имел в виду нормальный вариант, но недоспал/перебрал и перепутал направление.
    Ответ написан
  • Как получить доступ к БД mySQL через терминал?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы соединиться с удаленным сервером, Mysql устанавливать не надо.
    Через терминал сначала соединяются с терминалом удаленного сервера по SSH. В общем случае это выглядит так
    ssh user@host.com

    Дальше вводите пароль, и если всё ок, то вы в своем терминале работаете с сервером хостинга.
    и уже на нем пишете своё
    mysql -u -p -h -P

    Но через терминал работать хотя и полезно уметь, но иногда не очень наглядно.
    Лучше поставить какую-нибудь графическую утилиту - DataGrip, Dbeaver, что-то из этой серии
    А для работы с удалённой БД можно будет поднять SSH туннель

    ssh -N -f -L 3366:127.0.0.1:3306 user@host.com
    вводите пароль и готово! можете соединяться с удалённым сервером хоть в консоли, хоть из любой программы. Только порт надо указывать 3366.
    Ответ написан
    3 комментария
  • Что сработает быстрее, что лучше использовать?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Хороший вопрос, хотя и задавался миллион раз.

    Когда у вас выполняется запрос
    SELECT * FROM users WHERE DATE(created_at) = '2024-04-14'
    то СУБД должна пройти весь индекс до конца, получить каждое значение created_at, применить к нему функцию, сравнить с переданным значением, и добавить строку в результат запроса.

    Когда у вас выполняется запрос
    SELECT * FROM users WHERE created_at BETWEEN '2024-04-14 00:00:00' AND '2024-04-14 23:59:59'

    То СУБД находит бинарным поиском первое нужное значение, потом бежит по заранее отсортированному индексу и возвращает все значения до последнего, подходящего под второе условие.
    Ответ написан
    4 комментария
  • Почему в консоли вылетатет ошибка unexpected character at line 1 column 1 of the JSON data, когда поля формы не заполнены?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    1. Ошибки взаимодействия с сервером надо смотреть не в консольке, а во вкладке Сеть. Там в подвкладке Response или как она там в переводе называется, вы увидите ответ сервера.

    2. Как правильно написал в комментариях ProjectSoft, проблема в том, что вы определяете переменные только при успешном прохождении проверки. Но если данных нет, то ни переменной $name, ни $phone, ни $message в коде не существует. И в итоге РНР вам законно выводит ошибку при попытке обратиться к этим переменным.
    По итогам проверки переменная должна быть объявлена в любом случае. Это можно сделать либо с помощью конструкции else, либо как показано в примере ProjectSoft, с помощью тернарного оператора.
    Переменную $OK можно определить как результат логического выражения, без всяких условий
    $OK = $name and $phon and $message;
    Но сама по себе она не имеет смысла. У вас результатом кода $name and $phon and $message УЖЕ является логическое выражение, которое вы УЖЕ можете подставить в условие. И зачем это делать с пересадкой - непонятно.

    3. При этом надо понимать, что и isset, и empty в данном случае это подавление ошибок. И без нужды их лучше не применять. А просто написать
    $name = $_POST['name'];
    $phone = $_POST['phone'];
    $message = $_POST['message'];

    Тогда РНР сможет сообщить и об ошибках при составлении формы.

    Но чтобы эти ошибки зря не лезли при запросе файла, лучше весь код целиком заключить в проверку типа
    if ($_SERVER['REQUEST_METHOD'] === 'POST')

    Как вариант - проверять каждую переменную на существование и пустоту отдельно, и выдавать соответствующие ошибки, типа "Поле name не отправлено", "Поле name не заполнено", и т.д.
    Ответ написан
  • Почему не выводит первую строку в select?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Потому что она зачем-то была получена до начала вывода.

    Откуда вы все берете учебники с таким дебильным кодом? Тут все делается в три строчки
    $result = $mysql->query("SELECT * FROM `postavshik`");
    while ($row = $result->fetch_assoc()) {
        echo  "<option>" . htmlspecialchars($row['Name_pred']). "</option>\n";
    }

    И возьмите нормальное руководство.
    Ответ написан
    1 комментарий
  • Можно ли создать базу данных на одной таблице?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    "Унифицированная база данных, в которую бы поместилось все-все бизнес-сущности проекта" где под базой данных имеется в виду таблица - это какой-то нелепый бред. И с какого боку тут EAV - совершенно непонятно.

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если запрос выполняется без ошибок но не возвращает ни одной строки, это значит что в БД отсутствуют данные, подходящие под указанные в запросе условия.
    Ответ написан
    Комментировать
  • Почему данные входящего запроса не сохраняются в файл?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если РНР не может записать информацию в файл, он всегда сообщает - по какой причине.
    Вам надо всего лишь посмотреть сообщение об ошибке. На нормально настроенном сервере ошибки обычно пишутся в лог файл.
    (Скорее всего файл создан одним пользователем, а скрипт запускается другим, а права не выставлены. Но гадать в любом случае бессмысленно, надо прочитать сообщение об ошибке).

    Как вариант, что-то ещё дергает этот скрипт. Для надёжности, я бы добавил FILE_APPEND в оба вызова.
    Ответ написан
    Комментировать
  • Как при возникновения ошибки php показывать своё сообщение, вместо стандартного?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Во-первых, данная ошибка - это проблема валидации. И в этом конкретном примере никакие ошибки РНР перехватывать не надо. А надо проверить значение (и существование ) $_GET['val1'] и $_GET['val2'] и вернуть клиенту соответствующие ошибки.

    В целом же ошибки РНР перехватываются функциями set_exception_handler() для исключений, set_error_handler() для нефатальных ошибок и register_shutdown_function() для фатальных. Пример можно посмотреть здесь https://phpdelusions.net/articles/error_reporting

    Важно при этом помнить, что сам текст ошибки клиенту не показывается, а доводится только сам факт ошибки, "Что-то пошло не так, зайдите позже".
    Ответ написан
    Комментировать