Вставьте один раз, но две записи, созданные в MySQL - PullRequest
2 голосов
/ 14 сентября 2009
for($i = 1 ; $i <= 3; $i++)
{
    if(!empty($_POST['fl' . $i]))
    {
        $dml = "insert into flAptitude(accountId,language,qualification,certificate) value($accountId,'" . $_POST['fl' . $i] . "','" . $_POST['qualification' . $i] . "','" . $_POST['certificate' . $i] . "')";
        mysql_query($dml,$con);
        file_put_contents("fl$i.txt",$dml);
    }
}

И создается только fl1.txt, содержание которого:

insert into flAptitude(accountId,language,qualification,certificate) value(1,'Germany','Excellent',NULL)

Итак, при каких условиях MySQL сгенерирует 2 записи для 1 оператора "insert"?

EDIT Вот определение таблицы:

mysql> show create table flAptitude\G
*************************** 1. row ***************************
       Table: flAptitude
Create Table: CREATE TABLE `flaptitude` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `accountId` int(10) unsigned default NULL,
  `language` varchar(15) NOT NULL,
  `qualification` int(10) unsigned default NULL,
  `certificate` varchar(20) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

Имеет ли это какое-либо отношение к AUTO_INCREMENT = 3? Что это значит?

Ответы [ 5 ]

3 голосов
/ 14 сентября 2009

Бритва Оккама говорит мне, что вы, вероятно, дважды перебрали эту штуку с помощью внешней петли. Это также может произойти, если у вас был неверно сформированный триггер на столе, который дублировал результаты. Кроме того, нам нужно было увидеть, что было select * from flAptitude до и после того, как этот код запускался, чтобы лучше понять, что он делает.

AUTO_INCREMENT=3 просто означает, что столбец автоинкремента начинается с 3 вместо значения по умолчанию 1.

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

2 голосов
/ 14 сентября 2009

Это проблема php, а не проблема с MySQL. Вопрос file_put_contents() переписывает содержимое файла. Поэтому, когда ваш цикл происходит (повторяется дважды), в ваш журнал вставляется только последняя запись.

Попробуйте это:

$file = "fl{$i}.txt";
$current = file_get_contents($file);
$current .= $dml . "\n";
file_put_contents($file, $current);

Подробнее о file_put_contents() здесь .

1 голос
/ 08 апреля 2013

Вы написали свои вопросы в 2009 году, но, возможно, мой ответ будет полезен для других ...

У меня была такая же проблема. В моем случае это был FirePHP. Дополнение к Chrome / Firefox. Это (я не знаю почему) удвоило мои сценарии. Когда я запускал браузер без расширений, все было в порядке.

1 голос
/ 14 сентября 2009

Чтобы ответить на последнюю часть вашего вопроса, нет, это не имеет ничего общего с AUTO_INCREMENT, который является атрибутом для автоматического определения новых строк , в данном случае начиная с 3

0 голосов
/ 11 октября 2011

Я нашел, что эту проблему можно решить, поставив exit(); после моего оператора заголовка;

  $sql = "INSERT INTO airline SET
            company         = '$company',
            name            = '$name',
            address1        = '$address1',
            address2        = '$address2',
            city            = '$city',
            st              = '$st',
            zip             = '$zip',
            ph1             = '$ph1',
            ph2             = '$ph2',
            fax             = '$fax',
            email           = '$email',
            web             = '$web',
            date            = '$date'";

  if (!mysql_query($sql)) {
    mysql_close();
    die("<p><b>Record Not Added </b><br />" . mysql_error() . "</p>");
  }
  else {
    mysql_close();
    $goto = "Location: $php_self";
    header($goto);
    exit();
  }

Когда я опускал exit();, код добавлял 2 записи с одинаковыми данными, но увеличивая ID. Добавление выхода заставило скрипт писать только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...