В форме PHP строковый ввод преобразуется в 0 после отправки - PullRequest
0 голосов
/ 05 мая 2020

В этой форме пользователю необходимо ввести три вещи - «Марка», «Год» и «Пробег». Первый должен быть строкой, а два других - целыми числами. В противном случае будет отображаться ошибка. Проблема в двух последних. Но если пользователь вводит «Год» в виде строки и «Пробег» в виде целого числа (или наоборот), он НЕ показывает никаких ошибок. Затем я проверил базу данных и обнаружил, что это строковое значение автоматически изменяется на 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>

1 Ответ

1 голос
/ 05 мая 2020
!is_numeric($_POST['year']) && !is_numeric($_POST['mileage']

проблема. Вы показываете ошибку, только если оба поля не являются числовыми c.

Вы можете изменить AND (&&) на OR (||), чтобы любое из быть нечисловым c вызовет ошибку.

Но, возможно, имеет смысл проверять каждый из них отдельно и выводить отдельное сообщение об ошибке для каждого. Логически непонятно, зачем вы их так смешали. И сообщения об ошибках должны накапливаться кумулятивно, а не только одно или другое, иначе, если пользователь совершит более одной ошибки, вы будете возвращать только одну из них за раз, и им придется продолжать повторную отправку, что будет неприятно. даже просто создайте список сообщений и позвольте разделу пользовательского интерфейса обрабатывать форматирование - например, помещать их в <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 == "" ) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...