Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
Ответы пользователя по тегу MySQL
  • Выводит ошибку: Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in что делать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Перед соединением с БД надо написать строчку
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    после этого пхп будет писать реальную причину ошибки, а не эту ерунду.

    Колупаться, как тут предлагают, с mysqli_error() - это треш и прошлый век.

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

    FanatPHP
    @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
    Чебуратор тега РНР
    И никто не сказал несчастному автору, что надо использовать подготовленные выражения, а не буковки к названиям функций приписывать.
    Ответ написан
    Комментировать
  • Как сравнить два значения времени?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Просто сравнивай

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

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


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

    FanatPHP
    @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),то ошибка бы стала фатальной, а поведение кода - более предсказуемым: значение поля не обновилось бы на непонятный нуль, а запрос бы выдал ошибку.
    Ответ написан
    3 комментария
  • Как в подготовленный MySQL запрос вставить данные из массива?

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

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

    FanatPHP
    @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
    @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
    @FanatPHP
    Чебуратор тега РНР
    НЕ НУЖНО

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

    FanatPHP
    @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
    @FanatPHP
    Чебуратор тега РНР
    Данные надо перекодировать не при выборке, а при записи.
    Перед записью должен выполняться запрос SET NAMES с указанием кодировки входящих данных.
    Ответ написан
    Комментировать
  • Как обновить дату в mysql?

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

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

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

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

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

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

    Если надо добавить пару полей, то надо соответственно и модифицировать запрос
    Ответ написан
  • Как быстро выводить большие таблицы из БД объеденные join?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    индекс на `visitors`.`key`
    индекс на date_auth
    Ответ написан
    Комментировать
  • Как вывести 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 комментарий
  • Как реализовать постраничную навигацию с LEFT JOIN?

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

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    По новым стандартам самое главное - это использовать подготовленные выражения для выполнения запросов. В смысле не подставлять переменные напрямую в запрос, а передавать их отдельно.

    Для mysqli

    Как соединяться
    Как проверить пароль

    Для PDO

    Как видно даже на таких простых примерах, PDO проще и удобнее в использовании, чем mysqli, так что я настоятельно рекомендую PDO
    Ответ написан
    Комментировать
  • Как извлечь одну записи в виде ассоциативного массива в одну строку?

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

    Ну и плюс к тому надо же еще немножечко самостоятельно рассуждать. Оператор while нужен только если надо вывести много строк. А если нужна одна, то и оператор while не нужен.

    В итоге весь код с учетом исполнения запроса код можно сократить до трех строк (запихивать всё в одну нет смысла - потом будет неудобно читать)
    $query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,1";
    $result = $mysqli->query($query);
    $row = $result->fetch_assoc();

    Освоившись с объектным синтаксисом, в дальнейшем последние две строчки можно объединять в одну
    $row = $mysqli->query($query)->fetch_assoc();
    Также хочу отметить, что код для соединения с базой данных в примерах также дается ужасный. Более правильный вариант будет такой
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new mysqli("localhost", "my_user", "my_password", "world");
    $mysqli->set_charset("utf8mb4");

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