Variable richtig übergeben

  • PHP

  • undeath
  • 1101 Aufrufe 3 Antworten

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

  • Variable richtig übergeben

    Hallo,

    ich wollte auf meiner Seite nen Spambotschutz beim Registrieren einbauen.

    Aber irgendwie komm ich nicht wirklich weiter...

    ich hab davon ausgehend:
    guildwarsholland.nl/phphulp/testspambot.php

    Den Code gebastelt:

    Quellcode

    1. function checkSpambots($email, $rip){
    2. $spambot = false;
    3. //check the e-mail adress
    4. $xml_string = file_get_contents('http://www.stopforumspam.com/api?email='.$email);
    5. $xml = new SimpleXMLElement($xml_string);
    6. if($xml->appears == 'yes'){
    7. $spambot = true;
    8. }elseif($spambot != true){
    9. //e-mail not found in the database, now check the ip
    10. $xml_string = file_get_contents('http://www.stopforumspam.com/api?ip='.$rip);
    11. $xml = new SimpleXMLElement($xml_string);
    12. if($xml->appears == 'yes'){
    13. $spambot = true;
    14. }
    15. }
    16. return $spambot;
    17. }
    Alles anzeigen


    der dann später in ner anderen Funktion mit

    Quellcode

    1. $spambot = false;
    2. if (!$stop) { $spambot = checkSpambots($newuser_mail, $nsnst_const['remote_ip']);}
    3. if ($spambot == true) $stop = "<center>Error</center>";


    in $stop wird was reineschreiben, wenn vorher festgestellt wurde, dass die email-Adresse ungültig ist.

    aber irgendwo passt was nicht, da ein Teil der Seite jetzt leider garnicht mehr geladen wird.

    Kann mir jemand sagen wo der Fehler ist?
    Oder bin ich das ganze komplett falsch angegangen? (hab leider nicht viel Ahnung von php...)


    mfg Undeath

    //edit: hab das ganze mal n bisschen abgeändert
    "General, der Mensch ist sehr brauchbar. Er kann fliegen und er kann töten.
    Aber er hat einen Fehler: Er kann denken." - Brecht
    I Don't smoke, I don't drink, I don't fuck! At least I can fucking think!

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von undeath ()

  • Hi,

    bin mir nicht sicher, weil ich auf die Schnelle keinen Zugriff auf nen Webserver habe, auf dem ich's ausprobieren kann, aber generell denke ich liegt der Fehler darin, daß Du wahrscheinlich statt der IP-Adresse text übergibst, oder steht in "$host_name" die IP-Adresse drin?

    Du machst also einen Aufruf in der Art:

    Quellcode

    1. http://www.stopforumspam.com/api?ip=asdf


    was dann passiert ist, daß das Skript, welches Du mit obigem Aufruf startest auch noch nen Bug hat und folgende Zeilen zurückschickt:

    Quellcode

    1. <response success="true">
    2. false">
    3. <error>invalid email address</error>
    4. </response>


    was kein sauberer XML-Code sein dürfte, wegen der 2. Zeile.

    Das wiederum führt wohl in SimpleXMLElement zu ner exception

    http://www.phpcenter.de/de-html-manual/function.simplexml-element-construct.html schrieb:


    Fehler/Exceptions
    Erzeugt eine E_WARNING-Fehlermeldung für jeden gefundenen Fehler in den XML-Daten und wirft eine Exception, sobald ein solcher Fehler festgestellt wurde.


    Du müßtest also sicherstellen, daß Du nur korrekte Werte übergibst (also gültige IP-Adressen und gültige email-Adressen) oder aber das Ganze in einem Try-Catch-Block klammern und die Exception behandeln. Wie das geht, kannst Du z.B. hier nachlesen:
    PHP: Ausnahmebehandlung - Manual

    Schöne Grüße!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von alletKaputt ()

  • hab das

    Quellcode

    1. $host_name
    einfach mal durch

    Quellcode

    1. $nsnst_const['remote_ip']
    ersetzt, obwohl das vorher auch schon hätte gehen müssen (in $host_name stand die IP drin, oder hätte drinstehen müssen ;) ).

    (und noch ein paar andere kleine Änderungen, habs oben reineditiert)

    Aber leider immernoch das gleiche Prob wie vorher, irgendwo bricht es einfach ab
    Sobald "checkSpambots($newuser_mail, $nsnst_const['remote_ip'])" aufgerufen wird is Sense... danach kommt garnix mehr zurück

    mfg Undeath


    //edit: hab jetzt ein bisschen rumprobiert und festgestellt, dass es wohl an

    Quellcode

    1. $xml = new SimpleXMLElement($xml_string);
    liegt. Kann jmd sagen, was da hin muss, damit die Zuordnung richtig abläuft, oder wie ich feststellen kann, worans scheitert?

    //edit2: hab noch mehr rumprobiert und festgestellt, dass

    Quellcode

    1. $xml_string
    nur (zB)

    Quellcode

    1. email yes 2009-04-04 05:11:21 12
    enthält, nicht

    Quellcode

    1. <response success="true">
    2. <type>email</type>
    3. <appears>yes</appears>
    4. <lastseen>2009-04-04 05:11:21</lastseen>
    5. <frequency>12</frequency>
    6. </response>


    Liegt der Fehler darin? Wenn ja: wie kann man ihn beheben?
    "General, der Mensch ist sehr brauchbar. Er kann fliegen und er kann töten.
    Aber er hat einen Fehler: Er kann denken." - Brecht
    I Don't smoke, I don't drink, I don't fuck! At least I can fucking think!

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von undeath ()

  • wie gesagt, sehr wahrscheinlich wirfts Dir irgendwo ne Exception.

    Am Besten wäre wohl, das Teil mal zu zerlegen und sich langsam vorzutasten.

    Probier doch mal, ob z.B. das hier geht:

    Quellcode

    1. function checkSpambots($email, $rip){
    2. $xml_string = file_get_contents('http://www.stopforumspam.com/api?email='.$email);
    3. $xml = new SimpleXMLElement($xml_string);
    4. return ($xml->appears == 'yes');
    5. }


    und dann baust Du das langsam aus.

    Muß wohl auch PHP-Debugger geben, bestimmt ganz hilfreich hier, hab sowas aber selber nie benutzt, da mir persönlich Perl viel lieber ist.

    Oder steck doch Deinen CheckSpambots-Aufruf in einen try-catch Block, dann weißt Du zumindest schon mal ob ne Exception die Ursache ist:

    Quellcode

    1. try {
    2. $spambot = checkSpambots($newuser_mail, $nsnst_const['remote_ip']);} catch (Exception $e) {
    3. echo 'Exception abgefangen: ', $e->getMessage(), "\n";
    4. }


    Der Fehler muß sich doch finden lassen :)

    Schöne Grüße!

    PS: Bei dem Code stellts mir sowieso die Haare auf:

    Quellcode

    1. if($xml->appears == 'yes'){
    2. $spambot = true;
    3. }elseif($spambot != true){

    da würde auch etwas beautifying nicht schaden ;)

    etwa in die Richtung:

    Quellcode

    1. function checkSpambots($email, $rip){
    2. $xml_string = file_get_contents('http://www.stopforumspam.com/api?email='.$email);
    3. $xml = new SimpleXMLElement($xml_string);
    4. if($xml->appears == 'yes'){
    5. return true;
    6. }
    7. //e-mail not found in the database, now check the ip
    8. $xml_string = file_get_contents('http://www.stopforumspam.com/api?ip='.$rip);
    9. $xml = new SimpleXMLElement($xml_string);
    10. if($xml->appears == 'yes'){
    11. return true;
    12. }
    13. return false;
    14. }
    Alles anzeigen

    aber jetzt hör ich auf an Deinem Code zu schrauben, ein bischen willst/sollst Du ja auch noch selber machen :D

    ich versteh nicht ganz, warum Du den Wust in den alten Beitrag reineditiert hast, so wirds ja richtig unübersichtlich.

    Ich poste jetzt hier, auch wenns etwas gegen die Forenregeln verstößt das Ganze in einem neuen Beitrag, ansonsten entartet der ohnehin schon lange Post von mir noch komplett!

    Außerdem hast Du's jetzt endlich geschafft, ich hab mir xampp gezogen und das mal ausprobiert ;) Also bei mir läuft das Ganze wunderbar!

    Hier mein Testscript:

    PHP-Quellcode

    1. <?php
    2. function checkSpambots($email, $rip){
    3. $xml_string = file_get_contents('http://www.stopforumspam.com/api?email='.$email);
    4. echo $xml_string;
    5. $xml = new SimpleXMLElement($xml_string);
    6. if($xml->appears == 'yes'){
    7. return true;
    8. }
    9. //e-mail not found in the database, now check the ip
    10. $xml_string = file_get_contents('http://www.stopforumspam.com/api?ip='.$rip);
    11. echo $xml_string;
    12. $xml = new SimpleXMLElement($xml_string);
    13. if($xml->appears == 'yes'){
    14. return true;
    15. }
    16. return false;
    17. }
    18. if (checkSpambots("abc@de.fg", "1.1.1.1"))
    19. echo "\n<br/>\nyessss";
    20. else
    21. echo "\n<br/>\nnoooo";
    22. echo "\n\n<br/><br/><br/>\n";
    23. if (checkSpambots("abc@de.fg", "2.2.2.2"))
    24. echo "\n<br/>\nyessss";
    25. else
    26. echo "\n<br/>\nnoooo";
    27. ?>
    Alles anzeigen


    Hier die erzeugte Bildschirmausgabe:

    Quellcode

    1. email no 0 ip yes 2009-03-15 05:10:37 2
    2. yessss
    3. email no 0 ip no 0
    4. noooo


    und hier der Seitensource:

    HTML-Quellcode

    1. <html><head></head><body><response success="true">
    2. <type>email</type>
    3. <appears>no</appears>
    4. <frequency>0</frequency>
    5. </response><response success="true">
    6. <type>ip</type>
    7. <appears>yes</appears>
    8. <lastseen>2009-03-15 05:10:37</lastseen>
    9. <frequency>2</frequency>
    10. </response>
    11. <br>
    12. yessss
    13. <br><br><br>
    14. <response success="true">
    15. <type>email</type>
    16. <appears>no</appears>
    17. <frequency>0</frequency>
    18. </response><response success="true">
    19. <type>ip</type>
    20. <appears>no</appears>
    21. <frequency>0</frequency>
    22. </response>
    23. <br>
    24. noooo</body></html>
    Alles anzeigen

    Außerdem gibts bei ungültiger email oder IP noch nicht mal ne exception (trotz des fehlerhaften xml-tags).

    undeath schrieb:


    //edit2: hab noch mehr rumprobiert und festgestellt, dass

    Quellcode

    1. $xml_string
    nur (zB)

    Quellcode

    1. email yes 2009-04-04 05:11:21 12
    enthält, nicht

    Quellcode

    1. <response success="true">
    2. <type>email</type>
    3. <appears>yes</appears>
    4. <lastseen>2009-04-04 05:11:21</lastseen>
    5. <frequency>12</frequency>
    6. </response>


    warum das bei Dir nicht in $xml_string enthalten sein sollte, weiß ich nicht, kann es sein, daß Du nur die Bildschirmausgabe anguckst und nicht den eigentlichen source, denn Dein Browser formatiert das wohl schon vor (wie meiner eben auch, s.o.).

    Dann viel Spaß damit!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Broken Sword () aus folgendem Grund: Doppelpost =&gt; Regeln lesen