PHp - Hilfe!! Abfragen vor Eintrag - Doppeleintrag verhindern

  • Hi Jungs!

    Da ich ja wie Ihr wisst kein Progger bin - wie kann ich vor Eintrag in die MySQL mit nem PHP Script abfragen, ob der Name schon vorhanden ist? Also doppelten Eintrag verhindern.

    Haben HTML Formular und PHO script gebastelt (mal früher) geht auch heute noch und trägt ein und fragt ab, funkt alles. Nur der Befehl oder die Funktion das bei einem gleichlautendem bereits vorhandenem Eintrag in der DB ein neuer Eintrag verhindert wird.

    Wär echt nett, wenn mir da mal jemand nen Codesnippet rüberreichen könnte ;)

  • Codeschnippsel wird schwer, das das Script und die DB unbekannt sind.

    1. Möglichkeit: Eben vor dem Eintrag einen SELECT durchführen mit den Daten die im Formular eingetragen wurden. Wenn ein Datensatz geliefert wird, dann gibt es den schon. Wenn nicht, dann eben nicht und der "INSERT" kann folgen.

    2. Möglichkeit: Wenn es nur eine kleine Tabelle ist und dort wirklich nru Namen eingetragen werden, die niemals doppelt sein können. Dann der Namen-Spalte einen "unique-Index" geben und direkt einen "INSERT IGNORE" durchführen. Schlägt dann fehl, da die Datenbank einen doppelten Eintrag nicht zulässt (da unique-Index).

    Sinnvoller ist aber zu 98% Möglichkeit 1.

    Also in etwa so was da:
    'SELECT id FROM tabelle WHERE name = "'.$name'" AND ... wenn es weitere Kriterien gibt.'

    Genauer kann man es nun nicht sagen, da die Daten unbekannt sind, die da genau eingetragen werden sollen und welche genau dafür verantwortlich sind, ob ein Datensatz als "bereits vorhanden" oder "neu" anzusehen ist.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Vielleicht auch ein Lösungsansatz, der zwar nicht so elegant wie der von Synonym ist, aber sicherlich irgendwo als script zu finden ist, über einen cronjob stündlicht, täglich oder wie auch immer doppelte Datensätze löschen lassen.
    Aber zweifelsfrei ist die erste von synonym aufgeführte Variante die elegantere.

    Frei nach Dieter Nuhr
    Das Internet ist zum Lebensraum der Dauerbeleidigten geworden, die immer einen Grund finden, anderen irgendetwas vorzuwerfen, um sich selbst moralisch zu erhöhen.

  • Hi, mal Danke Jungs für Eure Antworten.
    Es geht im Prinzip um ein Verzeichnis an URL's die dort eingetragen werden sollen. Und ab einer gewissen Grösse kostet das kontrollieren, ob diese URL scho drinnen ist, mehr Arbeit las des eintragen selbst.
    Und was ich einfach benötige ist, wenn die URL schon drinnen ist im Verzeichnis, das das Script den Eintrag gar nicht erst zulässt.

    Das normale Eintragen und Abfragen funktioniert jetzt scho, nur eben das Ding mit dem kontrollieren...

    Hab ja gerade nachsehen wollen im selfphp, aber die haben die ganze Seite umgebaut, und da war mal irgendwo der Code.

    Gruss snowdog

  • Also ist das ein PHP befehl und kein MySQL Befehl, oder?
    Muss erstmal alle Einträge der URL's aus der DB abfragen, dann in nem Aray speichern, das Array überprüfen ob die neu einzutragende URL bereits im Array vorhanden ist, wenn nicht dann Eintrag OK, wenn ja dann Eintrag verhindert?

    Stimmt das ungefähr so?

  • Na, das macht es nun nicht einfacher, einen fertigen Code zu liefern. Aber Du sagst ja, Eintragen und Abfragen funktioniert. Du musst also nur vor dem Eintragen eben einmal Abfragen, ob schon drinnen.

    Das hat nichts mit PHP zu tun, zumindest nicht direkt, sondern ist eher MySQL

    Also, wenn Du was hat, das die URL in die DB schreibt und etwa so ausschaut:

    "INSERT INTO tabelle ('url') VALUES ('https://beispiel.rocks/beispiel.rocks/www.google.de')"

    Dann musst Du vorher eben nur Abfragen ob die URL schon drinnen ist, also eben ein

    Also, so rein theoretisch :)

    $url ist die Variable, die aus der Form kommt. Musst Du halt in Deine ändern. "Tabelle" ebenso. Und ob die Spalte "url" heißt weiß ich auch nicht, also gegebenenfalls anpassen.

    Also eine Abfrage, wie Deine vorhandene auch.

    Das Ergebnis ist dann entweder leer, also nicht vorhanden oder eben nicht. Wenn leer, dann den INSERT ausführen. Wenn nicht, leer, dann was anderes machen oder gar nichts.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Zitat von snowdog;13695

    Also ist das ein PHP befehl und kein MySQL Befehl, oder?


    Du hast ne DB mit ...... Dateien in einem Verzeichniss


    entweder

    SQL
    SELECT COUNT(dateiname)AS c FROM TABLENAME WHERE cat= 123


    oder

    SQL
    SELECT COUNT(dateiname)AS c FROM TABLENAME WHERE cat= '/Ablage1/'


    in "c" steht dann die Anzahl an Dateien im Verzeichniss


    oder in PHP
    Verzeichniss öffnen und dann den inhalt zählen

    Code
    $dirpath ='cms800/template/';
    
    
    		$dhandle=opendir($dirpath);
    		while( (($file = readdir($dhandle)) !== false) )
    		{	if ( filetype($dirpath.$file) == 'dir'   )
    			{
  • hmm mein sql ist was eingerostet, aber da gab es was womit man das prüfen konnte. select ist auf jeden fall schon mal richtig. muss echt mal wieder meine bücher rauuskramen und ein wenig produktiv werden. aber es fehlt einfach die zeit :(

    wenn etwas möglich erscheint mach ich das, wenn das nicht klappt gehts ans unmögliche und ansonsten das undenkbare.

    - nun stolz rauchfrei - Ich denke also Bing ich!

    Support 24h Bereitschaft 0173 6107465 - NUR Für Kunden von SEO NW!

  • *Danke Euch allen, ja das mit PHP und dem eingersotet sein. Ich mein Profi war ich nie, nicht mal nur annähernd guter Durchschnitt, aber hat ne Zeitlang echt Spassgemacht, was zu programmieren und des hat dann auch funktioniert.

    Hat sich inzwischen (auch Dank Synonym) erledigt, und ist eigentlich ganz einfach bei mir mit Auto Increment erledigt gewesen, weil da gibts keine doppelten Einträge, sondern muss jeder Unique sein.

  • Zitat von snowdog;13744

    Hat sich inzwischen (auch Dank Synonym) erledigt, und ist eigentlich ganz einfach bei mir mit Auto Increment erledigt gewesen, weil da gibts keine doppelten Einträge, sondern muss jeder Unique sein.


    "Auto increment" war neu für dich?

    für mich war (ist) dieses "Insert Ignore" was neues .... ich nutze die letzte Zeit öffter "REPLACE INTO" damit gibt es dann auch immer nur einen .....

    bei einem, z.B. MitgliederRegister, ist aber nen "Replace" nicht gut
    Wenn es da einen Andy gibt und dann kommt ein neuer Andy dann gibt es den ersten Andy nicht mehr
    ok, wenn das Script über die UserID (mit autoincrement) funktioniert ..... dann geht das, aber ist schon kommisch wenn es da 2 Andy's gibt

    Wenn .DE.VU das amcht .... dann gibts ja 2 mal Andy.de.vu .... das funktioniert dann irgendwie nicht mehr

    oder mein CMS
    http://800xe.de/tvglotzer/lotto-sechser.html
    Der SELECT funktionirt über den Dateinamen, da gibt es auch eine autoincrement "Fid" die ist aber quasie nur da um es bei Edit und so einfacher zu haben

  • Zitat

    für mich war (ist) dieses "Insert Ignore" was neues .... ich nutze die letzte Zeit öffter "REPLACE INTO" damit gibt es dann auch immer nur einen .....


    Und das ist mir neu :) Da kennt einer REPLACE aber kein IGNORE ? Im Prinzip ist beides sehr ähnlich nur mit dem Unterschied, dann IGNORE eben einen doppelten ignoriert ohne einen schwerwiegenden Fehler zu melden. REPLACE den vorhandenen Datensatz jedoch überschreibt (Wobei das falsch ist, denn REPLACE führt kein "replace" durch, sondern ein DELETE + INSERT). Im Ergebnis gibt es bei beiden jeden Wert nur einmal.

    Der Einsatzzweck ist aber eigentlich unterschiedlich.
    IGNORE, wenn man was hat ala: "Füge nur ein, wenn noch nicht vorhanden. Ansonsten ignoriere den Insert und mache weiter"
    REPLACE, wenn man was hat wie: "Füge ein, wenn es einmalig ist, ansonsten ändere einen vorhandenen Datensatz. (ändern im Sinne von löschen und neu einfügen)"

    Aber da gibt es eigentlich auch eine Mischung aus Update und Insert, die ein echtes Update und kein (DELETE + INSERT) durchführt, nämlich mit "INSERT ... ON DUPLICATE KEY UPDATE ...." .

    IGNORE: Insert oder ignorieren
    REPLACE: Insert oder Delete + Insert
    ON DUPLICATE KEY UPDATE: Insert oder Update

    Wichtiger Unterschied hier, daher das mit dem "Delete + Insert". Hat man einen Datensatz mit 10 Spalten, führt einen Insert durch, von 3 Spalten (die 7 anderen werden später gefüllt oder auch nicht), dann löscht ein REPLACE einen vorhandenen DS komplett und fügt dann einen mit selben PRIMARY oder UIX ein, aber nur mit den 3 Spalten aus dem Insert.

    Ein ON DUPLICATE KEY UPDATE würde nur Änderungen an speziellen Spalten vornehmen, die anderen möglicherweise vorhandenen aber unberührt lassen.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Zitat von 800XE;13747

    "Auto increment" war neu für dich?


    ne, ganz neu nicht, nurt hab nicht mitgedacht, oder besser gesagt aufgepaßt. Erst als synonym gesagt hat der dopelte Eintrag wird jetzt schon verhindert, da wurde mir klar das des das Auto Increment ist, weils auf der richtigen Tabelle gestezt wurde. (genau die, die ich halt benötigte um nen doppelten zu verhindern)

    naja, wie gesagt, bin ja kein progger.....

  • Aber wie in der PM gesagt, "auto-increment" ist hier der falsche Weg, zumal es den ohne INDEX gar nicht gibt. Du hast da sicherlich den PRIMARY mit drauf, oder? Genau genommen ist der PRIMARY für das unique verantwortlich.

    Autoincrement ist dafür da, dass ein Wert, in aller Regel eine ID immer fortlaufen automatisch nach oben gezählt wird. Du hast da aber keine IDs, sonder URLs ;) Und automatisch ist es auch nicht, denn die übergibst die URL ja per INSERT.

    Also normalerweise müsste Deine DB so aussehen:

    ID mit PRIMARY und Auto-Increment (Typ: INT UNSIGNED)
    URL mit unique-Index (Typ: VARCHAR ; Länge: 255 für URLs bis 255 Zeichen)
    PR (Typ: TINYINT für Werte von -1 bis +10)
    und die anderen halt noch

    Oder eben ohne ID, dann den PRIMARY auf URL und ohne auto-increment. PRIMARY ist "unique", den gibt es nicht anders.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Hi!

    Genau das Primary wars, das fortlaufend zählt, Fragte mich gerade schonm wo die ID ist :wall:
    hatte ich früher immer drinne und auch beim abfragen, dann wußt ich nämlich immer genbau wieviel Einträge vorhanden sind, gg.

    Naja, werds nochmal machen, oder kann man die nachträglich auch noch einfügen?

  • Ja, geht alles nachträglich.

    Und, nicht verwechseln. Der PRIMARY ist ein KEY (unique - kann Zahl oder Zeichen sein), mehr nicht. Der zählt nicht von alleine.

    PRIMARY + Auto_Increment ist das, was man normalerweise für eine ID nutzt (alt Typ dann INT oder einen der kleineren Versionen, z.B. MEDIUMINT), also Haupt-KEY + automatische, fortlaufende Zählung.

    Also wie gesagt, entweder

    ID mit PRIMARY + Auto_Increment (Spaltentyp INT oder dergleichen - jedenfalls nummerisch)
    URL mit unique-Index (Spalten-Typ: VARCHAR)

    oder (wenn ohne ID)
    URL mit PRIMARY (Spalten-Typ: VARCHAR)

    Auf die URL gehört kein Auto_Increment, da es eben keine Zahl ist, die hochgezählt werden kann ;)

    Und, auch nicht verwechseln oder falsch verstehen. Der Auto_Increment liefert Dir nicht die Anzahl der Einträge bzw. kann man sich darauf nicht verlassen!

    Beispiel:

    Insert 1

    ID -> 1

    nächster Insert
    ID -> 2

    nächster Insert
    ID -> 3

    nächster Insert
    ID -> 4

    Der Auto_Increment zählt also selbst hoch. Doch beachte !!
    DELETE für ID 2

    Wenn nun wieder ein Insert kommt, dann geht es mit ID 5 weiter, also fortlaufend ab der letzten verwendeten Nummer, auch wenn dazwischen welche gelöscht wurden oder die letzte selbst. Das ist der Sinn der Sache.

    Somit ist die ID zwar 5, aber es sind nur 4 Datensätze, nämlich 1, 2, 3 und 5 (4 wurde gelöscht).

    Löscht man nun auch ID 2, 3 und 5, dann bleibt nur noch die 1 übrig.

    Führt man dann wieder einen Insert durch, dann wird die 6 vergeben, da die letzte verwendete die 5 war.

    Wenn Du die Anzahl der Datensätze haben willst, dann mach ein "SELECT COUNT(id) AS anzahl FROM ...", das liefert dann die Anzahl.

    Anzahl ist count()
    Auto_Increment ist nur ein fortlaufender Zähler, eben wie ein Besucherzähler. Wenn der bei 2000 steht heißt das auch noch nicht, dass 2000 jetzt gerade auf der Seite sind, nur, dass sie da waren.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(