PHP, что выдает ошибку, когда такой строки нет в таблице в форме электронной почты - PullRequest
1 голос
/ 04 марта 2020

У меня есть контакт электронной почты в PHP, и я хотел добавить деталь, где он должен проверять, есть ли в моей таблице фактический идентификатор заказа, записанный в <input>, в противном случае он отправляет электронное письмо.

РЕДАКТИРОВАТЬ : добавлено подготовленное заявление $stmt->execute([ ':order' => $order ]);

<?php
if (isset($_POST['submit'])) {
$subject = $_POST['subject'];
$message = $_POST['message'];
$order = $_POST['orderId'];
$mailTo = "mail@mail.com";
        if ($order != "") {
          $db = new PDO('mysql:host=localhost;dbname=dbname;charset=utf8', 'username', 'password');
          $order = $_POST['orderId'];

          $stmt = $db->query("SELECT * FROM Orders WHERE OrderID= :order ");
          $stmt->execute([ ':order' => $order ]);

          if (!$row = $stmt->fetch(PDO::FETCH_ASSOC)) {
              echo 'No such ID';
          }
          else {
              $txt .= "Query Received!\n\nOrder ID: ".$order."\n\nMessage context: \n\n".$message;
              mail($mailTo, $subject, $txt);
          }
        }
        else {
                $txt .= "Bug report received!\n\n"."Message context: \n\n".$message;
                mail($mailTo, $subject, $txt);
        }
}
?>

И мой HTML:

		<center><form class="query-form" method="post">
 <input style="width: 300px;" class="orderId" type="text" name="orderId" placeholder="Order ID.     Leave blank if reporting a bug">
 <br>
 <input required style="width: 300px;" type="text" name="subject" placeholder="Subject">
 <br>
 <textarea required name="message" placeholder="Query text" style="width: 300px;" maxlength = "700"></textarea>
 <br>
 <input type="submit" name="submit" placeholder="Send Query">
</form></center>

Когда я заполняю orderId ввод и символы целевого типа, которых нет в моей таблице («тест»), он все равно отправляет электронное письмо (хотя должно эхо, что во входных данных нет такого идентификатора заказа:

Запрос получен!

Идентификатор заказа:

Контекст сообщения:

Тест

Но когда я оставляю orderId пустым, PHP работает просто отлично и выдает мне второе сообщение, как и хотел.

Можете ли вы сказать мне, почему это просто проходит через это код

1 Ответ

2 голосов
/ 06 марта 2020

Код, который исправил мою проблему, был следующим:

<?php
if (isset($_POST['submit'])) {
    $order = $_POST['orderId'];

    if ($order != "") {
        try {

        $db = new PDO('mysql:host=localhost;dbname=dbname;charset=utf8', 'username', 'password');

        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $order = $_POST['orderId'];

        $stmt = $db->prepare("SELECT * FROM Orders where OrderId = :orderid ");
        $stmt->execute([ ':orderid' => $order ]);
        if ($stmt->fetch(PDO::FETCH_ASSOC)) {
            $subject = $_POST['subject'];
            $message = $_POST['message'];
            $order = $_POST['orderId'];
            $mailTo = "mail@mail.com";
            $txt .= "Query Received!\n\nOrder ID: ".$order."\n\nMessage context: \n\n".$message;
            mail($mailTo, $subject, $txt);
        }
        else {
            echo "No such ID.";
        }

        }
        catch (PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
    }
    else {
        $subject = $_POST['subject'];
        $message = $_POST['message'];
        $order = $_POST['orderId'];
        $mailTo = "mail@mail.com";
        $txt .= "Report received!\n\n"."Message context: \n\n".$message;
        mail($mailTo, $subject, $txt);
    }
}
?>

Создание кода для работы


Проблема с исходным кодом была частью if (!$row = $stmt->fetch(PDO::FETCH_ASSOC)). Это не сработало.

Поэтому после выполнения $stmt->execute([ ':orderid' => $order ]); необходимо было извлечь данные, найденные в таблице, а затем, если есть такая строка, отправить электронное письмо. Если такой строки нет, выведите ошибку «Нет такого идентификатора».

if ($stmt->fetch(PDO::FETCH_ASSOC)) {
  $subject = $_POST['subject'];
  $message = $_POST['message'];
  $order = $_POST['orderId'];
  $mailTo = "mail@mail.com";
  $txt .= "Query Received!\n\nOrder ID: ".$order."\n\nMessage context: \n\n".$message;
  mail($mailTo, $subject, $txt);
}
else {
  echo "No such ID.";
}

Кроме того, я переместил часть кода, который отправляет электронную почту для запуска отдельно со всеми ее переменными после выполнения всей работы с поиском :

  1. Если orderId input пуст или нет: if ($order != "")
  2. Если orderId input пуст, проверьте, есть ли в таблице фактическая строка, указанная в OrderId input

В конце используется catch, который в процессе кодирования сам по себе помогает проверить, работает ли код в try

Подробнее о подготовленных выражениях: https://www.php.net/manual/en/pdo.prepared-statements.php

Подробнее о соединениях PDO и управлении соединениями: https://www.php.net/manual/en/pdo.connections.php

Предотвращение SQL впрыск


Артикул Как я могу предотвратить SQL инъекцию в PHP?

Использование setAttribute() при подключении к базе данных:

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Что является обязательным , однако это первая строка setAttribute(), которая указывает PDO отключить эмулированные подготовленные операторы и использовать реальные пред урезанные заявления. Это гарантирует, что оператор и значения не будут проанализированы PHP перед отправкой его на сервер MySQL (не давая возможному злоумышленнику возможности внедрить вредоносное SQL).

Second , используя подготовленные операторы при поиске указанной строки:

$order = $_POST['orderId'];

$stmt = $db->prepare("SELECT * FROM Orders where OrderId = :orderid ");
$stmt->execute([ ':orderid' => $order ]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...