每当我尝试发布 MySQL 查询时,我都会检索除
$your_model
之外的所有变量值...这是我在创建 HTML 下拉列表后收到的值,该下拉列表在属于当前用户的数据库中检索汽车模型已登录。
如果我在检查
if(isset($_POST['odo']))
的“IF”语句之前和之后进行回显,我就能够看到$your_model
的值...但是一旦我提交或发布我的里程表读数,MySQL就会看到$odo
值、$time
值,但不是 $your_model
值。
我尝试在我的代码之前和之后编写那段 MySQL 代码。我尝试将其嵌套到代码中的不同区域,甚至将其嵌套在我正在执行 if num_of_cars > 0
的位置我尝试将
$your_model
放在引号 "$your_model"
、单引号 '$your_model'
中、用带或不带引号的大括号括起来 {$your_model}
、'{$your_model}'
等
我也尝试过
'".$your_model."'
,但这不允许MySQL知道变量中的内容
我确实尝试了所有我能想到的方法,并在互联网上进行了搜索。我看到几个论坛有类似的问题...一个没有解决,另一个通过在变量周围加上大括号以便 MySQL 可以识别它来解决。
我真的相信它与
$_POST
命令有关...我想知道一旦我提交里程表读数来查询数据库,如果不知何故因为页面刷新,MySQL丢失了$your_model
变量的值?
<?php
require_once 'header.php';
if (!$loggedin) die("</div></body></html>");
if (isset($_GET['view'])) $view = sanitizeString($_GET['view']);
else $view = $user;
if ($view != "")
{
if ($view == $user) $name1 = $name2 = "Your";
else
{
$name1 = "<a href='members.php?view=$view'>$view</a>'s";
$name2 = "$view's";
}
echo "<h4>$name1 Car Portal</h4>";
showProfile($view);
echo "<br><br>";
$car_query = "SELECT model FROM cars WHERE user='$user'";
$car_result = queryMysql($car_query);
$num_of_cars = $car_result->num_rows;
if ($num_of_cars > 0) {
while ($row = mysqli_fetch_assoc($car_result)) {
$selectedModels[] = $row['model'];
}
}
if (isset($_POST['selectAModel'])) $your_model = sanitizeString($_POST['selectAModel']);
echo <<<_END
<form method='post' action='car_test.php?view=$view'>
<select name="selectAModel">
<option value='Select Model'>Select A Model </option>
_END;
foreach($selectedModels as $modelName) {
echo "<option name='$modelName' value='$modelName'> $modelName </option>";
}
echo <<<_END
</select>
<input type='submit' name='post_car' value='Submit Car Model'>
</form>
_END;
echo "<br><br>";
echo "<div style='text-align:center;'><h3>Your $your_model Odometer Reading</h3></div>";
if (!isset($_POST['odo']))
{
echo "<span class='info' style='color:red'>You have not entered your $your_model current odometer reading yet</span><br>";
}
if (isset($_POST['odo']) && isset($_POST['selectAModel']))
{
$odo = sanitizeString($_POST['odo']);
if ($odo != "")
{
$time = time();
queryMysql("UPDATE cars SET odo = '$odo', time = '$time' WHERE user = '$user' AND model = '$your_model'");
}
}
echo <<<_END
<form method='post' action='car_test.php?view=$view'>
<input type='text' id='odo' name='odo'>
<label for='odo'>Current Odometer Reading</label><br>
<input data-transition='slide' type='submit' value='Submit Odometer Reading'>
</form>
_END;
echo "<br>";
date_default_timezone_get();
if (isset($_GET['erase']))
{
$erase = sanitizeString($_GET['erase']);
queryMysql("DELETE FROM car WHERE odo='$erase' AND user='$user'");
}
$query = "SELECT * FROM car WHERE user='$view' ORDER BY time DESC";
$result = queryMysql($query);
$num = $result->num_rows;
for ($j = 0; $j < $num; ++$j)
{
$row = $result->fetch_array(MYSQLI_ASSOC);
if ($row['odo'] != "" && $row['user'] == $user)
{
echo date('M jS \'y g:ia:', $row['time']);
echo "<br><br>";
echo "<a href='car.php?view=" . $row['user'] . "'>" . $row['user']. "</a>";
echo "<br>";
echo "last oil change was at: " . $row['odo'] . "<br>";
$current_odo = ((int) $row['odo']);
$eight_thousand = 8000;
$next_change = $current_odo + $eight_thousand;
echo "your next oil change is at: $next_change";
if ($row['user'] == $user)
echo "<br><br>[<a href='car.php?view=$view" . "&erase=" . $row['odo'] . "'>erase</a>]";
echo "<br><br><br>";
}
}
}
?>
</div><br>
</body>
</html>
Web 请求是无状态的。他们不会自动记住从一个请求到下一个请求的任何内容。每次加载页面、发布表单或向服务器发送 AJAX 请求时,PHP 脚本都会从所请求脚本的开头运行,并且就像以前从未运行过一样。这有一些优点,但一个明显的缺点是它不保留任何变量值。
为了解决这个问题,您必须采取特定步骤来保留您想要在请求之间保留的数据,无论是为特定用户还是一般存储,然后在需要时检索它。
在您的场景中,您有两种形式,一种用于模型,一种用于里程表数据。这意味着将有两个单独的请求发送到服务器。因此,如果您在一个请求中提交了包含模型的表单,那么在包含里程表的请求中,将无法读取模型值。
您可以将两个字段放在一个表单中并将它们一起提交,或者采取措施在后续请求中保留/传递模型值 - 例如将其放入会话中然后检索它,或者将模型值放入里程表表单上的隐藏字段中。
这是一个简单的示例,说明如何使用会话来实现此目的:
<?php
session_start(); //remember to use this to enable Session usage in your script
require_once 'header.php';
//...etc, until you get to
if (isset($_POST['selectAModel']))
$your_model = sanitizeString($_POST['selectAModel']);
$_SESSION["your_model"] = $your_model; //add the model data to the session
}
//then we get to:
//if (isset($_POST['odo']) && isset($_POST['selectAModel'])) - this can't work because both POST values won't exist at the same time. Replace it with:
if (isset($_POST['odo']))
{
if (isset($_SESSION["your_model"])) {
$your_model = $_SESSION["your_model"];
}
else
{
die("No valid model value set, cannot proceed to save odometer reading");
}
//...etc