Код, который исправил мою проблему, был следующим:
<?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.";
}
Кроме того, я переместил часть кода, который отправляет электронную почту для запуска отдельно со всеми ее переменными после выполнения всей работы с поиском :
- Если orderId
input
пуст или нет: if ($order != "")
- Если 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 ]);