Как выбрать строки в пределах указанного диапазона c в sql? - PullRequest
0 голосов
/ 21 июня 2020

Я создаю простое веб-приложение для обмена сообщениями. Люди могут легко отправлять или получать текстовые смс, войдя в систему. Просто нажмите на указанное c контактное имя, и у вас появится окно чата со всеми предыдущими сообщениями. Теперь проблема в том, что любой разговор с большим количеством сообщений будет долго загружать чат. Итак, я хочу впервые показать последние (упорядочить по времени отправки des c) 10 сообщений в окне чата. И в верхней части окна чата я хочу разместить кнопку, нажав на которую пользователь получит предыдущие 10 сообщений (порядок отправки по времени отправки des c). И это будет продолжаться до тех пор, пока пользователь не получит последнее сообщение. Я использую PHP AJAX. Код, который я использовал для получения первых 10 сообщений, здесь

    $sql2="select * from messages where sender='$user1' and reciever='$user2' or reciever='$user1' and 
sender='$user2' order by sendingTime desc";
$res2=mysqli_query($con,$sql2);
$num=mysqli_num_rows($res2);
if($num<=10){
for($i=1;$i<=$num;$i++){
$row2=mysqli_fetch_array($res2);
$data2[]=$row2;
}
}else{
for($i=1;$i<=10;$i++){
$row2=mysqli_fetch_array($res2);
$data2[]=$row2;
}
}

Но я понятия не имею, как выбрать следующие 10 строк сообщения. Пожалуйста, помогите.

Структура моей базы данных «сообщений» 1 idPrimary int (11) Нет Нет AUTO_INCREMENT Изменить Изменить Отбросить Подробнее Еще 2 отправителя varchar (100) latin1_swedish_ci Нет Нет Изменить Изменить Сбросить Подробнее Еще 3 получателя varchar (100) latin1_swedish_ci Нет Нет Изменить Изменить Сбросить Подробнее Подробнее 4 сообщения varchar (5000) latin1_swedish_ci Нет Нет Изменить Изменить Отпустить Больше Больше 5 sendTime varchar (100) latin1_swedish_ci Нет Нет Изменить Изменить Сбросить Подробнее Еще 6 deliveryTime varchar (100) latin1_swedish_ci Нет Нет Изменить Изменить Сбросить Подробнее Подробнее 7 статус int (1) Нет

Ответы [ 2 ]

1 голос
/ 21 июня 2020

ВНИМАНИЕ!: В настоящее время вы широко открыты для SQL инъекций (атак SQLI). Пожалуйста, используйте подготовленные операторы и параметризованные запросы , используя либо mysqli , либо PDO . Ваша база данных подвергается огромному риску! Не доверяйте никакому пользовательскому вводу!

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

То, что вам обычно нужно в вашем запросе есть оператор LIMIT. Более подробную информацию об операторе LIMIT можно найти здесь .

Пример:

SELECT
    *
FROM
    messages
WHERE
    sender = 1 AND receiver = 2
    OR ( receiver = 1 AND sender = 2)
LIMIT 10;

DB Fiddle здесь .

В вашей функции AJAX вам необходимо проанализировать значение, которое будет служить вашей переменной в вашем предложении LIMIT. С каждым щелчком «Загрузить больше» вы увеличиваете это значение на 10.

Вот как может выглядеть ваша PHP страница:

<?php
// Your user variables
$user1 = $_POST['user1'];
$user2 = $_POST['user2'];

// Your amount of messages to be loaded
$loadMessages = $_POST['messageAmount'];

if(empty($loadMessages )) {
   $loadMessages = 0; 
}

// DB variables
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "myDB";

// Error handling
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

/*
Declare the query.
One thing to note from a select statement,
is that it is generally considered better practice
to list the fields you want to fetch.
Even if it's considered to be all fields.
So I would recommend doing that over "SELECT *".
*/
$sql = "SELECT
            *
        FROM
            messages
        WHERE
            sender = ?
            AND receiver = ? 
            or (reciever = ? and sender = ?)
        LIMIT (10 + ?)
        ORDER BY
            sendingTime DESC";

/*
Prepare and bind 
The variable identifiers are based on assuming the sender and receiver
are int fields. Change the identifier if that's not the case.

Identifiers:
-s string
-i int
-d double
-b BLOB
*/
$stmt = $conn->prepare($sql);
$stmt->bind_param('iiiii', $user1, $user2, $user1, $user2, $loadMessages);

// Execute the query
$stmt->execute();

// Get result of query
$result = $stmt->get_result();

// Close connection
$stmt->close();
$conn->close();
?>

К l oop по вашим результатам:

<?php
// Check if any returned rows?
if($result->num_rows > 0) {
    // Loop through the result(s)
    while ($data = $result->fetch_assoc()) {
        echo $data['field_name'];
    }
} else {
    // Something here?
}
?>
0 голосов
/ 21 июня 2020

Попробуйте BETWEEN Operator

WHERE column_name BETWEEN value1 AND value2;

Установите условия для value1 и value2

Проверьте синтаксис

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...