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

    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 получены, то правильно будет повторно использовать переменную с таким же именем для следующего запроса.
    Ответ написан
    Комментировать
  • Почему PDO::execute не заменяет псевдопеременные в запросе?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Потому что не выключен режим эмуляции.

    Только фактически всё наоборот: при включенном режиме эмуляции PDO как раз таки подставляет данные в запрос, и в LIMIT будет ошибка. А при выключенном данные в запрос не подставляются, и следовательно никакой ошибки не будет.

    Судя по тому, что в вопросе нет сообщения об ошибке, при соединении вообще не указывается ни один нужный параметр. Как правильно соединяться с PDO
    При указанных настройках запрос с лимитом будет работать.

    Идея с функцией query() отличная, только она не должна возвращать fetchAll(). Это все равно что добровольно отказаться от половины функциональности PDO!
    Функция должна возвращать стейтмент. Тогда ее можно будет использовать для любых запросов ,и получать данные в любых из дюжины форматов, поддерживаемых PDO, а не только в виде тупого массива.

    Соответственно, функция должна делать return $query; а код будет таким
    $sql = 'SELECT * FROM vocabulary ORDER BY word_date DESC LIMIT :startLimit , :countLimit';
    $params = ['startLimit' => $_POST['slimit'], 'countLimit' => $_POST['limit']];
    $lines = $db->query($sql, $params)->fetchAll();
    var_dump($lines);
    Ответ написан
    Комментировать