2015-06-02 9 views
1

Мне интересно, что лучше всего подходит для ошибок проверки возврата из хранимой процедуры 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 

конец

ответ

1

Почему бы запустить проверку в хранимой процедуре? почему бы не использовать php для проверки формата в первую очередь. Тогда вторая проверка будет этот запрос

ВЫБРАТЬ 1 из писем, где электронная почта = «[email protected]» LIMIT 1

если это возвращение запроса 1, что означает, что существует запись?

Если вы хотите использовать хранимую процедуру, которая здесь является более убитой.

Вы можете использовать SQLEXCEPTION HANDLER

что-то вроде этого

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 
    BEGIN 
     GET DIAGNOSTICS CONDITION 1 
     @err_sqlstate = RETURNED_SQLSTATE, 
     @err_message = MESSAGE_TEXT, 
     @err_num = MYSQL_ERRNO; 

     SET @hasError = TRUE; 
    END; 

После выполнения запроса вы можете сделать что-то вроде этого

IF(@hasError) 

SELECT CONCAT("[", 
     GROUP_CONCAT(
      CONCAT("{message:'", @err_message,"'"), 
      CONCAT(",sqlState:'",@err_sqlstate),"'}") 
    ) 
,"]") AS jSON 
END IF; 
+0

Может быть, проверка была неправильно термин, формат строки проверяется в PHP, но другие факторы, такие как принудительное выполнение одной записи, должны выполняться с помощью SQL. Я обновлю пример хранимой процедуры, чтобы уточнить мой вопрос. –

Смежные вопросы