Archiv der Kategorie: PHP

Über die Programmierung mit PHP

Datei downloaden mit cUrl

Ich stelle hier einfach mal eine Klasse bereit mit der einfache Requests an z.b. einen Webserver stellen kann.

Es lässt sich der anfragende Useragent einstellen (um z.b. einen Webbrowser zu simulieren)
und falls man ein Script für die Console entwickelt lassen sich auch „lognachrichten“ ausgeben.

Hier aber erstmal der Code:

<?php 
 
class basespider
{
    protected $useragent = null;
    protected $cookie = null;
    protected $followlocation = null;
    protected $post = null;
    protected $get = null;
    protected $consolenOutput = false;
 
    /**
     * Constructor mit Grundeinstellungen
     *
     * @param string $useragent        //Useragent unter dem angefragt wird
     * @param bool $consolenOutput    //Soll eine art Log ausgegeben werden?
     */
    public function __construct(
        $useragent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1) Gecko/20061010 Firefox/2.0',
        $consolenOutput = false
    )
    {
        $this->useragent = $useragent;
        $this->cookie = "data/cookie.txt";
        $this->followlocation = 1;
        $this->timeout = 30;
        $this->consolenOutput = $consolenOutput;
    }
 
    /**
     * Setzt post-parameter
     *
     * @param array $daten
     */
    public function setPost($daten)
    {
        if($daten != null)
        {
            $tmp = "";
            foreach($daten as $key => $value)
            {
                $tmp .= $key."="./*urlencode*/($value)."&";
            }
 
            $this->post = rtrim($tmp, '&');
        }
 
    }
 
    /**
     * Setzt get-parameter
     *
     * @param array $daten
     */
    public function setGet($daten)
    {
        if($daten != null)
        {
            $tmp = "?";
            foreach($daten as $key => $value)
            {
                $tmp .= $key."=".$value."&";
            }
 
            $this->get = rtrim($tmp, '&');
        }
    }
 
    /**
     * setzt einen query zur angegeben url ab und löscht nach dem senden post und get parameter
     *
     * @param string $url
     * @return mixed
     */
    public function Query($url)
    {
        if(isset($this->get) && $this->get !== null)
            $url .= $this->get;
 
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
 
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $this->followlocation);
 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_USERAGENT, $this->useragent);
 
        if($this->cookie !== null)
        {
            curl_setopt ($ch, CURLOPT_COOKIEJAR, $this->cookie);
            curl_setopt ($ch, CURLOPT_COOKIEFILE, $this->cookie);
        }
 
        if(isset($this->post) && $this->post !== null)
        {
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS,$this->post);
 
        }
 
        if($this->consolenOutput)
        {
            echo date("d-m-Y H:i:s").": $url".(isset($this->post) ? ' ('.$this->post.')' :'')."\n";
        }
 
        $return = curl_exec($ch);
 
        if(curl_errno($ch) && $this->consolenOutput)
        {
            echo curl_error($ch);
        }
        curl_close($ch);
 
        unset($this->get);
        unset($this->post);
 
        return $return;
    }
}
 
$spider = new basespider();
 
$res = $spider->Query('http://www.google.de/');
 
?>
 
<html>
    <head>
        <title>Spidertest</title>
    </head>
 
    <body>


<div style="border: 1px solid black; width: 700px; height: 300px; overflow:auto;"><?=$res?></div>


    </body>
</html>

In diesem Beispiel laden wir die startseite von Google.

Bevor man die Querymethode aufruft lassen sich aber auch GET und POST Parameter mit einbinden.
Dafür gibt es die Methoden setGet und setPost die jeweils als array übergeben werden.

Das ergebnis $res kann man nun wahlweise ausgeben oder in eine Datei schreiben, z.b. mit der Funktion file_put_contents

Das wars dann auch schon.

Viel spass damit!

Einfacher Countdown mit PHP und JavaScript

Hier zeige ich ein kurzes Beispiel wie man einen Countdown umsetzen kann.
Der Zeitpunkt wann der Countdown abläuft kann dabei aus einer Datenbank gelesen werden oder im Quelltext festgelegt werden.

<?php 
//z.b. Zeitpunkt aus einer Datenbank 
$datetime = "2013-12-31 09:21:28"; 
$ts = strtotime($datetime); //in TimeStamp umwandeln 

$currentTs = time(); //Aktueller Timestamp 
?>
 
<html>
    <head>
        <title>Countdown</title>
        <script type="text/javascript">
            var countdownfunc = function(elem, ende, endstring)
            {
                //Wenn nichts als countdownende angegeben wurde dann wird das hier festgelegt
                if(typeof endstring == 'undefined')
                {
                    endstring = 'jetzt';
                }
 
                //Der ausgabestring wird festgelegt
                var output = endstring;
 
                //Differenz zwischen jetzt und dem ende
                //division durch 1000 weil in JavaScript ein timestamp in Millisekunden angegeben wird
                var timeDiff = (parseInt(ende)) - (parseInt(new Date().getTime() / 1000));
 
                //Wenn mehr als 0 Sekunden übrig ist dann ...
                if(timeDiff > 0)
                {
                    //... setz den ausgabe string zurück
                    output = '';
 
                    //Wenn mehr als 1 Stunde (60 sek * 60 Min) übrig ist...
                    if(timeDiff > 3600)
                    {
                        //errechne wie viele stunden übrig sind
                        output += parseInt(timeDiff/3600) + 'h ';
                        timeDiff = timeDiff%3600; //Modulo, teile durch eine stunde und speichere den rest
                    }
 
                    //Wenn mehr als 1 Minute (60 Sek) übrig ist ...
                    if(timeDiff > 60)
                    {
                        //... errechne wieviele minuten es sind ...
                        output += parseInt(timeDiff/60) + 'm ';
                        timeDiff = timeDiff%60;//... und merk dir den rest
                    }
 
                    //jetzt sind nur noch die sekunden übrig
                    output += timeDiff + 's';
 
                    //rufe diese funktion nach 1000 millisekunden (1 Sek) wieder auf
                    setTimeout(function() {countdownfunc(elem, ende, endstring);},1000);
                }
 
                //Schreib den ausgabestring in das mitgelieferte element
                elem.innerHTML = output;
            };
        </script>
    </head>
 
    <body>
        Restzeit:
<div id="countdown"></div>

 
        <script type="text/javascript">
            //Funktion erst aufrufen nachdem das element erzeugt wurde ...
            countdownfunc(document.getElementById('countdown'), <?=$ts?>);
        </script>
    </body>
</html>

String Replace in Mysql und der Unterschied zu PHP

Wie ich haben sicher auch schon einige andere den Fehler gemacht und sich gedacht die Parameterreihenfolge von str_replace in PHP auch bei REPLACE in MySql anzuwenden.
Ärgerlich wenn man kein Backup hat 😉

Hier nun einemal das Replace von MySql:

REPLACE(str,from_str,to_str)

Und nun str_replace in PHP

str_replace( $search, $replace, $subject );

 

Wie man sieht variiert hier die Position des Strings in dem ersetzt werden soll. Das hat dann natürlich üble folgen in einer Datenbank und natürlich auch umgekehrt in einem Script.

preg_replace und utf8 Umlaut Problemlösung

Das Problem war das ich irgendwas ersetzen wollte und aber die Umlaute erhalten bleiben sollten.
Das Funktioniert solange wunderbar wie man die Finger von UTF-8 lässt.
Bei mir kommen die Daten aus eine MySQL-Datenbank die UTF-8 Codiert ihre Daten speichert.

Ersetzen wollte ich damit

preg_replace("/[^A-Za-z0-9äÄüÜöÖß ]/"," ", $text);

Da hatte aber wohl PHP was dagegen und hat einfach die Umlaute auch mit rausgeschmissen.
Die Funktion preg_replace(); kann nämlich nicht mit Umlauten die UTF8-Codiert sind umgehen. Zum glück gibts da die Funktion utf8_decode(); mit ihr kann man einen String der UTF-8-Codiert ist in ein für preg_replace(); verständliches Format umwandeln
Nach dem Ersetzen muss der String nur wieder nach UTF-8 Codiert werden und man kann wie gewohnt weiter machen.

Hier ein Stück Code:
<pre>

$text = utf8_decode($text);
$text = preg_replace("/[^A-Za-z0-9äÄüÜöÖß /"," ", $text);
$text = utf8_encode($text);

Das geht natürlich auch verschachtelt:

$text = utf8_encode(preg_replace("/[^A-Za-z0-9äÄüÜöÖß /"," ", utf8_decode($text)));

 

Set/Enum Feld bei Mysql mit PHP auslesen

Ich habe schon öfters das Problem gehabt das ich in einer Tabelle, Felder als Typ Enum erstellt habe. Irgendwann kam dann eine Änderung, es wurde neue möglichkeiten hinzugefügt, oder es wurden mögliche Zustände entfernt. In der Anwendung wurden aber dann HTML-Selectfelder so gelassen wie sie waren, sprich mit alten Werten und es gab plötzlich Fehler.

Um diesem Problem aus dem Weg zu gehen kann man sich solche Datenbankfelder auslesen und anhand dessen die Selectformulare dynamisch zusammenbauen.

Ich gehe mal davon aus ihr könnt eine Verbindung zu einer MySql-Datenbank aufbauen und anfragen dort hin schicken, ansonsten schaut mal hier: Verbindung zu MySQL aufbauen + Abfrage

Wie sieht das ganze nun aus:

$sql = "SHOW COLUMNS FROM foo LIKE 'bar'";
$temp = mysql_query($sql);

if(mysql_num_rows($temp) > 0)
{
    $row=mysql_fetch_row($temp);
    $werte = explode("','",preg_replace("/(enum|set)('(.+?)')/","\2",$row[1]));
}

Dieses Stückchen Code gibt euch nun ein Array mit den verschiedenen Möglichkeiten zurück. Dieses Array könnt ihr dann mit einem foreach() durchgehen.

Nochmal kurz zur Erklärung

$sql = "SHOW COLUMNS FROM foo LIKE 'bar'";

foo ist hierbei eure Tabelle in dem sich das Feld bar befindet.

Viel Spass damit!

Tageszeit abhängige Bilder/Styles wie bei iGoogle

Viele von euch kennen sicher die Personalisierte Startseite von Google. Diese Startseite heißt iGoogle, ich persönlich nutze iGoogle auch, um mit einem Blick aktuelle Nachrichten zu sehen oder meine Termine im Kalender.
Aber genug von den Funktionen … ich möchte hier ja eigentlich auf den Header von iGoogle eingehen, Google bietet dort die Möglichkeit verschiedene Grafiken einzubinden, am Anfang habe ich dort die „Bushaltestelle“ genommen aber mittlerweile habe ich den Strand gewählt, beruhigt doch etwas mehr ;-).

Wenn man sich iGoogle über den Tag verteilt anschaut wird man feststellen das sich dort zu fast jede Tageszeit ein anderes Bild befindet, beim Strand geht das von Sonnenaufgang bis Sonnenuntergang.
Doch wie macht man sowas?

Als Grundvoraussetzung müssen wir erstmal wissen wie spät es eigentlich ist

$zeit = date("G");    //gibt die aktuelle stunde ohne führende 0 aus

Dann müssen wir das ganze auswerten:

if($zeit < 11) { 
    echo "Guten Morgen"; } 
elseif($zeit >= 11 && $zeit <= 13) {
    echo "Mahlzeit";
} else {
    echo "Guten Abend";
}

Das wäre eigentlich schon alles, je nach Tageszeit kann man da nun aber auch anderen Code einsetzen, z.B. den Pfad zu einer CSS-Datei die dann im HTML eingebunden werden soll, oder eben den Pfad zu einem Bild welches im Header der Seite angezeigt wird.

Wer gerne jede Stunde etwas anderes haben möchte dem empfehle ich dann Switch zu benutzen:

switch($zeit) {
    case 0:
        echo "es ist 0 Uhr";
    break;
    case 1:
        echo "es ist 1 Uhr";
    break;
    //...
    case 23:
        echo "es ist 23 Uhr";
    break;
}

Viel Spass damit!

Verbindung zu MySQL aufbauen + Abfrage

Eine Verbindung zu einem MySQL server aufzubauen iist an sich ne einfache Sache. Man sollte aber auch darauf achten das man nicht mehrere Verbindungen gleichzeitig auf macht, das macht ja keinen Sinn, es sei denn man braucht verschiedene Datenbanken aber das ist ja eher selten der Fall.

Ok, hier hier ein paar Codezeilen:

$server = "localhost";
$user = "benutzerbeiMySQL";
$pwd = "passwort";
$db_name = "Name_der_datenbank";

$conn&nbsp; = mysql_connect($server, $user, $pwd);
$my_db = mysql_select_db($db, $conn);

Jetzt steht die Verbindung zum Datenbankserver und auch zur Datenbank an sich.
Kurz zur Erklärung:

die 4 Variablen server, user, pwd und db_name diene lediglich zur übersichtlichkeit.
Die Funktion mysql_connect stellt uns eine Verbindung zum Datenbankserver her und legt uns einen Link in die Variable conn den brauchen wir wenn wir auf mehrere Datenbankserver gleichzeitig zugreifen müssen.
Da auf einem Datenbankserver mehrere Datenbanken liegen können, muss man auch eine Datenbank auswählen das macht man mit der Funktion mysql_select_db. Diese Funktion liefert uns ebenfalls einen Link zurück den wir in der Variable my_db speichern. Dieser Link wird allerdings hier nicht verwendet da wir nur den Link zum Server benötigen.

Um eine Anfrage, sprich ein Query an den Server zu schicken gibt es die Funktion mysql_query diese erwartet von uns als erstes die Anfrage an sich und zweitens die Verbindung bzw. den Link zum DB-Server.

$sql = "SELECT * FROM foo";
$result = mysql_query($sql, $conn);

Das ist an sich eine kleine Simple Abfrage, diese holt alles aus der Tabelle foo.
Die Funktion mysql_query liefert uns dann ein Resource-Link zurück. Den können wir dann an eine Funktion weitergeben die uns das Ergebnis der Abfrage in ein Auswertbares Format bringt.
Eine dieser Funktionen ist mysql_fetch_assoc. Die Funktion gibt uns Datensatz für Datensatz als Array zurück, die Keys des Arrays heißen dabei genauso wie die Felder in der Datenbank.

while($data = @mysql_fetch_assoc($result))
{
    echo $data['spalte1'];
}

Dieses Stück Code gibt uns nun von jedem Datensatz die erste Spalte aus.

Am Ende schließen wir dann wieder die Verbindung, dies passiert normal auch so am Ende eines Scritps, aber es ist sicherer und sauberer selbst die Verbindung zum MySQL-Server zu schließen.

mysql_close($conn);

So das wars auch schon, wie ihr seht ist das garnichmal so schwer 😉

Verzeichnis auslesen mit PHP

ich möchte euch hier ein kleines beispiel geben mit dem man den Inhalt eins Verzeichnisses auslesen kann.
Ich hatte das Problem das ich gern wissen wollte welche Dateien in einem Verzeichnis sind um mit diesen arbeiten zu können, da sich die Namen und auch die anzahl ab und an änderte sollte das eben dynamisch passieren.

Hier mal das Stückchen Code:

<?php 
$count=0; 
$pfad = "./anfbuch"; 
$verz = opendir ($pfad); 
while ($file=readdir($verz)) { 
$count++; 
echo $file."rn"; 
} 
closedir($verz); 
echo "Es sind $count Dateien in dem Verzeichnis vorhanden."; 
?>

mehr ist das nicht 🙂

man kann dann zb. dort wo echo $file.“\r\n“;steht eben alles machen was man mit der Datei machen will.