doppelte Datensätze unterbinden

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • doppelte Datensätze unterbinden

    Hallo zusammen,

    ich lasse den User über mehrere Seiten Daten eingeben, um diese dann am Ende gesammelt in verschiedene Tabellen zu schreiben.
    Dieses schreiben soll aber nur einmal möglich sein, sprich der Reloadbutton des Browsers soll ignoriert werden, da bei dem schreiben eine eindeutige Nummer erzeugt wird.
    Momentan wird bei jedem aktualisieren im Browser um eins erhöht und geschrieben. Mein Gedanke war es, über den SQL-FEhler 1062 das abzufanken, aber das haut gar nicht hin. Wie mache ich das am beten??? Hab schon nach reloadsperre gesucht. Da bin ich aber nicht wirklich fündig geworden. Hier das Script dazu:

    PHP-Code:
    require_once($root "/functions/db_connection.php");

    $letzte_au_nr "";

    $error = array();

    $query "SELECT * FROM auftraege ORDER BY au_nr DESC LIMIT 1";
    $result mysql_query($query);
    if (!
    $result)
    {
        die (
    'Ungültige Abfrage: ' mysql_error());
    }
    while(
    $row mysql_fetch_assoc($result))
    {
        
    $letzte_au_nr $row['au_nr'];
    }


    $query "INSERT INTO auftraege SET au_nr='" $neue_au_nr ."'";
    $result mysql_query($query);
    if (!
    $result)
    {
        if(
    mysql_errno() == 1062)
        {
            
    array_push($error"AU-Nr schon vorhanden");
        }
        else
        {
            die (
    'Ungültige Abfrage: ' mysql_error());
        } 
    }

    $neue_au_nr $letzte_au_nr 1;

    if(
    count($error) == 0)
         {


    ....
    Hier kommen die ganzen INSERT INTO .....


    }
    else
        {
            echo 
    "<div id='fehler'>";
            if (isset(
    $error) && count($error) > 0//Prüfen ob array $error da ist UND ob es einen Eintrag hat.
            
    {
                  for (
    $i=0$i count($error); $i++) //Ausgabe aller Einträge des Arrays $error
                 
    {
                      
                    echo 
    $error[$i] . "<br />";
                     
                } 
            }
            echo 
    "</div>";
        } 
    Über Hilfe und Unterstützung würde ich mich freuen


    Gruß

    Michael
    Gruß

    Michael

  • #2
    Hab schon nach reloadsperre gesucht.
    http://www.contentmanager.de/magazin...erhindern.html
    Vielleicht hilft dir das
    "I don't want to belong to any club that would accept me as a member."

    Groucho Marx

    Kommentar


    • #3
      Hm, also nur dafür eine Klasse finde ich etwas oversized. Das Prinzip, das dahinter steckt, soll dabei nicht kritisiert sein.
      Nieder mit der Camel Case-Konvention

      Kommentar


      • #4
        Hmm, dass ist wirklich etwas zu dick aufgetragen. Das geht doch auch sicherlich einfacher/anders.
        Ich hab zwar jetzt die Kiste ein paar Stunden aus gehabt, aber irgendwie keine neuen Ansätze entwickeln können.

        Wie kann ich das am besten lösen, zumal ich kein form habe. D.h. sobald das Script startet muss geprüft werden, ob es den Satz schon gibt und wenn nein eintragen (Script wird von der vorigen Seite aufegerufen so wie es sein soll) , ansonsten eine Fehlermeldung in das error-array pushen (Reload-Fall)


        Danke und Gruß

        Michael
        Gruß

        Michael

        Kommentar


        • #5
          Bis auf die Tatsache, dass du $neue_au_nr erst nach der Benutzung definierst, sieht es für mich danach aus, als ob dein feld au_nr unique sein müsste. Klick
          Dann könntest du das zumindest überprüfen.
          Ansonsten empfielt sich für sowas immer der Typ "primary Key" mit "auto_increment".. Dann brauchst du nicht die letzte Abfragen..


          mfg

          Kommentar


          • #6
            Das Feld au-nr ist unique und in en entsprechenden Tabellen gibt es jeweils ein Feld id, das den primärKey bildet und auto_increment ist.

            Die id kann ich aber nicht als au_nr heranziehen, denn sollte mal ein Satz gelöscht werden, stimmt die Reihenfolde der au_nr nicht mehr.
            Deshalb muss diese von Hand, sprich vom Script, erzeugt werden.


            Gruß

            Michael
            Gruß

            Michael

            Kommentar


            • #7
              Die id kann ich aber nicht als au_nr heranziehen, denn sollte mal ein Satz gelöscht werden, stimmt die Reihenfolde der au_nr nicht mehr.
              Da du ID ja Auto_increment gesetzt hast, wird weiter gezählt. Löscht du einen, entsteht eine Lücke in der ID-Reihenfolge, aber sie wird nicht aufgefüllt. (soweit ich weiß)

              mfg

              Kommentar


              • #8
                Wie dem auch immer sein mag (ich glaub Du hast recht, ich war da jetzt falsch), aber wie kann ich das unter den gegebenen Voraussetzungen angehen ?

                Gruß

                Michael
                Gruß

                Michael

                Kommentar


                • #9
                  Da ist deine Methode schon recht sinnvoll..
                  Also gucken, ob bei unique ne Dopplung auftritt und Fehler abfangen.

                  mfg

                  Kommentar


                  • #10
                    Ich kümmere mich morgen weiter drum. Heute gönne ich mir einen freien Abend.


                    Gruß

                    Michael
                    Gruß

                    Michael

                    Kommentar


                    • #11
                      Guten Morgen,

                      was so ein freier Abend doch bewirkt. Heute morgen kam mir dann die Eingebung wie ich das ganz einfach lösen kann. Und zwar so:

                      PHP-Code:
                      if(isset($_SESSION['is_saved']) &&  $_SESSION['is_saved'] == "gespeichert")
                      {
                          
                      array_push($error"Datensatz wurde bereits gespeichert");
                      }    
                      else
                      {
                          
                      $query "SELECT * FROM auftraege ORDER BY au_nr DESC LIMIT 1";
                          
                      $result mysql_query($query);
                          if (!
                      $result)
                          {
                              die (
                      'Ungültige Abfrage: ' mysql_error());
                          }
                          while(
                      $row mysql_fetch_assoc($result))
                          {
                              
                      $letzte_au_nr $row['au_nr'];
                          }

                          
                      $neue_au_nr $letzte_au_nr 1;
                      }





                      if(
                      count($error) == 0)
                      {
                          
                      $_SESSION['is_saved'] = "gespeichert";
                              
                          ... 
                      alle Querys werden ausgeführt ...
                      }

                      else
                      {
                          echo 
                      "<div id='fehler'>";
                          if (isset(
                      $error) && count($error) > 0//Prüfen ob array $error da ist UND ob es einen Eintrag hat.
                          
                      {
                               for (
                      $i=0$i count($error); $i++) //Ausgabe aller Einträge des Arrays $error
                               
                      {
                                    echo 
                      $error[$i] . "<br />";
                               } 
                          }
                          echo 
                      "</div>";


                      Wenn die Session-Variable gesetzt ist, sind die querys bereits durchgeführt worden. Beim Reload wird in der ersten if geprüft, ob die Session-Variable gesetzt ist. Sollte dem so sein, wird ins array gepusht und somit kann nicht mehr neu in die Tabellen geschrieben werden.
                      Ist die Variable nicht gesetzt, wird eine neue au_nr erzeugt und die querys werden durchgeführt.


                      Gruß

                      Michael
                      Gruß

                      Michael

                      Kommentar


                      • #12
                        Noch ein kleiner Hinweis zur Optimierung:
                        PHP-Manual:
                        Note: If you use array_push() to add one element to the array it's better to use $array[] = because in that way there is no overhead of calling a function.
                        Grüße
                        Zuletzt geändert von Griecherus; 20.10.2008, 13:18.
                        Nieder mit der Camel Case-Konvention

                        Kommentar


                        • #13
                          Ok, wird noch nachgerüstet. Danke !


                          gruß

                          Michael
                          Gruß

                          Michael

                          Kommentar

                          Lädt...
                          X