• 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 ошибка, а не причина почему она вызвана.

    Правило: даже если вы не понимаете, что написано в сообщении об ошибке, или думаете, что оно бессмысленное, все равно его надо скопировать его в свой вопрос целиком.
    Ответ написан
    Комментировать
  • Не работает часть скрипта 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');

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