Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
  • Как исправить ошибку Number of variables doesn't match number of parameters in prepared statement?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Идея прекрасная, это кстати хороший индикатор: если у тебя не возникает мысли написать подобную функцию - это значит что ты не программист.
    Но вот реализация конечно хромает на все восемь ног.

    Вот как правильно писать функуцию-хелпер для подготовленных запросов

    что у тебя неверно?
    1. цикл for - это же ужас. как у тебя пальцы не болят выписывать все эти точечки-запяточечки? неужели не проще написать foreach?
    2. bind_param может вызываться только 1 раз
    3. функция вообще-то должна что-то возвращать.

    Только ни в коем случае не присваивай $stmt переменной класса. Класс для работы с БД обязан быть stateless.
    Ответ написан
  • Как сделать поиск как у Хабр QnA?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Начни с простого поиска введённой подстроки

    1. Выделяешь таблицы, по которым будешь искать
    2. Делаешь к ним запросы.
    3. К таблицам тегов и пользователей запрос только к одному полю, запрос к таблице вопросов по нескольким полям.

    $search = '%'.$_GET['q'].'%';
    $sql = "SELECT * FROM questions WHERE body LIKE ? OR title LIKE ?, LIMIT ?,?";
    $stmt->prepare($sql);
    $stmt->bind_param("ss", $search, $search, $limit, $offset);
    $stmt->execute();
    $rows = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
    Ответ написан
    Комментировать
  • Не получается записать данные в бд через драйвер PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну или так.
    Кучерявые аннотации расставишь сам
    class Database
    {
        public $pdo;
    
        public function __construct()
        {
            $options = [
                \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
                \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
                \PDO::ATTR_EMULATE_PREPARES   => false,
            ];
            $config = require_once 'config.php';
            $dsn = 'mysql:host='.$config['host'].';dbname='.$config['db'].';charset='.$config['charset'];
            $this->pdo = new \PDO($dsn, $config['username'], $config['password'], $options);
        }
    
        public function query($sql, $params)
        {
            $sth = $this->pdo->prepare($sql);
            $sth->execute($params);
            return $sth;
        }
    }

    Больше никаких методов в него не добавлять.
    Если вдруг зачешется добавить - спросить меня, я объясню почему это не нужно и как сделать правильно.

    После этого спокойно добавить запись в БД

    $db = new Database();
        $sql = "INSERT INTO `reviews`(`id`, `name`, `descriptions`, `url_image`, `rating`) VALUES(:name, :description, :url_image, :rating)";
        $db->query($sql, $reviewUser);
        echo "Запись успешно создана!";


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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    > Этот вопрос уже задавался, но у меня маленько другая ситуация.

    Ситуация та же самая, можно использовать любой ответ на этот вопрос

    > Не повлияет ли это на работу Гугл Аналитики, Пикселя Фейсбук и Метрики?

    Поскольку Гугл Аналитика, Пиксель Фейсбук и Метрика не расположжены на вашем сервере, то на их работу это не повлияет.
    Ответ написан
  • Как сделать редирект с интеравлом?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никогда не надо делать редирект с интервалом. Это глупо само по себе и неудобно для пользователя.
    Текст надо записать в сессию, сделать редирект, и показать во всплывающем сообщении. Гугли flash messages
    Ответ написан
    Комментировать
  • Почему не работает на сервере, а на логкалке работает?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Нажимаем в браузере кнопочку Фэ12, выбираем вкладку "Сеть", выбираем мышкой свой запрос и смотрим ЧТО вернул сервер вместо валидного джейсон.
    Если ошибку, то читаем что там написано
    Если ничего - то идем в логи сервера и читаем там.
    Ответ написан
  • Переписал код с книги, но выдает ошибку, в чем может быть проблема?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Тебе надо бросить всё, и учиться пользоваться поиском.
    Код к книжкам всегда есть в интернете. И к этой книжке тоже.
    И если уметь пользоваться поиском, то не придётся страдая и потея перепечатывать кривой код из книжки, теряя при этом скобки.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никак.
    При ошибке надо выдавать НТТР код ошибки, а не перенаправления.
    Если хочется показать определенную страницу, то её и показать, сразу на месте, без перенаправления.
    Сделать это можно при помощи обработчика ошибок
    Ответ написан
    Комментировать
  • Насколько защищена представленная конструкция php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Пароль никогда не следует хранить в открытом виде.
    Сгенерировать его через password_hash, вписать в скрипт и проверять через password_verify.
    Помимо прочего это еще и затруднит подбор перебором.

    Также код можно сильно сократить. Уже сто лет как в РНР есть сокращенный вариант проверки на isset, плюс можно сразу прервать выполнение, и не делать лишнюю вложенность
    <?php
    
    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';
    $hash = '$2y$10$e6RRGG8zFvsE6Bl7at/Vx./igFslOmnLo6poA6N1QoNWrgrkedHqO';
    
    if ($login !== 'login' || !password_verify($password, $hash)) {
        die('Неверный логин');
    }
    echo 'рендер кода страницы с формами для создания новых файлов на сервере';


    Закрывающий тег тоже не нужен
    Ответ написан
    Комментировать
  • Как найти продукт по цветам Mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не должно быть поля " котором пишу так black,yellow,green ".
    Должна быть отдельная таблица, в которой id записи и цвет
    тогда поиск делается простым джойном.
    Ответ написан
    4 комментария
  • На каком уровне нужно знать php, чтобы изучить wordpress?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Чтобы делать сайты на вордресс, вообще ничего знать не нужно. Надо только уметь кнопочки нажимать в админке.
    Ответ написан
    1 комментарий
  • Как исправить проблему с include php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Пути всегда должны быть абсолютными.

    Как к файлам, так и к http ресурсам.
    У тебя в шапке во всех урлах те же самые точечки. А должен быть абсолютный путь от корня сайта. То есть не
    <img src="../images/lame.jpg">, а <img src="/images/lame.jpg">
    , только чтобы это был реально существующий путь.

    И прочесть целком phpfaq.ru/newbie/paths
    Ответ написан
    Комментировать
  • Правильно ли вставлять include() в цикл 50x и чем это чревато?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    На хайлоаде за такое будут бить ногами.
    Для домашней странички с котиками, но потом ты сам проклянешь тот день, когда решил что 100500 маленьких файликов с шаблончиками - это хорошая идея.

    Так что если тебе совсем не жалко себя, то оставляй как есть, иначе сделай нормальный шаблон страницы, в котором уже будут все циклы.
    Ответ написан
    Комментировать
  • Как сохранить данные из формы в БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Судя по коду, у тебя здесь три вопроса.
    1. Как вывести форму?
    2. У меня есть форма, как передать ее содержимое на сервер аяксом и получить значения в РНР ?
    3. У меня есть несколько переменных в РНР, как их записать в БД
    Никогда больше так не делай.
    Первые два вопроса не имеют никакого отношения к третьему и засорять свой вопрос ими не надо.

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

    Код соединения никогда не пишем как есть, а инклюдим, чтобы не повторяться повторяться.
    Код соединения должен быть нормальный, со всеми необходимыми параметрами, и без дурацких echo. Берем здесь.
    Сами переменные в запрос не пихаем, а передаем отдельно

    <?php
    require 'mysqli.php';
    $query = "INSERT INTO message (name, email, phone, message) VALUES(?,?,?,?)";
    $stmt = $mysqli->prepare($query);
    $stmt->bind_param("ssss", $name, $email, $phone, $message);
    $stmt->execute();
    echo "Запись добавлена!";

    И все у тебя вставляется без проблем.
    Ответ написан
  • Как перейти на следующие число если оно дошло до конца массива и остался остаток который нужен для перехода на след число?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не очень понятно что нужно но как-то так

    $i = 0;
    while (true) {
        foreach ($array as $row) {
            if ($i++ == $max) {
                break 2;
            }
            // делаешь что тебе надо
        }
    }
    Ответ написан
  • Как отправить массив обьектов класса std на mysql с php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Судя по коду должно работать, за исключением того что за записывание таких массивов в бд надо бить по пальцам ногами в армейскиих ботинках, чтобы потом даже краешка мысли такой не возникало.

    > Подскажите пожалуйста что делать???

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Генеришь токен из random_bytes() (ну или UUID) и кладешь его в куки и в базу.
    Соответственно получаешь токен из куки и по базе находишь юзера.
    Если надо разлогинить, то генеришь новый токен.

    Использовать ли при этом сессию - вопрос вкуса, и в общем-то второстепенный. Можно использовать, можно не использовать
    Ответ написан
    Комментировать
  • Может ли запрос SELECT приводить к удалению данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    склоняюсь к мнению, что это глюк на самом сервере SQL.

    всякий раз, когда ты склоняешься к такому мнению, это значит что глюк 100% в твоем собственном коде.

    Учитывая весь этот адов винегрет, от которого глаза начинают кровоточить, удивительно что оно вообще хоть как-то работает.

    Но в целом, главная твоя проблема состоит в том, что ты уникальный идентификатор считаешь цыферкой. которую можно складыавть, умножать, делить. А это не так.
    Выкини всю эту арифметику, и всегда удаляй только ту строку, ид которой ты получил по ссылке.
    Ответ написан
    Комментировать
  • Как можно получить такой массив из MySQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    require_once ('../DropCases/MySql/Connection.php'); // подключаем скрипт
    
    $sql = " SELECT * FROM `doka 2`";
    $data = $mysqli->query($sql)->fetch_all(MYSQLI_ASSOC);
    echo json_encode($data);


    В Connection.php положить то что написао здесь
    Ответ написан
    Комментировать