在这个表单中,用户需要插入三个内容——"Make"、"Year"one_answers"Mileage"。第一个必须是字符串,另外两个必须是整数。如果没有,那么它将显示错误。问题出在后两者。但如果用户输入"年份"作为字符串,输入"里程"作为整数(反之亦然(,则不会显示任何错误。然后我检查了数据库,发现字符串值会自动更改为0(零(。这可能是验证失败的原因。
这是代码:
<?php
if ( ! isset($_GET['name']) || strlen($_GET['name']) < 1 ) {
die("Name parameter missing");
}
if ( isset($_POST['logout']) ) {
header('Location: index.php');
return;
}
?>
<?php
require_once "pdo.php";
$failure = false;
$success = true;
if ( isset($_POST['make']) && isset($_POST['year']) && isset($_POST['mileage']) ) {
if (strlen($_POST['make']) < 1) {
$failure = "Make is required";
}
else if( !is_numeric($_POST['year']) && !is_numeric($_POST['mileage']) ) {
$failure = "Mileage and year must be numeric";
}
else {
$stmt = $pdo->prepare('INSERT INTO autos
(make, year, mileage) VALUES ( :mk, :yr, :mi)');
$stmt->execute(array(
':mk' => htmlentities($_POST['make']),
':yr' => htmlentities($_POST['year']),
':mi' => htmlentities($_POST['mileage'])));
$success = "Record inserted";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Kho. Iftekhar Alam</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">
</head>
<body>
<div class="container">
<h1>Tracking Autos for <?php echo $_GET['name']; ?> </h1>
<?php
if ( $failure !== false ) {
echo('<p style="color: red;">'.htmlentities($failure)."</p>n");
}
if ( $success !== true ) {
echo('<p style="color: green;">'.htmlentities($success)."</p>n");
}
?>
<form method="post">
<p>Make:
<input type="text" name="make" size="60"/></p>
<p>Year:
<input type="text" name="year"/></p>
<p>Mileage:
<input type="text" name="mileage"/></p>
<input type="submit" value="Add">
<input type="submit" name="logout" value="Logout">
</form>
<h2>Automobiles</h2>
<ul>
<?php
$stm = $pdo->query("SELECT make,year,mileage from autos");
while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {
echo "<li>";
echo $row['year'].' '.$row['make'].' '.'/'.' '.$row['mileage'];
echo "</li>";
}
?>
<p>
</ul>
</div>
<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script></body>
</html>
!is_numeric($_POST['year']) && !is_numeric($_POST['mileage']
就是问题所在。只有两个字段都不是数字时,才会显示错误。
您可以将AND(&&
(更改为OR(||
(,这样任何一个非数字都会触发错误。
但是,单独检查每一个可能更有意义,并为每一个输出单独的错误消息。从逻辑上讲,你为什么把它们归在一起还不清楚。失败消息应该累积起来,而不仅仅是一个或另一个,否则,如果用户犯了不止一个错误,你一次只会反馈其中一个,他们将不得不不断重新提交,这将是一种令人沮丧的体验。
因此,一个更好的错误处理例程可能看起来更像这样(我没有格式化消息,只是用换行符分隔它们,但你可以根据自己的需要添加它。你甚至可以建立一个消息列表,并让UI部分处理格式化-例如,将它们放入<ul>
或其他文件中(:
$failure = "";
....
if (strlen($_POST['make']) < 1) {
$failure .= "Make is required";
}
if (!is_numeric($_POST['year']) {
$failure .= "<br/>Year must be numeric";
}
if (!is_numeric($_POST['mileage']) ) {
$failure .= "<br/>Mileage must be numeric";
}
.....
if ( $failure == "" ) {