如何循环SELECT查询,直到它在数据库中找到数据(PHP到MySQL)



我想在数据库中选择一行,但如果行不在数据库中,它应该循环直到找到

这一行$prev_date = date('M d, Y', strtotime($macrodate .' -1 day'));将当前日期转换为向下一个日期(假设6月15日,它将转换为6月14日(。并使用该日期来检查该日期是否在数据库中,它将循环并转到6月13日。直到找到日期。

我该怎么做?我应该使用什么循环?

$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;
}
}



}

不要使用循环。只需使用返回最高日期低于$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);

最新更新