2013-09-03 2 views
0

Я построил функцию, в которой выполняются два запроса. Оба этих запроса вставляют данные в две отдельные таблицы, данные, связанные с регистрацией пользователя. в одной таблице вещи, как имя пользователя, пароль проводятся и в другой таблице вещи, как адрес, телефон и т.д. ... Вот функция:обработка ошибок при выполнении 2 запросов mysql

function register_biz_user($post,$connection) 

    { 
    $name=$connection-> real_escape_string($_POST['name']); 
    $lastname= $connection->real_escape_string($_POST['lastname']); 
    $pass_hashed = password::hash($_POST['password']); 

    $passwd= $connection->real_escape_string($pass_hashed); 
    $buztype= $connection->real_escape_string($_POST['buztype']); 
    $usertype= $connection->real_escape_string($_POST['usertype']); 
    $address= $connection->real_escape_string($_POST['address']); 
    $city= $connection->real_escape_string($_POST['city']); 
    $municipality= $connection->real_escape_string($_POST['municipality']); 
    $url= $connection->real_escape_string($_POST['wwwaddress']); 
    $email= $connection->real_escape_string($_POST['e-mail']); 
    $phone= $connection->real_escape_string($_POST['phone']); 
    $hash =$connection->real_escape_string(md5(rand(0,1000))) ; 


     $connection->set_charset("utf8"); 

     $result1 = $connection->query("insert into users values 
     (NULL,'" .$name. "','" .$lastname . "','".$email."','". $passwd."','".     
     $hash."','". $usertype."')"); 

     if (!$result1) { 
      throw new Exception('error'); 
     return false;           
     } 



     else{$result2=$connection->query("insert into business_users values 
      ('".$connection->insert_id."','" .$address."','".$url ."','".$phone. 
      "','".$city. "','".$municipality. "','".$buztype. "')"); 
      } 
     if(!$result2) 
     { throw new Exception('error'); 
      return false;} 

возвращение правда; }

А вот моя проблема: Если вы посмотрите на код, вы можете заметить, что существует проблема, что первый запрос выполняется без проблем и второй бросает исключение или вице verca.

Я хочу сказать, что существует опасность того, что у db будут ТОЛЬКО частичные данные зарегистрированного пользователя. Цель состоит в том, чтобы либо оба запроса выполнялись успешно, либо не выполнялись.

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

Надеюсь, я был достаточно ясен.

+2

использование сделка. –

+0

@ AndyLester: «широко открытый»? копирование сообщения комментария шаблона не всегда является хорошей идеей. в этом случае я не вижу никаких угроз .. –

+0

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

ответ

1

Использование операции: http://dev.mysql.com/doc/refman/5.0/en/commit.html

BEGIN 
... queries ... 
COMMIT or ROLLBACK 

Примечание: "или наоборот verca" - это не возможно. В этом случае второй запрос никогда не будет выполнен.

Примечание2:

  • что $post? похоже, не использовался.
  • Почему вы не используете подготовленные заявления? избегание каждого из них очень подвержено ошибкам.
  • Почему у вас есть процедурный интерфейс, минуя $connection? у вас должны быть объекты, которые знают о соединениях с базой данных ... у вас есть смешанный код, по крайней мере, для трех разных слоев ... не обязательно плохо, если вы планируете создавать write-once-get-rid-of-code, но, вероятно, не очень хорошо Идея проекта, которую вы должны поддерживать в течение нескольких месяцев/лет.
+0

Да, я должен посмотреть, как $ post будет использоваться в конце концов ... Я не использую подготовленные заявления, я бы сказал, что это только вопрос о привычке ... почему вы говорите, что $ connection является процедурным интерфейсом ... это то, что возвращается из функции, которая делает соединение с db с использованием MySQLi –

+0

'$ connection' является переменной. 'register_biz_user' - это процедурный интерфейс (объектно-ориентированный). Вам не нужно передавать соединение этому методу. в отношении «привычки» бит ... да, вы можете назвать лучшие практики хорошими привычками;) –

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