я попытался предотвратить дублирующиеся данные в своем проекте. но до сих пор это все еще делает дубликат. я пробую этот код, но все еще не работаю:
$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);
}
но все еще работа, помогите.
Это не предотвратит дублирование, если ваша таблица также не имеет где-то ограничение UNIQUE, позволяющее базе данных определить, что вы подразумеваете под дубликатом. Если у вас есть такое ограничение, возможно, вы могли бы опубликовать определение своей таблицы.
Вы можете сделать 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);
}
Вы ведь понимаете, что выполняете запрос 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 ...
}
в первую очередь:
ALTER inspection_report ADD UNIQUE(Model, Serial_number, Line);
Затем:
$sql = "INSERT IGNORE INTO..........";