Задать вопрос
  • Include не работает после переезда на другой хостинг?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    • include "https://сайт/include.php"; - это идиотизм, и не должно работать. и не будет. Можно сразу забыть и идти исправлять на нормальные пути. Будет гораздо быстрее чем ныть здесь.
      Можно попробовать заменить на include $_SERVER['DOCUMENT_ROOT']."/include.php"; если это свой сайт. Если чужой, то просто выкинуть эту строчку совсем. Ну или попробовать заменить на file_get_contents
    • include "include.php"; будут работать, если указать абсолютный путь. Хотя бы так,include __DIR__."/include.php";, но в некоторых случаях может не сработать
    • если инклюды "заработали" после добавления AddHandler application/x-httpd-php .php .html .shtml .htm в файл .htaccess, это значит, что не работали не инклюды, а не работал РНР в html файлах. Он как бы и не должен, но на этом кривом сайте видимо такое использовалось. В любом случае эта строчка никакого отношения к инклюдам не имеет.
    Ответ написан
  • Почему возникает SQLSTATE[HY000]: General error: 2014 при прямой вставке данных в MySQL таблицы через DBAL?

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

    Тем более что здесь нужно всего три запроса, а не 100500. Множественная вставка делается не так, а одним запросом. При этом, как нас учат в первом классе, запросы должны быть параметризованными а не вот это вот всё.
    Ответ написан
  • В чем ошибка SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Дополню предыдущий ответ правильным кодом, без вот этих всех бессмысленных телодвижений, которые понатыканы в исходном вопросе.
    $query = "UPDATE `users` SET `address`= ?,`phone_number`=?  WHERE email=?";
    $params = [
        $address,
        $phone_number,
        $email,
    ];
    $stmt = $pdo->prepare($query);
    $stmt->execute($params);

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

    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 'вывод содержимого';
    }
    Ответ написан
    Комментировать