@fakin_kiska
Telegram Bots and iOS

Почему не выводится последний элемент из бд mysql?

Сделал две функции: одна добавляет в бд новые сообщения пользователя, а другая их достает и присылает в чат с ботом, во второй функции использую команду LAST_INSERT_ID()

Проблема заключается в том, что вторая функция не может вывести это самое сохраненное сообщение

Функции:

function message_reg($username, $user_id, $message, $message_id) {
global $db;
$user_name = mysqli_real_escape_string ($username);
$chat_id = mysqli_real_escape_string ($user_id);
$messages = mysqli_real_escape_string ($message);
$messages_id = mysqli_real_escape_string ($message_id);
$query = "insert into `secret_messages` (username, user_id, message, message_id) values ('{$username}', '{$user_id}', '{$message}', '{$message_id}')";
mysqli_query($db, $query) or die ("Зарегистрировать сообщение не удалось");
}

function message_get($username, $user_id, $message, $message_id) {
    global $db;
    $user_name = mysqli_real_escape_string ($username);
    $chat_id = mysqli_real_escape_string ($user_id);
    $messages = mysqli_real_escape_string ($message);
    $messages_id = mysqli_real_escape_string ($message_id);
    $query = "SELECT 'message' FROM `secret_messages` WHERE id=LAST_INSERT_ID()";
    mysqli_query($db, $query) or die ("Получить сообщение не удалось");
}


Основной код:

switch ($callback_data) {
case 'view_message':
message_get($username, $user_id, $message, $message_id);
$post = [
    'chat_id' => $chat_id,
    'message_id' => $message_id,
    'text' => 'Текст секретного сообщения: ' . $messages,
];
sendRequest('editMessageText', $post);
break;
default: // вывод callback_data
$post = [
    'chat_id' => $user_id,
    'text' => $callback_data
];
sendRequest('sendMessage', $post);
break;
}


Не понимаю, почему из строки не может достаться сообщение

614402381b94f125720646.png
  • Вопрос задан
  • 161 просмотр
Решения вопроса 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Вопрос "почему не выводится" здесь неуместен. Здесь скорее подойдёт вопрос "Этот код вообще хоть как-то работает?" Спойлер: нет.

Этот код неправильный по стольким параметрам, что у меня просто нет слов.
Он писался явно без малейшего понимания, а просто методом "подставлю какой-то код, авось подойдёт".
Причём понимания нет ни на каком уровне - ни того как работает БД, ни того как работает РНР, ни того как РНР работает с БД. Ни даже простого житейского здравого смысла. Зачем в message_get() все эти $user_name = mysqli_real_escape_string ($username);?

Во-первых, с помощью LAST_INSERT_ID получить "последнюю запись" можно только сразу после вставки. А поскольку в "основном коде" получение сообщения явно не выполняется в одной ветке с записью, то LAST_INSERT_ID не сработает. Причём тут даже простой житейской логики нет. Если сначала один пользователь добавил сообщение, а потом второй, то при получении "последнего" как БД узнает, чьё "последнее" сообщение надо показать?
Чтобы показать последнее сообщение для определённого пользователя, надо, как правильно отметили в комментариях, надо отсортировать таблицу по времени добавления и выбрать только 1 строку с помощью LIMIT.
Но кроме этого надо указать, для какого пользователя мы получаем это сообщение.

Во-вторых, функция mysqli_real_escape_string() вызывается неправильно, она будет выдавать ошибку. А по-хорошему вообще нужно использовать не её, а подготовленные выражения.

В-третьих, 'message' в запросе вернёт слово 'message', а совсем не само сообщение.

В-четвёртых, view_message хочет показать несколько значений, но в запросе выбирается только это 'message'

Во-пятых, как правильно написали выше, функция ни сама ничего не возвращает, ни даже не получает запрошенную из БД информацию. Функция должна выглядеть по крайней мере так

function message_get($user_id) {
    global $db;
    $chat_id = mysqli_real_escape_string($db,$user_id);
    $query = "SELECT message_id, user_id as chat_id,  message as `text` 
        FROM `secret_messages` 
        WHERE user_id='$chat_id' ORDER BY id DESC LIMIT 1";
    $result = mysqli_query($db, $query);
    return $result->fetch_assoc();
}

и потом получать при вызове
$post = message_get($user_id);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@galaxy
'text' => 'Текст секретного сообщения: ' . $messages,

И что такое $messages? Кто ему присвоил значение?

message_get() каким образом, по-вашему, вообще возвращает текст сообщения или хоть что-нибудь?

Last but not the least: сделал mysqli_query(... "SELECT ..."), сделай уж потом и fetch*
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы