• Интеграция 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

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

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

    Если она содержит значение null, то просто вставить через подготовленный запрос, так же, как это надо делать всегда,
    выполняя запросы с переменными
    $sql = NSERT INTO `table` (`id`, `value_1`, `value_2`) VALUES (?,?,?)";
    $connection->prepare($sql)->execute([null,$var1, $var2]);

    (если у вас устаревшая версия РНР, то так)
    $sql = NSERT INTO `table` (`id`, `value_1`, `value_2`) VALUES (null,?,?)";
    $stmt = $connection->prepare($sql);
    $stmt->bind_param("ss",$var1, $var2)
    $stmt->execute();


    Если же переменная содержит пустую строку, то сначала присвоить ей null, например
    $var1 = ($var1 !== '') ? $var1 : null;
    И потом точно так же подставить в запрос
    Ответ написан
    Комментировать
  • Как кучу файлов с дампами таблиц соединить в один?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Эх, молодёжь...
    copy *.sql fulldump.sql
    Ещё во времена MS-DOS можно было
    Ответ написан
    1 комментарий
  • Есть ли готовая среда для работы с базой PostgreSQL через Веб?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ну стандартный выбор - это пхпе. Форма в HTML, обрабончик вида
    <?php
    $dsn = "pgsql:host=host;port=5432;dbname=db;";
    $pdo = new PDO($dsn, 'user', 'password', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
    
    $sql = "INSERT INTO data (name, quantity) VALUES (?,?)";
    $pdo->prepare($sql)->execute([$_POST['name'], $_POST['quantity']]);

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ответ написан
    Комментировать
  • Как с помощью php отдать react?

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

    jQuery уже в прошлом

    это правда

    его теснят фреймворки типа react

    а это уже чушь собачья
    jQuery - это был костыль, позволявший выполнять определенные задачи, которые было невозможно или слишком сложно выполнить на чистом JavaScript. Но уже больше 10 лет нужда в этом костыле полностью отпала
    К фреймворкам типа React этот костыль не имеет никакого отношения вообще.
    Для замены jQuery вам нужно просто выучить Яваскрипт.

    Реакт же - это, условно говоря, способ построения приложения. Его можно учить, а можно не учить. Вы можете продолжать использовать обычный подход, когда HTML рендерится на сервере в ответ на каждый запрос.

    При использовании реакта, сначала загружаются его статические файлы. обычно это делается через отдельный веб-сервер, на котором крутится приложение, написанное на js. и эту вашу проверку можно делать там.
    но в принципе вы можете отдавать их и РНР скриптом. HTML отдавать через РНР умеете? Ну вот и отдавайте.

    Но повторюсь, это только если вам действительно нужен реакт. А для замены jquery он не нужен.

    404й редирект

    для начала, такой вещи, как "404й редирект" в природе не существует.
    Бывает либо редирект (коды ответа 3хх), либо 404. Два НТТР статуса вы никогда не отдадите.

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

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

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

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

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

    файл init.php
    <?php
    $conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8mb4', DB_USER, DB_PASSWORD);  
    $conn -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 
    
    set_exception_handler(function ($e)
    {
        http_response_code(500);
        error_log($e);
        echo json_encode([
                'code' => 'error',
                'message' => 'Internal server error'
        ]);
    });

    файл с кодом
    <?php
    // Подключаемся к базе данных
    require 'init.php';
    
    // Получаем данные
    $list = get_list($conn);
    
    echo json_encode([
        'code' => 'success',
        'data' => $list
    ]);


    Без всей этой кропотливой возни и самоповторов.
    Отсутствие данных ошибкой не является. В JS можно проверить массив data и вывести сообщение, что он пустой. Никакой специальный код для этого передавать не нужно.
    А настоящие ошибки надо обрабатывать единообразно, в одном месте. А не писать обработку после каждой строчки, причем каждый раз по-разному.
    Ответ написан
    3 комментария
  • Почему возникает ошибка Maximum execution time exceeded?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Потому что долгоиграющие задачи надо выполнять не через браузер, а в консоли.
    Либо ручками, либо по крону (ну или через очереди, но этот вариант явно не соответствует уровню вопроса).
    Ответ написан
    2 комментария
  • Почему не записывает в бд?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Не очень понятно, что имеется в виду под "подключением", но будем считать что речь про добавление данных в БД. Это может присходить по трем причинам:
    1. Код добавления вообще не вызывался.
    2. При добавлении произошла ошибка.
    3. Данные добавились в одну базу, а результат смотрим в другой.

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

    <?php
    # Настройка ошибок
    # Для локального сервера
    ini_set('display_errors', 1);
    # Всегда
    error_reporting(E_ALL);
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    Добавив этот код, надо запустить свой скрипт еще раз и смотреть, ошибки, которые он выведет.

    Плюс обязательно прочесть статью https://habr.com/ru/articles/662523/
    Ответ написан
    5 комментариев
  • Где лучше всего презентовать свою CMS?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Где лучше всего презентовать свою CMS?


    Как уже многие отметили - на гитхаб

    Куда ее можно выложить, чтобы принести пользу миру?)


    Как уже многие отметили - миру еще одна CMS вряд ли поможет, но вы вполне можете помочь самой себе, использовав этот код в портфолио. То есть во-первых, выложив на гитхаб, а во-вторых, повесить онлайн с демо-доступом (например только на чтение).

    На гитхаб боюсь - тапками закидают за говнокод ))))


    Как правильно заметил Дмитрий, если закидают, то тут только радоваться надо, и пилить фиксы по замечаниям. Но тут проблема будет скорее в том, что тапкозакидатели сначала должны как-то узнать о существовании репозитория. А с этим как раз проблема, поскольку сама по себе выкладка кода не привлечет вообще никого (кроме подписчиков вашего аккаунта на гитхабе, разумеется, если они есть).

    И тут надо отдельно думать, как тапкозакидателей известить. Можно попробовать написать пост на Хабре, "Руководство для новичков, пишем свою CMS!" Статью, конечно, люто заминусуют, но и фидбек тоже будет.
    Можно попробовать написать сюда на Тостер. В последнее время модераторы вроде перестали совсем уж тупо вахтёрить, и вполне возможно что пост проживет достаточно, чтобы собрать фидбек
    Ответ написан
    Комментировать
  • Почему у меня неправильно определяется IP пользователя?

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

    Сначала надо задать себе вопрос, а какое вообще отношение имеет Ipconfig к адресу клиента. И после долгих мучительных размышлений вдруг сообразить, что все три адреса совпадают, когда разрабатываешь сайт на уютном домашнем компике, а при размещении у провайдера адрес в Ipconfig никогда не будет совпадать, поскольку внезапно там будет будет адрес сервера, а не клиента

    После этого надо посмотреть на сам адрес. В котором, скорее всего, тоже будет адрес из приватной сети.
    И нелепые фантазии про чебурнет вдруг превратятся в провайдера, который поставил нормальный веб-сервер проксировать запросы к ламерским сайтам хомячков.
    После этого выяснить у провайдера, в каком именно НТТР заголовке передается исходный IP клиента, и использовать только его, а не перебирать наугад все возможные. Причем настроить на уровне веб-сервера (mod_remoteip / ngx_http_realip_module)
    Ответ написан
    Комментировать