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

    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пешно добавлена!";
    }

    Если надо добавить пару полей, то надо соответственно и модифицировать запрос
    Ответ написан
  • Стоит ли использовать October CMS в масштабируемых проектах?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    October CMS базируется на Laravel, так что вопрос это тавтология - использовать ли Laravel, или лучше использовать Laravel.
    Ответ написан
    1 комментарий
  • Как добавить к 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";
    }
    Ответ написан
    Комментировать
  • Как быстро выводить большие таблицы из БД объеденные join?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    индекс на `visitors`.`key`
    индекс на date_auth
    Ответ написан
    Комментировать
  • Как объединить массивы в многомерный массив?

    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.
    Ответ написан
    Комментировать
  • Как вывести ID из первой таблицы где он отсутствует в второй таблице?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    вывести из таблицы где нет значений второй таблицы

    Это задача для LEFT JOIN. Общий принцип такой
    SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL

    Соответственно, эту краковсую колбасу из вопроса надо переписать примерно так
    SELECT id FROM users u LEFT JOIN user_dating ud ON ud.user_id=u.id
      WHERE ud.user_id IS NULL 
        AND u.photo='1' and u.gender='1' 
      ORDER BY rand()

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

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

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

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

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

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

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

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

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

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

    Я попробую ещё раз: как правильно соединяться с mysqli

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

    Для справки. close никакого отношения к проблеме не имеет. Можно использовать, можно не использовать. Фактически, в большинстве случаев close писать нет смысла.
    И засорять код многочисленными $stmt, $stmt1, $stmt100500 тоже не имеет смысла. Если все данные из $stmt получены, то правильно будет повторно использовать переменную с таким же именем для следующего запроса.
    Ответ написан
    Комментировать