2010-08-02 6 views
1

J'ai essayé d'empêcher les données en double à mon projet. mais jusqu'à présent, il fait encore double. i essayer ce code, mais toujours pas:empêcher les données d'entrée en double toujours pas de fonction

$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); 
} 

mais toujours pas, s'il vous plaît aider.

Répondre

1

Cela n'empêchera pas les doublons sauf si votre table a également une contrainte UNIQUE quelque part permettant à la base de données de déterminer ce que vous entendez par un doublon. Si vous avez une telle contrainte, vous pourriez peut-être poster votre définition de table.

+0

J'ai le nom de champ comme "ID" et l'auto-incrémentation – klox

+2

L'incrémentation automatique empêchera l'apparition de lignes complètement dupliquées, car il s'assurera qu'elles diffèrent dans la colonne auto-incrémentée. Quel est l'identifiant unique des objets réels que vous modélisez dans votre tableau? Vous devez créer un 'UNIQUE KEY' ou' UNIQUE INDEX' sur les colonnes contenant l'identificateur unique. Dans votre cas, Model et Serial_Number peuvent être l'identifiant unique. Créez un index unique sur ces colonnes. –

+0

voulez-vous dire que je dois changer le modèle et les paramètres série deviennent CLÉ UNIQUE? Et que dois-je faire après les avoir changé? – klox

1

Vous pouvez effectuer une sélection avant l'insertion, par exemple. Sélectionnez id de la table où serial_number = '$ serial_number' Si mysql_num_rows est égal à 0, insérez-le. Cela suppose que serial_number est unique pour chaque ligne.

$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); 
} 
+0

pouvez-vous taper comme script mysql ou php, il plus facile à lire – klox

+0

script PHP ajouté. – subroutines

+0

oh no..it devient show 500 erreur interne du serveur. – klox

0

Vous réalisez que vous exécutez deux fois la requête INSERT, n'est-ce pas? De plus, vous devriez envisager d'utiliser HEREDOC pour construire votre chaîne de requête. Cette longue partie de concaténation de chaîne et devis soupe que vous avez pourrait ressembler à ceci avec un 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; 

tous un peu plus lisible si.

modifier/commentaire suivi:

Vous êtes en cours d'exécution de la requête deux fois, dans les endroits où j'ai mis les lignes '^^^^^ --- ici.

première instance: if (mysql_query($sql)) {
Deuxième instance: $result = mysql_query($sql) or die.......

Vous avez pas changé le contenu de $sql entre les deux mysql_query() appels, de sorte que lorsque vous faites le deuxième appel, il exécute exactement la même chaîne de requête, qui est votre requête INSERT. Donc, vous finissez par insérer les données deux fois. Au-delà, votre gestion des erreurs est atroce. L'analyse d'une chaîne d'erreur pour une chaîne particulière est la mauvaise façon de procéder. Le texte d'erreur peut changer (pensez à ce qui se passerait si votre code s'exécutait sur un serveur s'exécutant dans un site allemand, par exemple, qui contient des messages d'erreur localisés et crache "Doppelter eintrag für ..." au lieu de "Dupliquer l'entrée pour" . ce que vous devriez avoir quelque chose comme ceci:

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

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

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

Si vous devez vérifier une erreur particulière qui pourrait être corrigée par votre code, vous pouvez utiliser mysql_errno() pour récupérer le code d'erreur de serveur, et le travail à partir de là.En utilisant votre exemple, 'entrée en double' est une erreur # 1062 (codes d'erreur complète documented here), alors vous feriez

if (mysql_error() == 1062) { 
    ... handle error here ... 
} 
+0

if (mysql_query ($ sql)) { ^^^^^^^^^^^ --- ici [.... snip ....] } $ resultat = requête mysql ($ sql) ou die (_ERROR26. ":" .mysql_error()); ^^^^^^^^^^^ --- et ici je ne comprends pas ce que vous voulez dire .. – klox

0

d'abord:

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

Puis:

$sql = "INSERT IGNORE INTO.........."; 
Questions connexes