• Как можно использовать результат запроса из другого файла?

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

    Главный файл mainpage.php в котором использую объект XMLHttpRequest

    Не в файле mainpage.php, а в браузере. Никакого РНР и тем более его переменных там нет.

    мне нужно в файле mainpage.php повторно использовать результат запроса

    Не в файле mainpage.php, а в браузере. Никакого РНР и тем более его переменных там нет.
    А переменная яваскрипт с результатом запроса - есть. Вот её и используйте.

    Один global.php, в котором описана переменная: global $all_search;.

    А это, как я понимаю, просто бессмысленный файл, который можно смело удалить. Ну или только эту переменную, если там есть что-то ещё.
    Ответ написан
    Комментировать
  • Как взять каждое значение массива mysqli_fetch_array и занести каждое значение в строку таблицы mySQL?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    $id = $_SESSION['id'];
    $sql = "INSERT INTO zakaz (iduser,idkat) SELECT iduser, idkat FROM corzina WHERE iduser=?";
    $stmt = $bd->prepare($sql);
    $stmt->bind_param('i', $id); 
    $stmt->execute($res);

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Непонятно для чего оно вообще может быть нужно.
    Для продакшена - очевидно нет.
    Для профессиональной разработки - докер контейнер с рабочим окружением.
    Для того чтобы делать примеры из видеокурсов, достаточно запустить php -S localhost:80
    Ответ написан
  • Как решить проблему "Невозможно подключиться к серверу MySQL"?

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

    То есть вопрос "как подключиться" становится немного бессмысленным: тут даже Штирлиц сообразит, что если базы нет, то подключиться к ней будет проблематично.
    И куда логичнее будет спросить "что делать, если mysql умерла?" Что, согласитесь, представляет собой совсем другой вопрос.

    Со стандартным, впрочем, ответом: берете сообщение об ошибке и гуглите его. Судя по количеству результатов, вы не единственная жертва любителей флажков. Читайте, пробуйте предложенное. Гуглите другие слова из логов. Перейдите по ссылке, которая в логе. Задайте другой вопрос в конце концов, в котором опишите актуальную проблему, а не симптом широкого профиля.

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

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

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

    CURLOPT_POSTFIELDS=> http_build_query($postdata),

    А если не поможет - то гуглить отправку джейсона курлом
    Ответ написан
  • Как решить проблему PDOStatement::execute(): SQLSTATE[HY093]?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Камрад alexalexes мыслит в правильном направлении, но как все новички, пишет очень много ненужного кода.
    Вот более простое решение, которое и можно рекомендовать в этом случае:
    $product_list = [30, 32, 38];
    // получаем строку вида ?,?,? по количеству эл-тов в массиве
    $placeholder_string = str_repeat('?,', count($product_list) - 1) . '?'; 
    $sql = "SELECT * FROM `products` WHERE `productId` in ($placeholder_string)";
    $query = $db->prepare($sql);
    $query->execute($product_list); 
    $products_data = $query->fetchAll(\PDO::FETCH_ASSOC);
    Ответ написан
    Комментировать
  • Как решить ошибку Warning: mysqli_connect(): (HY000/2002): Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Проблема в идиотских руководствах из прошлого века.
    Ну и в том, что вы не понимаете даже их. И воображаете, будто $_GET['q'] - это некая волшебная переменная, которая содержит "URI".
    Но содержит она его только если использовать .htaccess, причем с идиотской инструкцией, которая отправляет в РНР те данные, которые в нем и так есть.
    В современном же мире наличие как файлика .htaccess, так и идиотских инструкций в нём, совсем не гарантировано.
    И получать запрошенный URI надо нормальным способом, о котором написал AUser0 - через специально предназначенную для этого переменную.
    if($conn->connect_error) {
        die("Ошибка соединения: " . $conn->connect_error);
    }

    - это еще один пример бессмысленного говнокода из прошлого века.

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Для начала надо познакомиться с какими-то типами полей кроме TEXT
    Например, вместо ТРЕХ колонок day, date и time надо сделать ОДНУ, типа datetime.

    "объединить таблицы с одинаковыми параметрами в одну таблицу, добавив флаг для их различия" - это правильное решение. То есть вместо двух таблиц с логами должна быть одна, вида
    user_id INT (сюда пишется id из таблицы юзеров)
    log_type_id INT (сюда пишется id из таблицы с описаниями логов - название там и прочее)
    host VARCHAR
    dtm DATETIME
    session VARCHAR
    Ответ написан
    Комментировать
  • Как автоматически подставлять значение в value?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Начинающие очень часто делают глупости. И записывать в базе данных количество строк в ней - одна из них.
    Точно так же, как вы сейчас получаете количество через SELECT COUNT(*), это можно будет сделать в любой момент времени потом. И ничего никуда подставлять не надо.

    Плюс $table_name выглядит еще одной глупостью. Имя таблицы не должно быть динамическим.
    Ответ написан
    9 комментариев
  • Php pdo почему возвращает false?

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

    Вместо этого сарая из травы и палок надо написать
    <?php
    $host = '127.0.0.1';
    $dbname = 'bdKIZ';
    $username = 'root';
    $pass = '';
    $dsn = "mysql:host=$host;dbname=$dbname;charset=utf8mb4";
    
    ini_set('display_errors', 1);
    error_reporting(E_ALL);
    
    $pdo = new PDO($dsn, $username, $pass);
    $pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    
    $sql = "SELECT * FROM `Detail`";
    $stmt = pdo->query($sql);
    var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));


    И после этого выполнить код и ознакомиться с сообщением об ошибке.
    Ответ написан
    1 комментарий
  • Как ускорить поиск по бд MySQL?

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


    Дело не в большом количестве, а в том, сколько уходит времени на поиск одной. Если у колонки нет индекса, то поиск любого количества будет медленным. А если есть индекс, то будет быстрым.

    Плюс непонятно, с чего вы решили, что проблема именно в in. Если у вас сто тыщ товаров, и все их надо отсортировать или сгруппировать, то проблема вообще не в in. А в той самой сортировке или группировке. И надо подбирать составной индекс специально под них.

    Чтобы ускорить поиск по бд MySQL, надо не писать на тостер глубокомысленные умозаключения про три джойна и сто тыщ товаров, а выполнить команду EXPLAIN и начинать тупить в её вывод. или по крайней мере привести его в своем вопросе, чтобы он стал предметным.
    Ответ написан
    3 комментария
  • Связи в ООП, Агрегация в PHP как часто используется?

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

    Если вы посмотрите на пример реализации контроллера в Симфони например, то вы нигде не увидите что-то вроде
    public function process()
    {
        $request = new Request();
        $param = $request->get('name')
    }

    а только
    public function process(Request $request)
    {
        $param = $this->request->get('name')
    }


    Заметил, что в PHP если и используется связи между объектами(ассоциация), то только в виде композиции,

    А вот тут я реально удивился. Скорее это я бы у вас попросил "пример кода" в котором "вы заметили" композицию. Потому что в современном РНР коде её днем с огнём не найти - везде сплошная агрегация. Даже там, где по сути подошла бы и композиция. Давно ли вы видели в коде создание new Сlass внутри класса вместо использования $this->object? И если да - то мне страшно любопытно - где?

    Хотя нет, кажется я понял. Есть такие гении, которые действительно, вместо
    class User
    {
        public function __construct(Database $db)
        {
            $this->db = $db;
        }
    }

    пишут
    class User
    {
        protected $db;
        public function __construct()
        {
            $this->db = new Database();
        }
    }

    Но тут надо понимать, что это дети, которые вчера увидели редактор кода. Больше никто так не пишет.
    (Тут надо оговориться, что это не догма, и внедрение через параметры не обязательно. Вполне можно создать какой-то объект и на лету, но это случается гораздо реже, чем использование уже готового)

    редко бывает, когда создаётся самостоятельный класс, а потом он ещё и в другой класс попадает.

    А здесь вы вообще какую-то чушь написали. Если говорить про классы, то они вообще почти никогда не создаются кодом на лету. Классы пишет программист, и сохраняет в коде программы. Которая потом выполняется, и создает из этих классов объекты.
    А если вы имели в виду объекты, то их создаётся миллион, и все они "попадают" в другие объекты. Даже при обработке НТТР запроса
    Ответ написан
    9 комментариев
  • Функция SUM в sql запросе не работает почему?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Магия:
    $sum = $bd->query("SELECT SUM(cent) FROM corzina")->fetch_row()[0];
    echo "$sum ₽\n";

    Без всяких алиасов и while.
    Ответ написан
    Комментировать
  • Здравствуйте! На хосте fornex php сервер не передает данные в БД, хотя на локалке все работало отлично. Как это исправить?

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

    error_reporting(E_ALL);

    В-вторых, если для работы с БД используется mysqli, то не лишне добавить настройку ошибок и для неё.
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

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

    ini_set('display_errors',1);

    На боевом - наоборот, выключаем вывод на экран и включаем вывод в лог
    ini_set('display_errors', 0);
    ini_set('log_errors', 1);

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Надо один раз распарсить строку,
    $section = explode("/",trim($_SERVER['REQUEST_URI'],"/"))[0] ?: 'index';

    и потом уже использовать полученные из неё данные
    $other_page = in_array($section, ['news','info']);
    if (!$other_page) {
        echo 'вывод содержимого';
    } else {
        echo 'вывод содержимого';
    }
    Ответ написан
    Комментировать
  • Ошибка: 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 ошибка, а не причина почему она вызвана.

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