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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никогда не хранить такие данные в формате json.
    Хранить в нормальном виде, выбирать обычным where
    Ответ написан
    Комментировать
  • PHP + PDO. Можно ли задать в запросе колонку переменной? Т.е. подготовить запрос с неизвестной заранее колонкой?

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

    // the list of allowed field names
    $allowed = ["name","surname","email"];
    
    // initialize an array with values:
    $params = [];
    
    // initialize a string with `fieldname` = :placeholder pairs
    $setStr = "";
    
    // loop over source data array
    foreach ($allowed as $key)
    {
        if (isset($_POST[$key]) && $key != "id")
        {
            $setStr .= "`$key` = :$key,";
            $params[$key] = $_POST[$key];
        }
    }
    $setStr = rtrim($setStr, ",");
    
    $params['id'] = $_POST['id'];
    $pdo->prepare("UPDATE users SET $setStr WHERE id = :id")->execute($params);
    Ответ написан
    1 комментарий
  • Как использовать GROUP BY с сохранением ID записей которые были сгруппированы?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    либо группировать в пхп, либо group_concat в запросе но тогда все равно придется делать explode при получении
    плюс надо помнить что по дефолту размер значения в group_concat равен 1024 байт
    Ответ написан
    3 комментария
  • Как определить на каком месте в рейтинге находиться пользователь?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Господи, совсем люди разучились SQL писать
    чуть что - переменные, оконные функции. процедуру еще напишите

    SELECT count(*)+1 FROM players WHERE score > (SELECT score FROM players WHERE id = ?)
    Ответ написан
  • PHP + SQL. Как удалить запись из бд?

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

    Плюс использовать в запросе массив $row не имеет ни малейшего смысла.
    Также я не уверен что word следует привязывать с типом i а не s
    Ну и разумеется все это делается одним запросом.

    if (isset($_POST['word'], $_POST['vocabulary'])){
        $word = $_POST['word'];
        $vocabulary = $_POST['vocabulary'];
    
        $query = "DELETE FROM `words` WHERE `word` =? and `vocabulary` = ?";
        $stmt = $connection->prepare($query);
        $stmt->bind_param("ss", $word, $vocabulary);
        $stmt->execute();
        if($stmt->affected_rows){
            $_SESSION['smsq'] = "Слово удалено!";
        } else {
            $_SESSION['fsmsq'] = "Ошибка!";
        }
    }
    header('Location: ../edit-voc.php');


    Отдельно замечу что никогда не надо писать or die("Ошибка: ".mysqli_error($connection));ю Вместо этого в файле с коннектом надо один раз написать
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    и тогда РНР обо всех ошибках запросов будет сообщать самостоятельно
    Ответ написан
    6 комментариев
  • Как правильно составить запрос SQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Хоть и не очень элегантно, но благодаря удобству ПДО всё же и не очень громоздко,
    $params = [];
    $sql = "SELECT * FROM `brands` ";
    if (!empty($_GET['district'])) {
        $sql .= "WHERE `district` = ?";
        $params[] = $_GET['district'];
    }
    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);


    Таким же образом можно добавлять и другие условия.
    Ответ написан
    Комментировать
  • Ошибка Undefined variable: dbh и Undefined variable: dbh Call to a member function prepare() on null?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вся проблема в том что пишешь код непонятно зачем. Пример: зачем тебе здесь функция? Для красоты?
    Сам код функции тоже написан без малейшего понимания
    if ($token == $tokenbd) {
    Что с чем ты здесь сравниваешь? И зачем? Что возвращает функция fetchAll()? Какой результат ты ожидаешь от этого сравнения? Зачем вообще сравнивать, если ты уже в запросе сравнил?

    Вот держи, в порядке баготворительности

    pdo.php

    <?php
    
    // MySQL Config
    $host = "localhost";
    $dbname = "api";
    $user = "root";
    $pass = "password";
    $charset = "utf8mb4"; // кодировку за тебя кто задавать будет? Максим Галкин?
    
    $dbh = new PDO("mysql:host=$host;dbname=$dbname;charset=$charset", $user, $pass);
    // про ошибки кто будет сообщать? Доктор комаровский?
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );


    сам файл

    <?php
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        require 'pdo.php';
        $sth = $dbh->prepare("SELECT 1 FROM api WHERE token = ?");
        $sth->execute(array($token));
        $tokenOK = $sth->fetchColumn();
    
        if ($tokenOK) {
            echo(json_encode(array('response' => 1)));
        }
    }
    Ответ написан
    Комментировать
  • Как отфильтровать повторяющиеся вопросы в php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Комментировать
  • Почему так работает SQL выборка из поля типа float?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    НИКОГДА не использовать для цен тип float. Только int или decimal
    Ответ написан
    Комментировать
  • Как правильно вывести новости из таблицы sql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Почему-то все поголовно новички уверены, что существует некий идеальный Золотой код, которй работает везде и всегда, даже если электричество отключить. И если его найдёшь, то дальше уже можно будет ни о чем не заботиться. И все старательно его ищут. И всегда называют свой вопрос "Как сделать то-то". Хотя если посмотреть на текст вопроса то станет ясно, что они прекрасно сзнают, как сделать, а вопрос у них - "почему не работает".

    Суровая же правда жизни заключается в том, что сломаться может любой код. Хуже того - обязательно рано или поздно сломается. И поэтому надо не искать волшебный Правильный код, а учиться разбираться, почему не работает то что есть.

    Код у тебя в целом нормальный. Поэтому надо разбираться, в чем проблема, а не искать волшебный идеальный код.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Какой ужас...
    Или даже так я буду под угрозой sql-инъекций?

    prepare само по себе не защищает от инъекций. От того что ты заменил слово query на слово prepare твои запросы защищеннее не станут.
    чтобы prepare работало, его надо использовать правильно.

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

    $stmt = $db->prepare('SELECT name, surname FROM accounts WHERE mail=?');
    $stmt->execute([$_SESSION['mail']]);
    $user = $stmt->fetch();
    <div class="dash-text" id="account-name"><?= $user['name'] . ' ' . $user['surname'] ?></div>
    Ответ написан
    1 комментарий
  • Как правильно экранировать символы в SQL запросы, если нужно отправить HTML-код?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    HTML никак специально экранировать не нужно. И вообще ничего экранировать не нужно. Экранирование - это треш, угар, прошлый век и инъекции. Данные в БД надо просто посылать отдельно от запроса.

    Удивительно, что на этот вопрос подписалось ещё столько народу.
    Ну это я не знаю - как подписаться на вопрос "сколько будет шестью шесть?". Не "дважды два", но близко.
    Работа с БД - это самые основы пхп, которые обсосаны в каждом учебнике со всех сторон. Неужели всё так плохо, что этот вопрос вызывает столь живой интерес, чтобы попасть в список интересных на тостере?

    Причем твоя лично проблема здесь совсем не в том, "как экранировать". HTML никак особо экранировать не нужно, базе данных абсолютно всё равно, что ты внее вставляешь. Твоя проблема в том, что ты в принципе не знаешь пхп и путаешься в основах языка, используешь устаревшую версию, которая не будет работать на живом сайте. И даже самый базовый синтаксис тебя пугает. Поэтому извини, я буду писать ответ не для тебя, а для тех, кто, в который раз, задается этим вечнозеленым вопросом, но по какой-то причине не смог освоить базовые навыки работы с гуглем/яндексом.

    Чтобы вставить данные в mysql, и вообще никогда не думать ни про какое "экранирование", надо
    1. Все переменные в запросе заменить на знаки вопроса
    2. Подготовить запрос к исполнению
    3. Привязать переменные к знакам вопроса
    4. Выполнить запрос.

    Как я уже говорил, функций, которые начинаются на mysql, в языке давно нет. Остаются только те, которые начинаются на mysqli и PDO. Вот для них я и приведу примеры.

    mysqli
    $type = 'testing';
    $reporter = "John O'Hara";
    $query = "INSERT INTO contents (type, reporter) VALUES(?, ?)"; // заменем
    $stmt = $mysqli->prepare($query); // подготавливаем
    $stmt->bind_param("ss", $type, $reporter); // привязываем
    $stmt->execute(); // исполняем

    Важно! Чтобы этот код работал, сначала надо правильно установить соединение mysqli
    PDO
    $type = 'testing';
    $reporter = "John O'Hara";
    $query = "INSERT INTO contents (type, reporter) VALUES(?, ?)"; // заменяем
    $stmt = $pdo->prepare($query); // подготавливаем
    $stmt->execute([$type, $reporter]); // привязываем и исполняем

    Важно! Чтобы этот код работал, сначала надо правильно установить соединение PDO

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я смотрю тут целый зоопарк ответов один другого краше.

    select user_id, sum(amount) total from table group by user_id order by order by total desc limit 20
    Ответ написан
    4 комментария
  • Передать параметр для вывода из базы данных[PHP,SQL]?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    echo '<td><a href="code.php?id=' . $result_row["id"]  . '">Edit</a></td>';

    только ради бога убери все эти непонятные <table>

    А в принимающем скрипте
    $sth = $dbh->prepare("SELECT content FROM `pages` where id = ?");
    $sth->execute([$_GET["id"]]);
    $result_row = $sth->fetch();
    echo htmlspecialchars($result_row["content"]);

    потому что весь смысл непонятных заклинаний препаре / екзекуте в том, что prepare подготавливает запрос с маркерами, а сами переменные передаются в execute().
    Ответ написан
  • Не выполняется запрос, как правильно его написать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Либо
    SELECT * FROM pag WHERE id=? and name=?
    либо
    SELECT * FROM pag WHERE id=? or name=?
    в текущем виде запрос не имеет смысла.

    И для работы с БД надо не пихать переменные прямо в запрос, а использовать плейсхолдеры
    Ответ написан
  • Как правильно сделать sql запрос?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Из комментов надо выбирать не по id, а по post_id.
    В таблице комментариев должно быть поле с ид поста. И дальше просто выбирать все нужные комментарии по этому полю

    Джойн здесь будет лишним. проще сделать два запроса - к таблице постов и к таблице комментариев.
    Ответ написан
    4 комментария
  • Проблема с SQL иньекциями. Не работает с 2 запросами в бд. Почему?

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

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

    $stmt = $bd->prepare("SELECT * FROM `users` WHERE id=? ");
    $stmt->bind_param('i', $id); 
    $stmt->execute();
    $res = $stmt->get_result(); // вот это
    $row = $res->fetch_assoc();


    Вообще, пользоваться чистым синтаксисом mysqli может только мазохист. Поскольку это низкоуровневая библиотека, которая раскладывает каждую задачу на кучу мелких операций. Все эти операции нужны, без них нельзя обойтись. Но совершенно не оябзательно как попугай постоянно долдонить их в каждом запросе. Можно написать функцию, которая будет выполнять их внутри.
    $row = prepared_select($bd, "SELECT * FROM `users` WHERE id=?", [$id])->fetch_assoc();


    Но самое, конечно, смешное - это что SELECT запрос тебе здесь не нужен.
    Базы данных работают совсем по-другому. Тебе не надо перекладывать данные из одной таблички в другую. Твоя БД потому называтся реляционной, что в ней можно связывать таблицы. И получать данные на основании связей. То есть в таблице messages не нужны ни имя. ни аватарка. Нужен только id юзера. А все его причиндалы ты получишь потом, при выводе, из таблицы users, используй JOIN запрос.
    Ответ написан
    Комментировать
  • SQL-ошибка: Illegal mix of collations?

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

    Ну и надо не забыть установить кодировку при соединении из пхп.
    Ответ написан
  • Проблема с авторизацией,что делать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $heshik = password_hash($password, PASSWORD_DEFAULT);
    $VerifyPass = password_verify($password, $heshik);

    Гениальный код.
    Давно я таких изысков не видел.

    По теме.
    Ответ написан
    Комментировать
  • Как проверить значение сразу в нескольких столбцах?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Все новички поголовно думают, что их запрос применяется ко всей БД разом.
    Ну и размеется хотят найти строки, в которых И адрес, И округ равны какому-то значению.

    Но если подумать, то запрос сравнивает с условием каждую строку по отдельности.
    И AND будет искать строку, в которой в которой и адрес, и округ равны этому значению.
    В то время как им нужно чтобы вернулась каждая строка, в которой адрес ИЛИ округ был равен какому-то значению.

    То есть вместо AND при поиске "по нескольким колонкам" надо использовать OR.

    Разумеется, это не касается прочих условий, использованных в запросе. Они они остаются как есть, а поиск "по нескольким полям" просто берется в скобки.
    Ответ написан
    Комментировать