PHP 查询中的页面加载 (MySQL)
PHP Page Loads Mid-Query (MySQL)
我有一个 PHP 页面,上面有一个 HTML 表单,用于更改 MySQL 数据库中的某些信息。表单提交到另一个 PHP 页面,该页面根据从表单收到的信息进行大约 7-10 次查询。这些查询按特定顺序排列非常重要。我正在使用 mysqli::multi_query
来执行这些查询。最后,在我执行查询后,我使用 header("Location: " . $_SERVER['HTTP_REFERER']);
将用户 return 到带有表单的页面。当用户 returned 到上一页时,我的问题就出现了。页面在出现在查询中间的时间点加载,而不是在完成的产品中加载。如果我然后点击刷新,它会加载更新的信息。我怎样才能阻止我的页面加载,直到它可以从数据库中获取更新的信息而不是在查询中加载?
编辑以添加代码(尽管我认为它与基本问题无关):
$sql = "SELECT * FROM tool_categories";
if($result = $MySQLi->query($sql)){
$toolCategories = array();
while($row = $result->fetch_assoc()){
$toolCategories[] = $row;
}
$result->free();
}
if(isset($_POST['editCategory'])){ // Editing category
if(!in_array($_POST['categoryName'], $toolCategories)){ // Make sure it doesn't exist already
$sql = "UPDATE tool_categories SET categoryName='" . $_POST['categoryName'] . "' WHERE categoryID=" . $_POST['categoryID'];
if($_POST['placement'] != 0){
if(!in_array($_POST['placement'], array_column($toolCategories, 'categoryID'))){ // Check if it exists
$sql .= "; UPDATE tool_categories SET categoryID=" . $_POST['placement'];
}else{
// Welp, gotta make some changes to categoryID's to make this fit!
$sql = "UPDATE tool_categories SET categoryID=0 WHERE categoryID=" . intval($_POST['categoryID']) . ";";
$sql .= "UPDATE tool_categories SET categoryID=categoryID-1 WHERE categoryID >= " . intval($_POST['categoryID']) . ";";
$sql .= "UPDATE tools SET categoryID=categoryID-1 WHERE categoryID >= " . intval($_POST['categoryID']) . ";";
$sql .= "ALTER TABLE tool_categories DROP INDEX categoryID;";
$sql .= "ALTER TABLE tool_categories DROP PRIMARY KEY;";
$sql .= "UPDATE tool_categories SET categoryID=categoryID+1 WHERE categoryID >= " . intval($_POST['placement']) . ";";
$sql .= "UPDATE tools SET categoryID=categoryID+1 WHERE categoryID >= " . intval($_POST['placement']) . ";";
$sql .= "ALTER TABLE tool_categories ADD INDEX categoryID (categoryID);";
$sql .= "ALTER TABLE tool_categories ADD PRIMARY KEY(categoryID);";
$sql .= "UPDATE tool_categories SET categoryID=" . intval($_POST['placement']) . ", categoryName='" . $_POST['categoryName'] . "' WHERE categoryID=0";
}
}
}
}
$startQuery = microtime(true);
$numberOfQueries = count(explode(';', $sql));
if(!$MySQLi->multi_query($sql)){
die(db_error());
for($i = 2; $i < $numberOfQueries+1; $i++){
if(!$MySQLi->next_result()){
die(db_error());
}
}
}
$endQuery = microtime(true);
$queryTime = $endQuery - $startQuery;
header("Location: " . $_SERVER['HTTP_REFERER'] . "&queryTime=" . $queryTime . "&queries=" . $numberOfQueries);
你应该避免 mysqli::multi_query
。 运行将您的查询一一分开来代替。它会阻止您的页面加载,直到它可以获取更新的信息。
以下代码引用自@mickmackusa 在上述评论中提供的以下post。 Strict Standards: mysqli_next_result() error with mysqli_multi_query
if($MySQLi->multi_query($sql)){
do{} while($MySQLi->more_results() && $MySQLi->next_result());
}
if($error_mess = $MySQLi->error){ die("Error: " . $error_mess); }
此代码设法阻止我的下一页加载,直到所有查询按预期完成。
我有一个 PHP 页面,上面有一个 HTML 表单,用于更改 MySQL 数据库中的某些信息。表单提交到另一个 PHP 页面,该页面根据从表单收到的信息进行大约 7-10 次查询。这些查询按特定顺序排列非常重要。我正在使用 mysqli::multi_query
来执行这些查询。最后,在我执行查询后,我使用 header("Location: " . $_SERVER['HTTP_REFERER']);
将用户 return 到带有表单的页面。当用户 returned 到上一页时,我的问题就出现了。页面在出现在查询中间的时间点加载,而不是在完成的产品中加载。如果我然后点击刷新,它会加载更新的信息。我怎样才能阻止我的页面加载,直到它可以从数据库中获取更新的信息而不是在查询中加载?
编辑以添加代码(尽管我认为它与基本问题无关):
$sql = "SELECT * FROM tool_categories";
if($result = $MySQLi->query($sql)){
$toolCategories = array();
while($row = $result->fetch_assoc()){
$toolCategories[] = $row;
}
$result->free();
}
if(isset($_POST['editCategory'])){ // Editing category
if(!in_array($_POST['categoryName'], $toolCategories)){ // Make sure it doesn't exist already
$sql = "UPDATE tool_categories SET categoryName='" . $_POST['categoryName'] . "' WHERE categoryID=" . $_POST['categoryID'];
if($_POST['placement'] != 0){
if(!in_array($_POST['placement'], array_column($toolCategories, 'categoryID'))){ // Check if it exists
$sql .= "; UPDATE tool_categories SET categoryID=" . $_POST['placement'];
}else{
// Welp, gotta make some changes to categoryID's to make this fit!
$sql = "UPDATE tool_categories SET categoryID=0 WHERE categoryID=" . intval($_POST['categoryID']) . ";";
$sql .= "UPDATE tool_categories SET categoryID=categoryID-1 WHERE categoryID >= " . intval($_POST['categoryID']) . ";";
$sql .= "UPDATE tools SET categoryID=categoryID-1 WHERE categoryID >= " . intval($_POST['categoryID']) . ";";
$sql .= "ALTER TABLE tool_categories DROP INDEX categoryID;";
$sql .= "ALTER TABLE tool_categories DROP PRIMARY KEY;";
$sql .= "UPDATE tool_categories SET categoryID=categoryID+1 WHERE categoryID >= " . intval($_POST['placement']) . ";";
$sql .= "UPDATE tools SET categoryID=categoryID+1 WHERE categoryID >= " . intval($_POST['placement']) . ";";
$sql .= "ALTER TABLE tool_categories ADD INDEX categoryID (categoryID);";
$sql .= "ALTER TABLE tool_categories ADD PRIMARY KEY(categoryID);";
$sql .= "UPDATE tool_categories SET categoryID=" . intval($_POST['placement']) . ", categoryName='" . $_POST['categoryName'] . "' WHERE categoryID=0";
}
}
}
}
$startQuery = microtime(true);
$numberOfQueries = count(explode(';', $sql));
if(!$MySQLi->multi_query($sql)){
die(db_error());
for($i = 2; $i < $numberOfQueries+1; $i++){
if(!$MySQLi->next_result()){
die(db_error());
}
}
}
$endQuery = microtime(true);
$queryTime = $endQuery - $startQuery;
header("Location: " . $_SERVER['HTTP_REFERER'] . "&queryTime=" . $queryTime . "&queries=" . $numberOfQueries);
你应该避免 mysqli::multi_query
。 运行将您的查询一一分开来代替。它会阻止您的页面加载,直到它可以获取更新的信息。
以下代码引用自@mickmackusa 在上述评论中提供的以下post。 Strict Standards: mysqli_next_result() error with mysqli_multi_query
if($MySQLi->multi_query($sql)){
do{} while($MySQLi->more_results() && $MySQLi->next_result());
}
if($error_mess = $MySQLi->error){ die("Error: " . $error_mess); }
此代码设法阻止我的下一页加载,直到所有查询按预期完成。