Мне интересно, что лучше всего подходит для ошибок проверки возврата из хранимой процедуры MySQL в приложение PHP. Я видел как Signals, так и используемые строки, но я ищу способ автоматически обрабатывать ошибки, чтобы их можно было сопоставить с полем формы.Проверка достоверности хранимой процедуры MySQL
Например, если у меня есть регистрационная форма, мне нужно убедиться, что письмо еще не существует в системе. Поэтому мне нужна хранимая процедура, чтобы вернуть ключ => значение ex. "email" => "Duplicate entry for email"
Я также думаю, что может не иметь смысла хранить сообщения (которые будут отправлены клиенту) в базе данных. Уходя пример электронной почты выше, "email" => "1062"
, то внутри приложения PHP, есть карта, 1062 => "$key already exists."
Я бы хорошо, чтобы быть в состоянии держать ключ => (значение/сообщение об ошибке) связи с тем объект ответа AJAX мог содержать что-то вроде
// Http Status 400
{ "email": "Email already exists", "name": "Name is required" }
Таким образом, ключ электронной почты и имя, и быть непосредственно связаны с их входами «имя» и «электронная почта».
<form>
<input name="name"/>
<input name="email"/>
<input type="submit" value="Submit"/>
</form>
<?php
$sanitizedInput = $_POST; //Pretend this data is actually sanitized.
$pdo = new PDO($dsn, $username, $password);
$stmt = $pdo->prepare("CALL registerUser(?, ?)");
$stmt->bindParam(1, $sanitizedInput["name"]);
$stmt->bindParam(2, $sanitizedInput["email"]);
#Whats the best method for processing?
try{
if($stmt->execute()){
}else{
}
}catch(PDOException $e){
//I want to prevent doing string comparisons if possible
//Signal example
//It seems like this step could be automated and reused.
//For example, if we allow a user to update their email address,
//we could have the string 'Duplicate entry for email' in the
//codebase twice, and it seems like the process could be easily broken.
if($stmt->errorInfo[2] == 'Duplicate entry for email'){
return array('email' => 'Email already exists');
}
}
?>
#SQL
signal sqlstate = '45000' set message_text = 'Duplicate entry for email'
create procedure registerUser(
name varchar(50),
email varchar(50)
)
begin
declare emailExists int(0);
select count(*) into emailExists from users where email = email;
if emailExists = 0 then
insert into users values(default, name, email);
else
//Return {email: 'Duplicate entry for email'}
end
конец
Может быть, проверка была неправильно термин, формат строки проверяется в PHP, но другие факторы, такие как принудительное выполнение одной записи, должны выполняться с помощью SQL. Я обновлю пример хранимой процедуры, чтобы уточнить мой вопрос. –