kostenloser Webspace werbefrei: lima-city


url immer mit http

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    webfav

    webfav hat kostenlosen Webspace.

    Hallo

    wenn eine URL in Formular ohne http:// (oder ohne https://) eigegeben wurde,
    dann soll das PHP-Script der URL ein http:// voran-stellen ....

    das versuche ich mit einer if-Bedingung mit strpos()
    die prüfen soll, ob der String (die URL) bereits http:// oder https:// enthält

    <br />
    
    <form name="form1" method="post" action="">
      Adresse: <input type="text" name="url" size="36" maxlength="180" />
      OK: <input type="submit" name="run" value="Weiter" />
    </form>
    
    <br />
    
    <?php 
    
    $adresse = trim(chop($_POST['url'])); 
    
    if (strpos($adresse,'http://') === FALSE || strpos($adresse,'https://') === FALSE) 
    { 
      $adresse = 'http://'.$adresse; 
    } 
    
    print "<p>URL: ".$adresse."</p>\n"; 
    
    ?>


    ... funktioniert aber leider nicht ?!

    Wenn die URL schon mit
    http://
    in Formular eingetragen wird,
    dann macht das Script daraus doppelt
    http://http://


    ... warum ? ... was ist falsch ?
    :oO
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. m****r

    Du hast einen Denkfehler. Du benutzt || in deiner if Bedingung, was OR heißt. Das bedeutet egal, ob etwas oder egal was fehlt, es wird immer einer der beiden Fälle eintreten und damit wird immer http:// vornedran gehängt. Wenn du http://test.de eingibst, dann wird für das erste strpos 0 zurückgegeben, weil an der Stelle 0 http:// auftritt. Für das zweite strpos() wird false zurückgegeben, weil eben kein https:// vorhanden ist. Und somit wird auch http:// angehängt. Du musst statt || ein and verwenden (&&).

    EDIT: Es reicht ein trim(), du musst kein zusätzliches chop() verwenden, da trim() ein chop() beinhaltet.

    Beitrag zuletzt geändert: 6.3.2013 10:48:42 von midwar
  4. Autor dieses Themas

    webfav

    webfav hat kostenlosen Webspace.

    ok, vielen Dank

    also && (AND) anstatt || (OR) .... alles klar ... bei OR ist hier immer eins von beiden erfüllt :oO
    ... anstatt dem === FALSE kann ich doch auch ein ! vor strpos() setzen, oder ?

    if ( !strpos($adresse,'http://') && !strpos($adresse,'https://') )
    {
      $adresse = 'http://'.$adresse;
    }



    Wie kann ich jetzt noch prüfen, ob die URL a) valide ist und b) auch erreichbar ist ?

    PS: zum chop() ... Danke .. das ist ehh erstmal quasi ein Platzhalter für noch mehr Filter,
    damit dann keiner ein Script odder Hack über das Formular senden kann ...

    z.B:
    $adresse = preg_replace("/[^0-9a-zA-Z_\-\/\.:#,]/","",$adresse);


    da muss ich noch rausfinden, welche Zeichen in einer URL erlaubt sind,
    und auch, wie man die im Regex Pattern escapen muss
    ... oder halt anders prüfen, ob Eingabe ein valider URL-String ist (siehe Frage oben)

    Oder welche "Anti Hack" Filter bei Formular-Eingabe würdet Ihr (noch) empfehlen ?


    Beitrag zuletzt geändert: 6.3.2013 12:16:06 von webfav
  5. m****r

    webfav schrieb:
    ok, vielen Dank

    also && (AND) anstatt || (OR) .... alles klar ... bei OR ist hier immer eins von beiden erfüllt :oO
    ... anstatt dem === FALSE kann ich doch auch ein ! vor strpos() setzen, oder ?


    Ja. In http://www.php.net/manual/en/function.strpos.php wird gesagt: "This function may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE. Please read the section on Booleans for more information. Use the === operator for testing the return value of this function." Gleiches gilt für !=, aber nicht für !. Nehmen wir an dir wird http://test.de übergeben, dann findet sich http:// an der Stelle 0, folglich gibt strpos() den int(0) zurück. 0 ist ungleich true (was du mit dem Operator ! (Not) überprüfst) und somit kannst du ! verwenden. != jedoch nicht.

    Ob eine URL/eMail/etc valide ist, kann man mit http://www.php.net/manual/en/function.filter-var.php prüfen. Bisher hatte ich damit ausschließlich gute Erfahrungen.

    Wie man eine Seite anpingt weiß ich nicht so genau, habe aber bei Googeln das hier gefunden: http://stackoverflow.com/questions/1239068/ping-site-and-return-result-in-php
  6. m******e

    webfav schrieb:
    Wie kann ich jetzt noch prüfen, ob die URL a) valide ist und b) auch erreichbar ist ?
    Server oder Webseite auf Online/Offline testen
  7. Autor dieses Themas

    webfav

    webfav hat kostenlosen Webspace.

    vielen Dank @menschle !!!


    ich habe es mir etwas vereinfacht, also ohne Array als URL Parameter, nur einzelne URL

    Fuktion:
    // ---------------------------------------------------- 
    
    function pingSite($url) {  
    	
    	$fp = curl_init($url);
    	
    	curl_setopt($fp,CURLOPT_TIMEOUT,10);
    	curl_setopt($fp,CURLOPT_FAILONERROR,1);
    	curl_setopt($fp,CURLOPT_RETURNTRANSFER,0);
    	curl_setopt($fp,CURLOPT_NOBODY,1);
    
    	curl_exec($fp);
    	
    	if (curl_errno($fp) != 0) { $status = false; } 
    	else { $status = true; } 
    	
    	curl_close($fp);
    	
    	return $status;
    
    }  
    
    // ----------------------------------------------------


    Aufruf:
    // ---------------------------------------------------- 
    
    $eine_url = 'http://www.example.org'; 
    
    if ( !pingSite($eine_url) ) { 
      print '<p>Die Seite ist NICHT erreichbar </p>'."\n"; 
    } 
    esle { 
      print '<p>OK ... die Seite ist erreichbar </p>'."\n"; 
    }
    
    // ----------------------------------------------------


    ich musste noch
    curl_setopt($fp,CURLOPT_NOBODY,1);
    mit rein bauen,
    weil mir sonst der komplette (HTML) Inhalt der abgefragten URL angezeigt wurde ... ?!?
    ... schein auch so zu funktionieren :)

  8. webfav schrieb:
    ...
    // ---------------------------------------------------- 
    
    function pingSite($url) {  
    	
    	$fp = curl_init($url);
    	
    	curl_setopt($fp,CURLOPT_TIMEOUT,10);
    	curl_setopt($fp,CURLOPT_FAILONERROR,1);
    	curl_setopt($fp,CURLOPT_RETURNTRANSFER,0);
    	curl_setopt($fp,CURLOPT_NOBODY,1);
    
    	curl_exec($fp);
    	
    	if (curl_errno($fp) != 0) { $status = false; } 
    	else { $status = true; } 
    	
    	curl_close($fp);
    	
    	return $status;
    
    }  
    
    // ----------------------------------------------------
    und wenn du jetzt noch
    curl_setopt($fp, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
    nach
    curl_setopt($fp,CURLOPT_NOBODY,1);
    einfügst, dann kannst du sogar lima pingen (und alle andere die das für cURL verboten haben ;)

    eine auch nicht ganz schlechte ergänzung wäre
    if (curl_errno($fp) != 0) { $status = curl_error($fp); }
    das sagt dir in klartext.
  9. Aber ich sehe da noch ein Problem ...

    Die URL wird 2x ausgelesen, einmal mit fopen() um den $html String einzulesen
    und dann nochmal mit curl() um den Online-Status zu ermitteln

    Das sollte doch auch beides in einem Aufruf funktionieren,

    a) Wenn Du fopen() machst brauchst du kein curl() mehr machen,
    denn wenn fopen() fehl schlägt, dann ist die URL eben nicht erreichbar, also Online-Status = FALSE

    b) Oder du lässt fopen() weg und liest den $html Content mit curl ein
    dann einfach mit CURLOPT_RETURNTRANSFER,1 und ohne CURLOPT_NOBODY
    und $result = curl_exec($fp); auch als Rückgabe-Wert der Funktion (array mit status und html)


    ... aber beides würde ich nicht in einem Aufruf machen :( !!!


    zu a) ... Datei: getmata_fopen.php ..... http://pastebin.com/uNYf0rC3

    oder

    zu b) ... Datei: getmata_curl.php ..... http://pastebin.com/fEdUxVu8


    bei Test mit Abfrage für die Domain: http://www.lima-city.de

    Wenn ich die fopen() Variante teste, die ja nur bis Vorkommen von </head> liest
    dann bekomme ich 1163 gelesene Zeichen

    Aber wenn ich eine curl() Variante teste, welche den gesamten Inhalt einliest,
    dann bekomme ich 12736 gelesene Zeichen

    auch wenn ich in die Funktion mit CURL einfüge
    curl_setopt($fp, CURLOPT_RANGE, '0-4096');

    bleibt die Anzahl gelesener Zeichen (strlen) bei 12736
    ... sollte dann doch aber max. 4096 Byte sein, also sicher weniger Zeichen ?!?

    hää? ... funktioniert CURLOPT_RANGE nicht ?

    ----> wie kann man beim Einlesen mit curl die eingelesene Daten-Menge begrenzen ??
    ich brauche ja nur der <head> Bereich der URL, nicht den kompletten HTML-Code.

    was ist besser .. mit fopen oder mit curl .... ?

  10. webmag schrieb:
    ... aber beides würde ich nicht in einem Aufruf machen :( !!!
    weder in diesem, noch in dem anderen code ist fopen() vorzufinden!

    ... bei Test mit Abfrage für die Domain: http://www.lima-city.de

    Wenn ich die fopen() Variante teste, die ja nur bis Vorkommen von </head> liest
    dann bekomme ich 1163 gelesene Zeichen

    Aber wenn ich eine curl() Variante teste, welche den gesamten Inhalt einliest,
    dann bekomme ich 12736 gelesene Zeichen
    hast du schon die zwei seiten auch ohne style angesehen?

    auch wenn ich in die Funktion mit CURL einfüge
    curl_setopt($fp, CURLOPT_RANGE, '0-4096');

    bleibt die Anzahl gelesener Zeichen (strlen) bei 12736
    ... sollte dann doch aber max. 4096 Byte sein, also sicher weniger Zeichen ?!?

    hää? ... funktioniert CURLOPT_RANGE nicht ?

    ----> wie kann man beim Einlesen mit curl die eingelesene Daten-Menge begrenzen ??
    ich brauche ja nur der <head> Bereich der URL, nicht den kompletten HTML-Code.
    in dem du die anleitung zu curl liest und auch begreifst.

    was ist besser .. mit fopen oder mit curl .... ?
    welches heifischsteake ist besser? aus hammerhai oder aus sandhei? (mal abgesehen davon , dass die armen viecher sowieso fast ausgerottet sind.)

    allein wenn du die dazugehörenden 2 seiten ansiehst (http://www.php.net/manual/en/function.fopen.php, http://www.php.net/manual/en/book.curl.php) sollte dir mal etwas gravierendes auffallen.

  11. ..... auch auf die Gefahr hin, das ich mich jetzt unbeliebt mache ... meine Meinung:

    @czibere ... ich finde Deine Antworten ein bischen unfreundlich

    auch wenn für Dich manches vielleicht ganz klar ist (und Dir die Fragen "dumm" vorkommen)
    ist es wenig hilfreich einfach zu schreiben ... lies doch die Anleitung ... und "begreife" sie ...




    Beitrag zuletzt geändert: 9.3.2013 13:09:33 von wmag
  12. wmag schrieb:

    ..... auch auf die Gefahr hin, das ich mich jetzt unbeliebt mache ... meine Meinung:

    @czibere ... ich finde Deine Antworten ein bischen unfreundlich
    um dich unbeliebt zu machen, brauchst du schon etwas mehr - und weiters, ich bin in diesem forum nie unfreundlich, nur - so weit ich kann - sachlich.
    auch wenn für Dich manches vielleicht ganz klar ist (und Dir die Fragen "dumm" vorkommen)
    ist es wenig hilfreich einfach zu schreiben ... lies doch die Anleitung ... und "begreife" sie ...
    also dann habe eigentlich eher ich mich unbeliebt gemacht.

    ich zitiere mich:
    czibere schrieb:
    ... weder in diesem, noch in dem anderen code ist fopen() vorzufinden!

    ... hast du schon die zwei seiten auch ohne style angesehen?

    ... allein wenn du die dazugehörenden 2 seiten ansiehst (http://www.php.net/manual/en/function.fopen.php, http://www.php.net/manual/en/book.curl.php) sollte dir mal etwas gravierendes auffallen.
    hast du auch diese bemerkungen gelesen? nein? dann sei auch dur sachlich lese auch die und nicht nur den halben satz, der dich emotional so betrifft. du hast mein beitrag nicht gelesen!

    der rat 'lese und auch verstehe' ist nicht unfreundlich und wenn du andere meinung bist, kann ich dir auch nicht helfen.

    noch einmal zum schluss: behandle auch die von dir unbehandelten drei bemerkungen!
  13. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!