Doppelte Einträge in der Datei verhindern.

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Doppelte Einträge in der Datei verhindern.

    Hallo. Ich möcte prüfen, ob eine email in der Datenbank bereits eingetragen ist oder nicht. Ansich nicht schwierig, aber ich hab ein Problem mit mysql_result. Bei der unteren Anwendung im Script funzt es einwandfei. Aber bei der ersten nicht. Hier mal der Code:

    Quellcode

    1. <?PHP
    2. if(isset($_POST['user'])) {
    3. $email= 'SELECT count(email) as num FROM kcc_user WHERE email='.$_POST['email'].'';
    4. $num = mysql_result(mysql_query($email), "num");
    5. if ($num > 0) {
    6. echo 'Diese email-Adresse wird bereits verwendet.';
    7. } else {
    8. echo 'Eintrag erfolgt.';
    9. do {
    10. srand ((double)microtime()*1000000);
    11. $vertragnr = rand(100000,199999);
    12. $vertragnummer = 'SELECT count(vertragnr) as num FROM kcc_vertrag WHERE vertragnr='.$vertragnr.'';
    13. $num = mysql_result(mysql_query($vertragnummer), "num");
    14. } while ($num > 0);
    15. echo 'Eintrag erfolgt';
    16. }
    17. }
    18. ?>
    Alles anzeigen


    Wie gesagt. Bei der unten Anwendung von mysql_result klappt oben aber nicht. Natürlich kann mit dem unique-Argument doppelte Einträge verwenden, aber ich möchte diesen fehler abfangen.
  • nanu?
    $vertragnr ist eine Zufallszahl die sich bei jedem Durchlauf ändert.
    Und sobald du einen Eintrag in der Datenbank triffst (ziemlich unwahrscheinlich), dann machst du eine Ausgabe, dass ein Eintrag erfolgt ist (machst aber keinen Eintrag)

    Soll es vielleicht heißen

    Quellcode

    1. } while ($num == 0);
    2. mysql_query("INSERT INTO ....");
    3. echo 'Eintrag erfolgt';
    4. }
  • Ja stimmt. Aber ich habe absichtlich auf die Ausgabe verzichtet. Ist zu unübersichtlich. Der Teil des Scriptes funktioniert ja auch wunderbar. Mit geht´s eigentlich um die 1. mysql-result-Anweisung. Diese funktioniert gar nicht, obgleich sie ja eigentlich den selben Aufbau hat wie die Zweite. Aber diese funktioniert nicht. Keine Fehlerausgabe keine Wert bei der Variablenausgabe.
  • Hab das mal getestet. Aber das Ergebnis war so wie ich mir gedacht habe.

    Quellcode

    1. PHP Notice: Undefined variable: num


    Ich brauche diese ja um festzustellen, wieviel Einträge es mit den gesuchten Zeichenketten gibt. Die Prüfungen wurden nicht durchgeführt. Alles wurde eingetragen, obwohl es doppelte Einträge gab.

    Mit einem mysql_error nach Zeile 4:

    erhalte ich folgende Fehlermeldung für die erste Anweisung:

    Quellcode

    1. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@web.de' at line 1


    Irgendwas scheint mit der Syntax (@) aus den email-Adressen nicht zu stimmen denke ich, aber ich kann das nicht analysieren. Suchmashcineneinträge haben auch ncihts genützt. Diese Fehlermeldung bezieht auf Zeile 4.
  • So habe den Fehler jetzt gefunden. Sowas dummes. Hab das irgenwie übersehen. Aber die Lösung:

    Zeile 3 ersetzen mit:

    $email = 'SELECT count(email) as num FROM kcc_user WHERE email="'.$_POST['email'].'"';

    Änderung:
    Die übergebene Variable $_POST['email'] in Anführungszeichen setzen.

    Ursache:
    Die übergebene Variabel enthält das Sonderzeichen @ und konnte in der SELECT-Anweisung nicht richtig interpretiert werden. Die Anführungszeichen behandeln die ganze Variable als String.
  • Dein Script ist unsicher (siehe MySQL-Injection), unlogisch (siehe Aussage von d0nUt) und läuft mit großer Wahrscheinlichkeit länger als die execution time auf einem Webserver gestattet (weil unlogisch). Du solltest also eigentlich dankbar sein, dass es überhaupt nicht funktioniert.

    Zu deinem Problem: Benutzt mal eine von den mysql_fetch_....() Funktionen, das empfiehlt auch das PHP Manual. Hinzukommt, dass du die Funktion mysql_result() auch noch falsch verwendest, denn der zweite Parameter soll den Datensatz angeben auf den du dich beziehst (in deinem Fall 0, in jedem Fall aber eine Zahl!) und erst der dritte, optionale Parameter die Spalte (in deinem Fall "num"). Sollte PHP dir das nicht sowieso schon gesagt haben, liegt es dadran, dass es so schwach getypt ist.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • hallo. alles was ich über php und mysql weiß habe ich mir selbst beigebracht. und das ist noch nicht mal lange her. ich bin eigentlich ganz stolz darauf, dass ich schon viel weiß. aber halt noch nicht alles. ich lerne sehr gerne immer wieder dazu. wie würdest du denn das script schreiben dami tes sicher scheint und die ausführzeit des servers nicht ausreizt?
  • Quellcode

    1. $email = mysql_real_escape_string($email);
    2. $result = mysql_query("SELECT email FROM kcc_user WHERE email = '".$email."'; ");
    3. if(mysql_num_rows != 0){
    4. //TODO: Ausgabe, das email bereits verwendet wird
    5. }else{
    6. //TODO: Email wird noch nicht verwendet, also mach, was du damit machen willst
    7. }


    So würd ich das machen, auch wenn das noch kein Garant für Professionallität ist :roll:
  • Genau, so sichert man sich gegen SQL-Injections, mit mysql_real_escape_string().
    Um zu dir zu sagen wie du die Laufzeit senkst, müsstest du erstmal erklären was, du da mit den Zufallszahlen machst. Wenn du die Vertragsnummern fortlaufend gestaltest, brauchst du nichtmal eine Schleife.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • danke für die quotes. ich habe das auch eingesehen ;-))

    ich habe das jetzt mal abgesichert. hab dafür ne funktion geschrieben. funzt ganz gut. die nummern habe ich jetzt forlaufend erstellt.

    Quellcode

    1. $maxvertragnr = 'SELECT MAX(vertragnr) as max FROM kcc_vertrag';
    2. $vertragnr = mysql_result(mysql_query($maxvertragnr), "max");
    3. if ($vertragnr == "") {
    4. srand ((double)microtime()*1000000);
    5. $vertragnr = rand(100000,119999);
    6. } else {
    7. $vertragnr++;
    8. }


    Geht das kürzer?
  • ja, natürlich. Warum fängst du denn überhaupt bei RANDOM an zu zählen?

    Wenn deine Spalte das Attribut auto_increment hat, dann wird der Zähler automatisch erhöht. Wenn du unbedingt bei einem zufälligen Wert anfangen willst, dann kannst du den Wert manuell setzen

    Quellcode

    1. CREATE TABLE `Test` (
    2. `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    3. `Title` VARCHAR( 255 ) NOT NULL
    4. )
    5. INSERT INTO Test (Title) VALUES ('aaa');
    6. INSERT INTO Test (Title) VALUES ('bbb');
    7. INSERT INTO Test (Title) VALUES ('ccc');
    8. SELECT * FROM Test;
    9. 1 aaa
    10. 2 bbb
    11. 3 ccc
    Alles anzeigen