Как сделать INSERT INTO более одного раза в таблице с PDO и MySQL? - PullRequest
0 голосов
/ 28 ноября 2011

Я построил две таблицы со следующим SQL:

CREATE TABLE state(
   IDstate INTEGER not null auto_increment,
   state_name VARCHAR(40) not null,
   UNIQUE(state_name),
   CONSTRAINT IDstate PRIMARY KEY(IDstate)
)auto_increment=100;

CREATE TABLE city(
   IDcity INTEGER not null auto_increment,
   city_name VARCHAR(60) not null,
   IDstate INTEGER not null,
   CONSTRAINT IDcity PRIMARY KEY(IDcity),
   CONSTRAINT IDstate FOREIGN KEY(IDstate) REFERENCES state(IDstate)
)auto_increment=100;

Я хочу создать функцию с PHP-PDO-MySQL, я уверен в следующем:

  1. Моя функция получает два параметра: $state, $city.
  2. Я должен избегать повторения значений.

    $dbcon=new PDO('mysql:host=localhost; dbname=hotel','root', '');
    $sql = "SELECT IDstate FROM state WHERE state_name=:state_name";
    $query = $dbcon->prepare($sql);
    $query->execute(array(':state_name'=>$state_name));
    $array = $query->fetchAll();
    if ($query->rowCount() == 0){
      $sql = "INSERT INTO state (state_name) VALUES (:state_name);";
      $query = $dbcon->prepare($sql);
      $query->execute(array(':state_name'=>$state_name));
      $sql = "INSERT INTO city (city_name, IDstate) VALUES (:city_name, :IDstate);";
      $query = $dbcon->prepare($sql);
      $query->execute(array(':city_name'=>$city_name, ':IDstate'=>$dbcon->lastInsertId()));
    } else {
      $IDstate = $array[0]['IDstate'];
      $sql = "INSERT INTO city (city_name, IDstate) VALUES (:city_name, :IDstate)";
      $query = $dbcon->prepare($sql);
      $query->execute(array(':city_name'=>$city_name, ':IDstate'=>$IDstate));
      print_r($query->rowCount());
    }
    

Мне нужноохватывают следующие параметры:

  1. Вставить новый штат и город.
  2. Вставить новый город для существующего штата.
  3. Избегайте вставки как для существующего штата, так и для города.

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

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

Iхотел бы ваше мнение и совет.

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

Transactions используются для достижения атомарности, согласованности, изоляции и долговечности (ACID). Это либо все операторы insert, которые должны выполняться, либо, если один из них завершится неудачно, все остальные должны быть откатаны. Мы начинаем транзакцию, затем продолжаем выполнение insert операторов, если после выполнения всех операторов не возникает технической / бизнес-ошибки, тогда commit транзакция остальное rollback. В случае отката все операторы вставки будут отменены, выполненные после начала transaction. Если это то, что вы хотите, вот ссылка, чтобы сделать несколько вставок с помощью транзакций.

http://php.net/manual/en/pdo.transactions.php

0 голосов
/ 28 ноября 2011

Итак, это может не полностью ответить на ваш вопрос, но вот мои мысли:

  • , если это работает, не исправляйте это.
  • Какой двигатель вы используете?Если вы используете таблицы MyISAM MySQL, он не будет поддерживать транзакции и не будет возвращать ошибку.
  • В зависимости от того, какой объем вы ожидаете, то, что у вас есть, не должно быть слишком медленным.
  • Добавьте ограничение на ваш выбор, поскольку вы получаете только 1 название штата.Пределы значительно увеличивают производительность.
  • Самое длинное название штата США - 13 символов, а не 40
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...