Ответы пользователя по тегу MySQL
  • Как проверить в php результат запроса?

    @FanatPHP
    Как уже сказали в комментариях, результат запроса и данные, которые он вернул - это две разные вещи.
    Когда ты лезешь в карман, чтобы узнать, хватит ли тебе на бутылку пива, ты тоже проверяешь не деньги, а карман? Если карман есть, значит и деньги тоже?

    Проверять надо не карман, а деньги. Не результат запроса, а строки, которые он вернул. То есть надо просто сделать фетч и вот уже результат фетча проверять в условии. То есть if ($post)

    Ну и как всегда надо напомнить, что переменные никогда не пихают в запрос напрямую, а передают отдельно. Готовый код можно посмотреть здесь, https://phpdelusions.net/mysqli/check_value
    Ответ написан
  • Подключение к базе данных MySql, как правильно и современно?

    @FanatPHP
    Вопрос хороший, но неправильно сформулирован.
    Поскольку тут на самом деле два вопроса - какой драйвер использовать и уже потом - как правильно соединяться.
    Ответ на первый вопрос очевиден. Если выбирать из mysql_connect, mysqli и PDO, то достаточно зайти на страницу мануала, посвященную каждому варианту, и посмотреть, что там написано. Ну или попробовать использовать в своем коде и посмотреть что получится.

    А вот вопрос, как правильно подключаться в двух оставшихся вариантах, действительно важный, и ответ на него, как обычно, почти никто не знает, поскольку все друг у друга списывают статьи не 2-х, а 22-х летней давности. К счастью, есть сайты с актуальной информацией.

    Теоретически, можно использовать mysqli. Но не нужно. Потому что это низкоуровневый драйвер и пользоваться им без подготовки очень неудобно. Но если вот прям так приспичило, то вот как правильно соединяться используя mysqli

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

    Но правильным ответом, если выбирать из перечисленных трех, будет PDO. Здесь тоже не так просто, поэтому смотрим как правильно соединяться используя PDO - учитывая те же ключевые моменты, которые указаны выше.

    Хорошим вариантом будет использовать высокоуровневую абстракцию типа redbean. Но поскольку нормальной документации по нему нет, а есть только пара хайповых видео, где он используется, причем без каких бы то ни было объяснений и разбора основ, то я бы рекомендовал редбин уже опытному разработчику, а не начинающему. Но в любом случае как в нем соединяться, написано в документации

    Пароль в базе данных не шифруется а хэшируется. Делается это с посощью функции password_hash
    Ответ написан
  • Объединение запросов SQL, в один запрос?

    @FanatPHP
    требуется оптимизации в один запрос

    Не требуется.
    Никакой "оптимизации" это не даст.

    Если на пальцах, то просто забудь про любые "оптимизации". Вместо этого наладь дела с join. Это не прибавит оптимзации, но зато будет примерно в 100500 раз полезнее
    Ответ написан
  • Почему не идут данные в бд после отправки формы?

    @FanatPHP
    Перед соединением с БД надо написать строчку

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    после этого пхп будет всегда сообщать, почему запрос не был выполнен
    Ответ написан
  • Как выполнить синхронный mysql запрос из php?

    @FanatPHP
    Я, честно, не понимаю таких вопросов.

    Есть нормальный синхронный функционал выполнения запросов по одному. Помимо прочего - ещё и безопасный, если использовать подготовленные выражения.

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

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

    @FanatPHP
    Если подумать за автора, то ему надо это
    $result= mysqli_query($conn, "SELECT value FROM _main WHERE variable = 'logo'");
    $row = mysqli_fetch_assoc($result);
    $logo = $row['value'];
    В ПДО действительно будет проще
    $logo = $pdo->query("SELECT value FROM _main WHERE variable = 'logo'")->fetchColumn();


    Если нужен, как выясняется, словарь, где ключами являются значения колонки variable, то PDO без вариантов.
    $settings = $pdo->query("SELECT variable, value FROM _main")->fetchAll(PDO::FETCH_KEY_PAIR);
    echo $settings['logo'];

    даст нам вожделенную картинку, поскольку метод fetchAll() с модификатором PDO::FETCH_KEY_PAIR
    как раз и дает нам двумерный массив, где ключи - это содержимое перво....
    Ответ написан
  • Как быстрее всего забить базу 5 млн юзерами и в последствии всех их выбирать?

    @FanatPHP
    Да. Ходить в цикле и каждому слать имейл из 5 млн.
    Спамер должен страдать.
    Ответ написан
  • Как отправить текст в базу mySql, отправляются только символы?

    @FanatPHP
    Данные надо передавать отдельно от запроса
    $sql = $conn->prepare("INSERT INTO MyGuests2 (text2) VALUES (?)");
    $sql->bind_param("s", $_POST["name"]);
    $sql->exeсute();
    echo "Успешно созданы новые записи";


    И вдогонку, как правильно соединяться
    Ответ написан
  • Как решить проблему с устаревшей функцией php mysql_escape_string?

    @FanatPHP
    И никто не сказал несчастному автору, что надо использовать подготовленные выражения, а не буковки к названиям функций приписывать.
    Ответ написан
  • Как сравнить два значения времени?

    @FanatPHP
    Просто сравнивай

    если $alert больше. чем $times, то такое-то условие, а если меньше, то другое.

    if ($alert > $times) {
      // такое-то условие,
    } else {
      // другое. 
    }


    И да, делать это надо в запросе, а не в пхп
    Ответ написан
  • Почему код не вносит запись в бд?

    @FanatPHP
    Если немного отойти в сторону от насущных потребностей горе-кодеров исправить опечатку и бежать скорее такжекодить дальше, то вопрос довольно интересный.

    В частности, возникает закономерный вопрос - почему $result содержит true, а не false, как должно быть в случае ошибки? Ведь у запроса явно неверный синтаксис? И что означают загадочные слова автора (который не в ладах не только с РНР, но и с русским языком), "Два поля в ней редактируются и я пытаюсь их сохранить, не то, что хочу"?

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

    Начнем с запроса. Ошибка в нем действительно есть, но не синтаксическая. Дело в том, что оператор AND может использоваться не только в операторе WHERE. Это совершенно самостоятельный логический оператор: SELECT 1 AND 1; это совершенно легитимный запрос, который вернет единицу - результат операции 1 AND 1;.

    Точно так же результат этой операции можно присвоить и полю при запросе UPDATE:
    UPDATE Users SET logist=1 AND 1 WHERE id=100;
    А теперь посмотрим внимательно на исходный запрос. Для удобства я поставил скобки, чтобы показать, в каком порядке выполнятся операторы в запросе:
    UPDATE Users SET logist=('$log' AND (sum='$sum')) WHERE id='$form_id'

    Что здесь важно понимать?
    • - что в выражении sum='$sum' знак "равно" меняет свое значение и из оператора присваивания превращается в оператор сравнения.
    • - что существует такое явление, как приоритет выполнения операторов. И у оператора AND приоритет выше, чем у = как оператора присваивания, но ниже, чем у = как оператора сравнения!
    • - что существует такое явление, как приведение типов, и mysql по мере сил пытается привести операнды выражения AND ктакому типу, с которым оно может работать (числовому)

    таким образом мы
    1. сначала приводим выражение '$log' к числовому/булеву типу (и получаем скорее всего 0)
    2. потом получаем результат выражения sum='$sum' (1 или 0 в зависимости от того, равно ли содержимое поля sum значению переменной $sum или нет),
    3. затем выполняем операцию 0 AND 0
    4. и в итоге мы присваиваем этот 0 полю log

    Каковой ноль и объясняет загадочные слова автора "я пытаюсь сохранить не то, что хочу."

    Напоследок хочется рассказать о важности информирования программиста об ошибках.

    На самом деле ошибка в этом запросе все-таки есть. И звучит она как Truncated incorrect DOUBLE value: 'log'
    Просто в зависимости от настроек mysql она является либо фатальной, либо просто нотисом. В случае автора это был нотис, который в пхп без специальных средств заметить невозможно.
    Но если бы база данных была настроена в strict mode (и у автора вопроса было настроено правильное отображение ошибок mysqli),то ошибка бы стала фатальной, а поведение кода - более предсказуемым: значение поля не обновилось бы на непонятный нуль, а запрос бы выдал ошибку.
    Ответ написан
  • Как в подготовленный MySQL запрос вставить данные из массива?

    @FanatPHP
    Имена полей и названия плейсхолдеров ни в коем случае нельзя брать из $data
    Есть класс юзеров,

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

    @FanatPHP
    $sql="SELECT COUNT(*) FROM `post` WHERE osoz=1 AND id_author=?";         
    $stmt = $connect->prepare($sql);     
    $stmt->bind_param("s",$id_au);
    $stmt->execute();
    $row = $stmt->get_result()->fetch_row();
    echo $row[0];
    Ответ написан
  • Как переделать синтаксис MySQL чтобы он работал в PHP?

    @FanatPHP
    $mysqli->query("CREATE TEMPORARY TABLE foo AS SELECT * FROM texts WHERE id = 465");
    $mysqli->query("UPDATE foo SET id = 837, html_text = 'text', text_lang = 'russian'");
    $mysqli->query("INSERT INTO texts SELECT * FROM foo");
    $mysqli->query("DROP TABLE foo");
    Ответ написан
  • Добавление данных к к существующей записи через спец символ?

    @FanatPHP
    НЕ НУЖНО

    Это чудовищное издевательство над базой данных и программистами, которым потом придется с этим работать.
    Для Андрея надо завести отдельную таблицу, связанную с исходной,и записывать в неё, обычным инсертом
    Ответ написан
  • Ошибка синтаксиса mysql, почему?

    @FanatPHP
    потому что это называется SQL инъекция.

    Запросы надо выполнять через подготовленные выражения.
    $query = "INSERT INTO users SET login = ?, name = ?, email = ?, pass = ?, status = 'user'";
    $stmt = $link->prepare($query);
    $stmt->bind_param("ssss",$login,$name,$email,$pass);
    $stmt->execute();


    То же самое касается и всех остальных запросов, в которых участвуют переменные
    Ответ написан
  • Как перекодировать данные Mysql и PHP?

    @FanatPHP
    Данные надо перекодировать не при выборке, а при записи.
    Перед записью должен выполняться запрос SET NAMES с указанием кодировки входящих данных.
    Ответ написан
  • Как обновить дату в mysql?

    @FanatPHP
    программа должна делать ровно то, что хочет программист. если надо обновить дату, то запрос должен обновлять дату. не нужно искать какие-то обходные пути, чтобы обновить дату, не обновляя её.

    Если не хочется передавать текущую дату в запрос, то в mysql есть функция NOW().
    Ответ написан
  • Правильная ли php-функция фильтрации post данных перед записью в mysql?

    @FanatPHP
    Глядя на этот ужас, летящий на крыльях ночи, я всегда задаюсь вопросом: допустим, автор захочет написать аналог тостера. Что будет с текстом его вопроса после обработки такой функцией?

    По поводу того, что сюда добавить:

    В ужасе стереть все что что тут написано.
    Прочитать раз в жизни документацию и забыть про mysql_real_escape_string как про страшный сон.
    Включить голову, и сообразить, что mysql не подвержена XSS. То есть при записи в базу данных от этой атаки защищаться не нужно.
    Освоить PDO, и использовать подготовленные выражения для работы с базой данных.
    Ответ написан
  • Как правильно сделать выборку данных с помощью раскрывающегося списка?

    @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 ?>


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