Как L OOP запрос SELECT, пока он не найдет данные в базе данных (от PHP до MySQL) - PullRequest
0 голосов
/ 09 июля 2020

Я хотел выбрать строку в базе данных, но если строки нет в базе данных, она должна oop, пока не найдет

Эта строка $prev_date = date('M d, Y', strtotime($macrodate .' -1 day')); преобразует текущую дату на единицу вниз ( скажем, 15 июня, он превратится в 14 июня). И используйте эту дату, чтобы проверить, есть ли дата в базе данных, это не так, это будет l oop и go до 13 июня. Пока не удастся найти дату.

Как мне это сделать? Какой l oop мне следует использовать?

$query = "SELECT * FROM users_macros WHERE userid = '$userid' AND `date` = '$macrodate'";
$result = mysqli_query($con, $query);

if (mysqli_num_rows($result) == 0) {

                while(1) {
                    $prev_date = date('M d, Y', strtotime($macrodate .' -1 day'));
                    $query2 = "SELECT * FROM users_macros WHERE userid = '$userid' AND `date` = '$prev_date'";
                    $result2 = mysqli_query($con, $query2);

                    if (mysqli_num_rows($result2) != 0) { 
                        $row2 = mysqli_fetch_assoc($result2);
                        $targetcarbs = $row2['carbs']; 
                        $targetproteins = $row2['proteins']; 
                        $targetfats = $row2['fats']; 
                        $con->query("INSERT INTO users_macros VALUES('','$userid','$targetproteins','$targetfats','$targetcarbs','$macrodate')");
                        break;
                    }
                }
                
                
                
            }

1 Ответ

3 голосов
/ 09 июля 2020

Не используйте al oop. Просто используйте запрос, который возвращает строку с самой высокой датой ниже $macrodate. И вы можете объединить это с запросом INSERT.

И добавить критерий NOT EXISTS, чтобы он ничего не выбирал, если заданная дата уже находится в таблице.

Также используйте подготовленный оператор для предотвращения внедрения SQL.

$stmt = mysqli_prepare($con, "
    INSERT INTO users_macros
    SELECT '', userid, proteins, fats, carbs, ? FROM users_macros
    FROM users_macros
    WHERE userid = ? AND date < ?
    AND NOT EXISTS (
        SELECT 1 FROM users_macros
        WHERE userid = ? AND date = ?
    )
    ORDER BY date DESC
    LIMIT 1");
mysqli_stmt_bind_param($stmt, "sss", $macrodate, $userid, $macrodate, $userid, $macrodate);
mysqli_stmt_execute($stmt);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...