Задать вопрос
Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
Ответы пользователя по тегу PHP
  • Безопасная загрузка картинок, как?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Все очень плохо.

    Самое главное - черный список никогда не является надёжной защитой. Защищает только белый список.

    Плюс файл надо в обязательном порядке переименовывать.
    Ответ написан
  • Как запретить прямое обращение к файлу?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Во-первых, зачем вообще запрещать "прямой вызов"?
    Это какие-то страхи из 90-х.

    Во-вторых, если уж этот мусор в файле имеется, то почему в коде не определена константа TEST?
    Ответ написан
    2 комментария
  • Что эффективнее - один большой php файл или много маленьких в шаблонах?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Что будет быстрее обрабатываться,

    Одинаково
    К "серверной оптимизации" такая ерунда не имеет ни малейшего отношения.

    что правильнее

    Зависит от конкретной задачи

    Баннеры, на мой взгляд, должны показываться отдельным сервисом, а не прописываться прямо в шаблоне.
    Вносить правки в репозиторий, чтобы поменять баннер на странице - это дикость
    Ответ написан
    Комментировать
  • PHP: Как элементы одно массива записать в другой, но с ключом "key"?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $array2 = ["key" => $array1];
    Ответ написан
    Комментировать
  • Как взять из MySql колонки из конца (!) таблицы, с лимитом 30, и рассортировать их в по увеличению id(34,35,36)?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Доработаем вариант Melkij чтобы было меньше писанины
    select * from (
    select fields,... from tablename order by field desc limit 30
    ) as subquery
    order by field
    Ответ написан
    Комментировать
  • Нужно ли передавать POST, GET, SESSION в класс?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Всегда будут работать корректно, но надо передавать в виде сервиса,потому что глобальные переменные - это зло.
    Для примера можно посмотреть на Symfony HTTP foundation
    Ответ написан
    Комментировать
  • Как вывести данные из БД с ключами?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Разумеется, такой режим есть. И разумеется, он совершенно неизвестен тем, кто учил похапе по видеокурсам.
    PDO умеет возвращать данные в десятках разных форматов, и в частности индексировать выборку первым полем указанным в запросе
    $data = $stmt->fetchAll(PDO::FETCH_UNIQUE);
    В случае, если нам нужен словарь то для этого есть режим, который возвращает не вложенные массивы, а одномерный массив, который состоит из пар ключ-значение
    $data = $pdo->query("SELECT id, name FROM table")fetchAll(PDO::FETCH_KEY_PAIR);
    Ответ написан
    Комментировать
  • Как правильно сделать выборку данных с помощью раскрывающегося списка?

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

    1. Вместо идиотской mysqli используем нормальный PDO. Берем отсюда код соединения с БД и записываем его в файл db.php
    2. Убеждаемся, что можем видеть все ошибки, которые возникают в коде
    3. Собственно ответ на вопрос "как подставлять словие в запрос" заключается в 3 строчках
    $sql = "SELECT id, city_name FROM city where id = ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$_GET['sch']]);

    4. Переписываем наш многострадальный код

    <?php
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    include 'db.php';
    $data = $pdo->query("SELECT id FROM city LIMIT 10")->fetchAll();
    ?>
    <form>
      <div class="form-group">
        <label for="search_word">Поиск</label>
        <select class="form-control" name="sch">
        <?php foreach ($data as $row): ?>
            <option><?=$row['id']?></option>
        <?php endforeach ?>
        </select>
      </div>
      <input type="submit" class="btn btn-default">Поиск</button>
    </form>
    <?php
    if (!isset($_GET['sch'])) {
        die("Выберите значение");
    }
    $sql = "SELECT id, city_name FROM city where id = ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$_GET['sch']]);
    $data = $stmt->fetchAll();
    ?>
    <?php if ($data) : ?>
        <table class="table table-striped"><tr><th>ID</th><th>Город</th></tr>
        <?php foreach ($data as $row): ?>
            <tr><td><?=$row["id"]?></td><td><?=$row["city_name"]?></td></tr>
        <?php endforeach ?>
       </table>
    <?php else : ?>
        echo "0 results";
    <?php endif ?>


    Возникающие на экране сообщения об ошибках пытаемся перевести и нагуглить самостоятельно. Только в самых беднадежных случаях идем на тостер и просим растолковать
    Ответ написан
  • Почему не доходят данные к БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Код подключения к БД
    $host = '127.0.0.1';
    $db   = 'add';
    $user = 'root';
    $pass = 'qwerty';
    $charset = 'utf8mb4';
    
    $options = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    try {
         $pdo = new PDO($dsn, $user, $pass, $options);
    } catch (\PDOException $e) {
         throw new \PDOException($e->getMessage(), (int)$e->getCode());
    }

    Код в основном файле
    if(isset($_POST['add']))
    {
        $fm = trim($_POST['fm']);
        $name = trim($_POST['name']);
        $ot = trim($_POST['ot']);
        $phone = trim($_POST['phone']);
        $adres = trim($_POST['adres']);
        
        $stmt = $pdo->prepare("INSERT INTO clinika (fm, name, ot, phone, adres) VALUES (?,?,?,?,?)");
        $stmt->execute([$fm, $name, $ot, $phone, $adres]);
        echo "Новость уcпешно добавлена!";
    }

    Если надо добавить пару полей, то надо соответственно и модифицировать запрос
    Ответ написан
  • Как добавить к get параметру текст?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    А ведь прав был тот чувак, у кого в инфе написано, что скоро на тостере начнут спрашивать, сколько будет 2х2.
    Не прошло и двух дней
    Ответ написан
    1 комментарий
  • Как сохранить один checkbox в session?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    А теперь правильный ответ

    Чтобы решить проблему автора, надо просто положить значение в сессию в любом случае, независимо от того, есть у нас чекбокс, или нет.
    $_SESSION['test'] = isset($_POST['test']);
    Но как правильно заметил Arman в комментариях, иногда форму настраивают так, что значение приходит всегда. так что универсальным решением будет такое
    $_SESSION['test'] = !empty($_POST['test']);
    Ответ написан
    4 комментария
  • Как составить массив дат?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    PHP уже больше 10 лет как предоставляет очень удобные методы работы с датой, которые неизвестны авторам видео курсов и - как следствие - подавляющему большинству пользователей.
    Например, есть подходящий для данного случай класс DatePeriod
    $begin = new DateTime( '2019-01-10' );
    $end = new DateTime( '2019-02-10'); 
    $end = $end->modify( '+1 day' ); // если надо включительно
    $interval = new DateInterval('P1D');
    $daterange = new DatePeriod($begin, $interval ,$end);
    foreach($daterange as $date){
        echo $date->format("Y-m-d") . "\n";
    }
    Ответ написан
    Комментировать
  • Как объединить массивы в многомерный массив?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если выборка делается из БД, то с помощью PDO можно сразу группировать по определенному полю
    $data = $pdo->query("SELECT sector, table.* FROM table")->fetchAll(PDO::FETCH_GROUP);
    Ответ написан
    1 комментарий
  • Подготовленные запросы, как сократить код?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Можно написать простую обертку для mysqli, которая будет брать на себя рутинные операции, если надо выполнить только один запрос.
    $sql = "SELECT * FROM `forum_topic` WHERE id = ?";
    $topic = mysqli($base, $sql, [$id])->get_result()->fetch_assoc();
    $sql = "SELECT * FROM `profile` WHERE id = ?";
    $profile = mysqli($base, $sql, [$topic['uid']])->get_result()->fetch_assoc();

    Плюс, как водится, второй запрос здесь не нужен вообще, поскольку такие вещи делаются джойнами
    $sql = "SELECT * FROM forum_topic, t profile p WHERE p.id=t.uid AND t.id = ?";
    $topic = mysqli($base, $sql, [$id])->get_result()->fetch_assoc();

    И в топике будет вся информация из профиля.

    Если не нравится постоянно писать ->get_result()->fetch_assoc(), то можно эти операции записать в еще одну функцию
    function mysqli_assoc($mysqli, $sql, $params) {
        return mysqli($mysqli, $sql, $params)->get_result()->fetch_assoc();
    }

    А когда надоест разбираться с зоопарком из функций, то можно будет сделать свой класс, в котором собрать эту функциональность.

    Только непонятно, почему в вопросе стоит тег PDO.
    Ответ написан
    Комментировать
  • Как преобразовать такую строку в массив?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вот и выросло поколение, которое не знает про волшебный функционал PHP serialize() / unserialize()...
    Ну, это даже и к лучшему.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ответ простой: не надо хранить корзину в сессии. Ей там нечего делать.
    Корзину надо хранить в базе данных. Пользователя идентифицировать по куке.
    Соответственно, проблема "получить данные всех сессий" больше не существует.
    Проблема "найти все брошенные корзины" сводится к примитивному запросу в БД.
    Ответ написан
    Комментировать
  • Подготовленный запрос, как использовать в цикле?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $stmt = $base->prepare("SELECT * FROM `chat` ORDER BY id LIMIT 5");
    $stmt->execute();
    $data = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
    
    foreach ($data as $row) {
        echo $row['das'];
    }
    Ответ написан
    Комментировать
  • Как скопировать таблицу из одной базы в другую на другом сервере?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Опять это "пробывал". Ты не в конфетном магазине, чтобы пробовать. Есть инструкция, по ней надо делать. А не "пробовать" всякую дичь от балды.
    Плюс, если не работает, то надо читать сообщения об ошибках. В них - ты не поверишь - написано, почему у тебя не работает. Если не можешь осилить самостоятельно, что написано в сообщении об ошибке - несешь старательно на Тостер, ничего не потеряв по дороге. Здесь тебе его растолкуют.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    База данных не настолько тупая, как многие думают.
    Данные в нужном формате можно получить сразу из запроса. Для даты можно использовать date_format(date, '%d.%m%Y') в запросе.
    А вот вот цену я бы настоятельно не рекомендовал преобразовывать в какой-бы то ни было другой формат. Могут быть неприятности.
    Ответ написан
    Комментировать
  • Как реализовать постраничную навигацию с LEFT JOIN?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Постраничная навигация с LEFT JOIN ничем не отличается от навигации с любым другим запросом.

    Если запрос "встал колом", то его надо оптимизировать. Независимо от того, используется ли он для постраничной навигации, или нет. Начинать оптимизацию следует с выполнения запроса EXPLAIN
    Ответ написан
    Комментировать