Возврат MySQL Код ошибки и пользовательский ответ с использованием подготовленного оператора PHP - PullRequest
3 голосов
/ 22 января 2020

Я создал базу данных MySQL и отправил ей POST запросы через мое приложение Flutter и использовал Prepare Statement для предотвращения SQL Injection. Я возвращаю сообщения об ошибках в необработанном виде, используя mysqli->error. Вот мой код.

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
include("connection.php");

$query=$connection->prepare("insert into parent_child_table(`parent_id`, `child_reg_number`) values(?,?)");
$query->bind_param("is",$parent_id,$reg_number);

$parent_id=$_POST["parent_id"];
$reg_number=$_POST["reg_number"];

if ($query->execute()) {
echo "1";
} else {
  echo("$mysqli -> error");
}?>

В чем проблема? / Текущий ответ в случае ошибки

Сообщение об ошибке отображается в необработанном виде всякий раз, когда база данных выдает ошибку, подобную этой.

Неустранимая ошибка : Uncaught mysqli_sql_exception: Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (parent_child_table, CONSTRAINT FK_child_reg_number FOREIGN KEY (child_reg_number) ССЫЛКИ Student (reg_number)) в / storage / ssd1 / 900 /12273900/public_html/add_new_child.php:11
Трассировка стека:
0 /storage/ssd1/900/12273900/public_html/add_new_child.php(11): mysqli_stmt-> execute () * 10 * 1 {main} добавляется в / storage / ssd1 / 900/12273900 / public_html / add_new_child. php on line 11

Что я хочу сделать?
Я хочу отправить MySQL код ответа или отформатированное сообщение об ошибке (которое я обязательно напишу на основе код ошибки). Как я могу этого достичь? Есть ли какой-нибудь метод предварительной сборки? Я новичок ie до PHP. Я надеюсь, что кто-то предложит мне лучшее решение моей проблемы. Спасибо
Ожидаемый ответ

  • Ребенок уже зарегистрирован (в случае нарушения первичного ключа. Я использую составной первичный ключ)
  • Неверный Reg # или Reg # не существует (в случае нарушения внешнего ключа)

1 Ответ

3 голосов
/ 22 января 2020

Прежде всего, вы должны понимать, что выводить сообщения об ошибках прямо сейчас не рекомендуется . Как правило, ваше приложение не раскрывает свою внутреннюю работу, включая сообщения об ошибках.

Следовательно, echo $mysqli->error; (это правильный синтаксис для операции. Ни кавычки, ни скобки не используются с echo заявлениями.) недопустимое поведение.

Тем не менее, проверка действительного сообщения об ошибке и создание пользовательского ответа является хорошей практикой. Для этого вы можете catch исключение. И написать код, чтобы справиться с вашей ситуацией. В вашем случае это будет выглядеть так:

<?php
ini_set('display_errors', 0); // this will prevent PHP from displaying errors
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT ); // has to be moved in connection.php
include("connection.php");

$sql = "insert into parent_child_table(`parent_id`, `child_reg_number`) values(?,?)";
$query = $connection->prepare($sql);
$query->bind_param("is",$parent_id,$reg_number);

$parent_id=$_POST["parent_id"];
$reg_number=$_POST["reg_number"];

try {
    $query->execute();
} catch (mysqli_sql_exception $e) {
    if ($e->getCode() == /* the code for Foreign Key Violation */ ) {
        echo "Wrong Reg # or the Reg # doesn't exist";
    } elseif ($e->getCode() == /* the code for Primary key Violation */ ) {
        echo "Child Already Registered";
    } else {
        throw $e; // the most important part - ALL OTHER errors won't go unnoticed
    }
}

Итак, в вашем скрипте есть три основных изменения

  • Выявление ошибок отключено (должно быть сделано на живом сайте)
  • try catch добавлен, чтобы перехватить ошибку
  • оператор else добавлен в обработчик ошибок, поэтому вы будете информированы обо всех других ошибках, которые могут возникнуть. Вы можете настроить PHP для регистрации ошибок, чтобы их видеть.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...