предотвратите дублирующиеся данные записи все еще никакая функция

я попытался предотвратить дублирующиеся данные в своем проекте. но до сих пор это все еще делает дубликат. я пробую этот код, но все еще не работаю:

  $cek_user= "SELECT Model, Serial_number, Line FROM inspection_report WHERE Model='".$Model."' AND Serial_number='".$Serial_number."' AND Line='".$Line."'";
  $cek_data=mysql_num_rows($cek_user);
  if($cek_data!=0){
                    echo "Data already exists!";
                   }
  else{
  $sql = "INSERT INTO inspection_report ";
  $sql.= "(Model,       Serial_number,       Line,        Shift,     Inspection_datetime,         Range_sampling,       Packing, ";
  $sql.= "Accesories,       Appearance,      Tuner,        General_operation,       Remark, ";
  $sql.= "NIK) ";
  $sql.= "VALUES ('";
  $sql.= $Model."','".$Serial_number."', '".$Line."','".$Shift."','".postVar('insp_date')." ".postVar('time')."','".$Range_sampling."','".$Packing."','";
  $sql.= $Accesories."','".$Appearance."','".$Tuner."','".$General_operation."','".$Remark."','";
  $sql.= $NIK."')";
//echo $sql;

$result=mysql_query($sql) or die(_ERROR26.": ".mysql_error());
//echo $result;
}
mysql_close($dbc);
}

но все еще работа, помогите.

1
задан klox 4 August 2010 в 05:24
поделиться

4 ответа

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

1
ответ дан 2 September 2019 в 22:31
поделиться

Вы можете сделать select перед insert, например. Select id from table where serial_number = '$serial_number' Если mysql_num_rows равно 0, выполните вставку. Это предполагает, что серийный_номер уникален для каждой строки.

$sql = "SELECT ID FROM inspection_report WHERE Serial_number = '$Serial_number'";
$result = mysql_query($sql);

if(mysql_num_rows($result) == 0){
  $sql = "your insert sql..."
  $result = mysql_query($sql);
}
1
ответ дан 2 September 2019 в 22:31
поделиться

Вы ведь понимаете, что выполняете запрос INSERT дважды, верно?

if ( mysql_query($sql) ) {
     ^^^^^^^^^^^--- here
    [.... snip ....]
} 
$result=mysql_query($sql) or die(_ERROR26.": ".mysql_error());
        ^^^^^^^^^^^--- and here

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

$insp_date = postVar('insp_date') . ' ' . postVar('time');
$sql = <<<EOL
INSERT INTO inspection_report
    (Model, Serial_number, Line, Shift, Inspection_datetime,
    Range_sampling, Packing, Accesories, Appearance, Tuner,
    General_operation, Remark, NIK)
VALUES (
    $Model, $Serial_number, $Line, $Shift, $insp_date,
    $Range_sampling, $Packing, $Accesories, $Appearance, $Tuner,
    $General_operation, $Remark, $NIK)
EOL;

, чуть более читаемым.

продолжение редактирования / комментария:

Вы запускаете запрос дважды, в тех местах, где я поместил строки '^^^^^ --- здесь'.

Первый экземпляр: if (mysql_query ($ sql)) {
Второй экземпляр: $ result = mysql_query ($ sql) or die .......

У вас нет t изменил содержимое $ sql между двумя вызовами mysql_query () , поэтому, когда вы выполняете второй вызов, он запускает ту же строку запроса, которая является вашим запросом INSERT. Таким образом, вы вставляете данные ДВАЖДЫ.

Кроме того, ваша обработка ошибок ужасна. Сканирование строки ошибки для конкретной строки - неправильный путь. Текст ошибки может измениться (подумайте, что произойдет, если ваш код будет запущен на сервере (скажем) в немецком регионе, который имеет локализованные сообщения об ошибках и выдает «Doppelter eintrag für ...» вместо «Повторяющаяся запись для» У вас должно получиться что-то вроде этого:

$sql = "... your query here ... "

$result = mysql_query($sql); // if query fails, this returns FALSE

if ($result === FALSE) {
    die("MySQL error: " . mysql_error());
}

Если вам нужно проверить конкретную ошибку, которую можно исправить с помощью вашего кода, вы можете использовать mysql_errno () , чтобы получить код ошибки сервера, и работать оттуда.В вашем примере «Повторяющаяся запись» - это ошибка № 1062 (полные коды ошибок задокументированы здесь ), поэтому вы должны сделать

if (mysql_error() == 1062) {
    ... handle error here ...
}
0
ответ дан 2 September 2019 в 22:31
поделиться

в первую очередь:

ALTER inspection_report ADD UNIQUE(Model, Serial_number, Line);

Затем:

$sql = "INSERT IGNORE INTO..........";
0
ответ дан 2 September 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: