Webstatt.org - Community seit 2006 - 2012 (2024?)

PHP Tricks und Tipps Fibel

Avatar user-125
14.03.2006 14:23

In diesem Thread werden alle Tipps und Tricks zum Thema PHP gesammelt. Jeder darf sich daran beteiligen.

Dazu jedoch einige Regeln:

[list=1]
  • Nur ein Tipp pro Beitrag
  • Genaue Erklärung zur Funktionsweise
  • Effekt / Vorteil des Tipps / Tricks nennen
  • Übersichlich schreiben
  • PHP-Code farblich hervorheben
  • Nirgend wo was klauen (also selbst ist der Mann / die Frau)
  • [/list=1]

    Sollten Beiträge nicht wie gewünscht aussehen, so wird der Autor per PN angeschrieben. So wird er PN auf den Fehler (etc) hingewiesen.
    Der Autor sollte dann seinen Beitrag ändern oder ihn löschen lassen.

    Liebe user-125y aka user-125 aka dionysos
    Avatar user-125
    14.03.2006 14:30

    Kurze IF-Bedingungen
    Es gibt eine Alternative zu langen IF-Bedingungen. Diese schauen wie folgt aus:
    <?PHP
    $var = 'foo';
    echo 'Hallo, ich glaube du bist ' . ( ( $var == 'foo' ) ? 'foo' : 'nix' ) . '. Oder?';
    // Ausgabe: "Hallo, ich glaube du bist foo. Oder?"
    ?>


    Aufgebaut sind diese Abfragen eigentlich genau wie die "großen":
    ( ausdruck ) ? true : false


    Eine weitere Anwendung:
    <?PHP
    $var = 'foo';
    $var2 = ( $var == 'foo' ) ? 'bar' : '..';
    echo $var2;
    // Ausgabe: "bar"
    ?>

    Liebe user-125y aka user-125 aka dionysos
    Avatar user-181
    14.03.2006 14:34

    Die Funktion phpinfo()

    <?php
    phpinfo();
    ?>


    Mit dieser Funktion bekommt man umfangreiche Informationen über die Installierte PHP Version auf den Server, sowie die Server Umgebung, Betriebssystem, Auffinden von Pfade,... und die PHP-Lizenz

    Wozu?
    Wenn man zB Scripte Installieren will auf einen Server und nicht weiß, ob man alle Vorraussetzungen erfüllt, kann man diese Funktion benutzen, da sie Umfangreiche Ergebnisse Ausgibt.

    ...dank Prophet-Design hab ich hergefunden...
    Avatar user-279
    14.03.2006 14:37

    String "zerlegen"

    <?php
    string = "einlangertext";
    echo string[2]; # variante 1
    echo string{2}; # variante 2
    ?>


    gibt dann "n" aus.
    achtung: die zahlen fangen bei 0 an, also wenn man den ersten buchstaben/zahl ausgeben will muss man echo $string[0] schreiben.

    das ganze geht auch komplizierter lächeln - und zwar mit substr():
    <?php
    $string = "einlangertext";
    echo substr($string, 1) # ausgabe = "inlangertext"
    echo substr($string, 1, 1) # ausgabe = "e"
    echo substr($string, -1) # ausgabe = "t"
    ?>


    damit lässt sich zb. auch ein dateityp bestimmen:
    <?php
    $datei = "substr.php";
    echo substr($datei, -3);
    # ausgabe = "php"
    ?>

    so long - user-279

    Avatar user-279
    14.03.2006 14:53

    Kurzschreibweise

    vielfach werden befehle umständlich geschrieben die man ganz einfach schreiben könnte.
    nachfolgend ein paar beispiele:

    addieren / subtrahieren
    <?php
    # lang:
    $zahl = $zahl + 15;
    $zahl = $zahl - 15;

    # kurz:
    $zahl += 15;
    $zahl -= 15;
    ?>


    um 1 erhöhen / verringern
    <?php
    # lang:
    $zahl = $zahl + 1;
    $zahl = $zahl - 1;

    # kurz:
    $zahl++;
    $zahl--;
    ?>


    php echo()
    wenn man in einem html block zb. eine variable ausgeben will,
    machen das viele so:
    <?php
    $wert = "wert";
    ?>
    <p>im html einen php <? echo $wert ?> ausgeben</p>

    einfacher ist es so:
    <?php
    $wert = "wert";
    ?>
    <p>in html einen php <?=$wert?> ausgeben</p>


    jo - das waren mal ein paar sachen.
    so long - user-279

    Avatar user-125
    30.03.2006 19:59

    Zeilenumbruch & Sonderzeichen
    Oft möchte man, vor allem wenn man mit Datein arbeitet, einen Zeilenumbruch erzeugen. Neben "\n" gibt es in PHP noch eine nette kleine Funktion: chr()
    <?PHP
    print 'Hallo Du,' . chr(10) . 'dies ist ein Test';
    // Ausgabe: "Hallo Du
    // dies ist ein Test"
    ?>


    Für die Sonderzeichen gibt es Tabellen im Netz, in welchen man die Codes finden kann: http://www.lookuptables.com/

    Liebe user-125y aka user-125 aka dionysos
    Avatar user-317
    15.04.2006 23:59

    Mehrere Dateien gleichzeitig laden
    Manchmal kann es nervig sein, wenn man in einem Script mehrere Dateien (z.B. Templates) laden möchte, immer wieder den selben Befehl zu tippen. Außerdem kann das sehr schnell sehr viel Overhead erzeugen. Diese Funktion hier lässt euch die Möglichkeit, mehrere Dateien mit nur einem Befehl zu laden lächeln

    <?php
    function load_tpl () {
    $templates = array (); // Implizites erzeugen unseres Arrays
    $a_templates = func_get_args (); // Wir holen uns alle übergebenen Parameter der Funktion

    foreach ($a_templates as $element) { // Wir durchlaufen unser Array mit den Parametern
    if (!file_exists($element)) { // Kleine Abfrage ob das Template existiert
    $templates[$element] = "Template <b>$element</b> does not exist!";
    } else {
    $templates[$element] = file_get_contents ($element); // Laden der Datei und Eintragen in das Array
    }
    }

    return $templates; // Rückgabe des Arrays mit den Dateiinhalten
    }
    ?>


    Die Funktion lädt also die angegeben Dateien in ein Array. Ihr könnt dann mit der Datei hantieren, indem ihr einfach das Array mit dem Index des Dateinamens benutzt. Hier noch ein Beispiel, bei dem dann die Array-Werte an normale Variablen übergeben werden :
    <?php								
    $templates = load_tpl ('example1.htm', 'example2.htm'zwinkern;
    $head = $templates['example1.htm'];
    $main = $templates['example2.htm'];
    ?>


    Ja, ich hab das ganze load_tpl genannt, weil ich meine Templates damit lade zwinkern
    Noch die ganzen benutzten Befehle :
    array();
    func_get_args ();
    foreach
    file_exists();

    Avatar user-300
    18.04.2006 20:11

    Jeder kennt die Kommentare im Code. Trotzdem verwendet sie kein Schwein frech


    Mehrere Zeilen mit einem Zeichen kommentieren
    Ich will hier aber keine Predigt halten, sondern etwas kleines zeigen. Klar: simpel, einfach, minimalistisch, schlicht. Aber praktisch.

    /*/
    $var = 'test';
    $var = 'test';
    $var = 'test';
    $var = 'test';
    //*/


    Die normale mehrzeilige Kommentarsyntax geht so: /* Kommentar */
    Die Einzeilige Kommentarsyntax geht so: // Kommentar
    Obiges Beispiel verwendet sie beide. Entfernt man das erste * so erhält man:

    //
    $var = 'test';
    $var = 'test';
    $var = 'test';
    $var = 'test';
    //*/


    Und man sehe und staune, die paar Zeilen sind wieder entkommentiert.

    So kann man grössere Codeabschnitte sehr einfach (ent)kommentieren.
    Klein aber fein lächeln

    Danke für die Aufmerksamkeit.

    Avatar user-162
    05.05.2006 14:00

    Modulo
    Hier ein eher wenig bekannt und noch weniger genützer Trick mit der Modulo-Berechnung:

    Was ist Modulo?
    Modulo (%) ist eine Funktion um den Rest eines Bruches zu errechnen. Vielleicht kennt das noch der eine oder andere aus der Primarschule. "10 geteilt durch 6 ist 1 Rest 4..."
    Genau das macht Modulo: Es gibt den Rest aus


    echo 10%4 // Gibt 2 aus.
    echo 10%20 // Gibt 10 aus
    echo 10%0 // Gibt nichts aus, ist aber eigendlich verboten weil 10/0...
    echo 10/0 // würde Fehler ausgeben!


    nun sagt man sich: Toll und was nützt mir das?
    ich sage euch: vieles!

    Modulo kann euch viele kleine Funktionen abnehmen...
    Nehmen wir mal an ihr wollt einen zufälligen Winkel eines Kreises erstellen, mit Modulo geht das ganz einfach:


    srand ((double)microtime()*1000000); // Zufallszahlengeneratorinitialisation, seit PHP 4.2.0 nicht mehr nötig...
    $rand = rand();
    $winkel = $rand%360; // $winkel ist jetzt irgend eine Zahl zwischen 0 und 359;
    // weil man meistens einen Winkel von 0° nicht braucht, kann man optional noch 1 dazurechnen
    $winkel++;


    Bitte sehr das wars von meiner Seite lächeln

    Perfection is not when there’s nothing to add, but when there’s nothing to take away swisscheek.com/magazine
    user-157
    10.05.2006 18:32

    Länge eines Strings zählen



    strlen($alphabet)//ausgabe: 26


    $alphabet beinhaltet:
    abcdefghijklmnopqrstuvwxyz

    asdf!
    Avatar user-182
    10.05.2006 19:02

    Alphabet --> Array

      Vorwort
      Wo wir gerade beim Alphabet sind: Wenn man gaaanz schnell alle Buchstaben des Alphabetes in einem Array haben will, dann sollte man range() benutzen:

      Code
      $alphabet = range('a', 'z'zwinkern;
      // bzw.
      $Alphabet = range('A', 'Z'zwinkern;
      // für große Buchstabene

      Das Gleiche funktioniert auch mit Zahlen:
      $numbers = range(0, 9);

      Wer's also braucht zwinkern

      Manual
      range()

    Seid ihr auch schon wix'r? xD
    Avatar user-271
    04.06.2006 02:18

    Fakultät Berechnung - Schneller

    Zur Berechnung von der Fakultät wird meistens auf eine rekursive funktion verwiesen...
    <?php
    function fak( $n ) {
    return ($n == 0 ? 1 : $n*fak( $n-1 ));
    }
    ?>


    aber die berechnung geht wesentlich schneller wenn eine for-schleife benutzt wird:
    <?php
    function fak( $in ) {
    if($in<2) return 1;
    for($f=2;$in-1>1;$f*=$in--);
    return $f;
    }
    ?>


    bei fak(100) bin ich auf einen unterschiedn von "0.0146727561951" sekunden bekommen...sieht nach nicht viel aus, aber es läppert sich wenn man es of benutzt zwinkern

    #!/bin/bash
    traurig){ neutral:& };:
    Avatar user-166
    22.07.2006 18:14

    Wenn man seine MySQL-Querys sicher gegen SQL-Injection schützten möchte, sollte man alle Variablen, die Usereingaben beinhalten, vorher mit mysql_(real_)escape_string() unschädlich machen. Um das ganze auch noch etwas komfortabler zu machen, kann man das ganze auch noch in eine kleine Funktion packen.

    function mysql_query_s($query, $args = array(), $mysql_resource = null)
    {
    $escape_func = (function_exists('mysql_real_escape_string'zwinkern) ?
    'mysql_real_escape_string' : 'mysql_escape_string';
    foreach ($args as $key => $value)
    {
    $query = str_replace('%'.$key.'%', $escape_func($value), $query);
    }
    if ($mysql_resource !== null)
    {
    return mysql_query($query, $mysql_resource);
    }
    else
    {
    return mysql_query($query);
    }
    }


    Jetzt kann man seine Querys ganz bequem und sicher schreiben. Alle potentiell gefährliche Variablen übergibt man einfach im zweiten Argument als Array.

    $result = mysql_query_s('SELECT foo, bar FROM baz WHERE id = "%id%"',
    array('id' => $_POST['id']));


    Edit: Auf Wunsch, hab ich hier nochmal eine etwas angepasste Version der Funktion:

    function mysql_query_s($query, $args = array(), $mysql_resource = null)
    {
    $escape_func = (function_exists('mysql_real_escape_string'zwinkern) ?
    'mysql_real_escape_string' : 'mysql_escape_string';
    for ($i = 1; $i <= count($args); $i++)
    {
    $query = str_replace('%'.$i, $escape_func($value), $query);
    }
    if ($mysql_resource !== null)
    {
    return mysql_query($query, $mysql_resource);
    }
    else
    {
    return mysql_query($query);
    }
    }


    Dann kann man das ganze etwas bequemer aufrufen.

    $result = mysql_query_s('SELECT foo, bar FROM baz WHERE id = "%1" AND blub = "%2"',
    array($_POST['id'], $_GET['blub']));

    [ » HesaSys - ein freies, schnelles und flexibles WCMS ]
    Avatar user-182
    31.07.2006 21:26

    htmlentities() für RSS/XML
    Der Code wird benutzt um z.B. Text in RSS-Feeds umzuformen und von Sonderzeichen zu befreien. htmlentities() funktioniert meist nicht, da in XML keine &amp;'s z.B. erlaubt sind.
    Ggf. kann man den Array "$l_KeysTranslate" mit seinen Zeichen ersetzen.
    function encode_unicode($a_stInput){
    $l_stBuffer = '';

    for($i=0;$i<strlen($a_stInput);$i++){
    $l_KeysTranslate = array('ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß', '&'zwinkern;

    $l_stCurrentKey = substr($a_stInput, $i, 1);
    if(in_array($l_stCurrentKey, $l_KeysTranslate)){
    $l_stCurrentKey = '&#'.ord($l_stCurrentKey).';';
    }
    $l_stBuffer .= $l_stCurrentKey;
    }

    return $l_stBuffer;
    }

    Seid ihr auch schon wix'r? xD
    Avatar user-118
    14.08.2006 00:24

    Dateiname aus Dateiname.Endung isolieren

    Mit dieser Funktion könnt ihr den Namen einer Datei von der Endung abtrennen.
    Somit würde aus isolate_name('Index.html'zwinkern -> Index werden.
    Dabei ist es egal wie lang die Endung ist und ob der Dateiname auch Punkte enthält.

    Bei isolate_name('D.a.teina.me.Endung'zwinkern kommt also auch 'D.a.teina.me' heraus.


    function isolate_name($file) {
    $suffix = substr(strrchr ($file, "."zwinkern,1); // Endung isolieren
    $length_filename = (strlen($file)-(strlen($suffix)+1)); // Länge des Filestrings - Länge des Endungsstring + den Punkt.
    $file_name = substr($file, 0, $length_filename);
    return $file_name;
    }


    Vielleicht kann der ein oder andere sowas ja auch mal gebrauchen.

    Manual

    substr
    strrchr
    strlen

    Ich brauche keine Signatur
    user-218
    01.09.2006 23:18

    Will auchmal etwas dazuschreiben:
    Wenn eine Variable besteht,
    $var = "1";

    kann man mit:
    $var .= "2";

    etwas an die Variable dranhängen.
    Am Ende kommt das heraus:
    $var == "12";


    Keppi

    Rechtschreibfehler dienen der allgemeinen Belustigung
    Avatar user-255
    12.09.2006 11:20

    Mit Callback Funktionen lassen sich benutzerdefinierte Algorithmen in andere einbauen. Bsp:

    <?php
    function meinCallback($parameter) {
    return $parameter + 1;
    }

    function ominoeserAlgo($array, $callback) {
    foreach ($array as $key => $val) {
    # Das große Geheimnis:
    $array[$key] = $callback($val);
    }
    return $array;
    }

    print_r(ominoeserAlgo(array(1, 2, 3), 'meinCallback'zwinkern);
    ?>

    Ausgabe:
    Array
    (
    [0] => 2
    [1] => 3
    [2] => 4
    )


    Anwendung kann dieses Prinzip bspw. in Zusammenhang mit Ajax finden:

    Der Client schickt die Anfrage mit Parameter an PHP..
    getContent 10
    ..wo diese dann ausgewertet wird:
    <?php
    function getContent($argv) {
    global $content;
    $id = array_shift($argv);
    print $content[$id];
    }

    $argv = explode(' ', urldecode($_SERVER['QUERY_STRING']));
    $methode = array_shift($argv);
    # methode aufrufen
    $methode($argv);
    ?>

    Um das ganze gegen Anfriffe abzusichern, kapselt man seine Methoden einfach in einer Klasse lächeln

    Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
    Avatar user-182
    22.04.2007 10:02

    function css_compress($css){
    $css = preg_replace_callback('#(/\*)(.*?)(\*/)#s','css_comment_cb',$css);
    $css = preg_replace('/(?<!lächeln\/\/.*$/m','',$css);
    $css = preg_replace('![\r\n\t ]+!',' ',$css);
    $css = preg_replace('/ ?([:;,{}\/]) ?/','\\1',$css);
    $css = preg_replace("/#([0-9a-fA-F]{1})\\1([0-9a-fA-F]{1})\\2([0-9a-fA-F]{1})\\3/", "#\\1\\2\\3",$css);
    return $css;
    }

    function css_comment_cb($matches){
    if(strlen($matches[2]) > 4) return '';
    return $matches[0];
    }


    Ist recht n1, da bekommt man dann solche CSS-Datein durch: http://1kh.eu/images/style.css

    Seid ihr auch schon wix'r? xD
    Avatar user-125
    22.04.2007 14:07

    Einen Ordner auslesen
    Mit diesem kleinen Code könnt ihr ganz einfach einen Ordner auslesen. Zusätzlich könnt ihr hier sehen, wie man weitere Informationen wie Dateigröße ermittelt.

    $dir_stream = opendir(PHP_PATH);
    while ( $dir_files = readdir( $dir_stream ) ) {
    print $dir_files;
    }
    closedir($dir_files);

    Der Code liest das aktuelle Verzeichniss aus, da wo das Script liegt, und gibt alle Dateinamen und Ordner aus.

    Eine mögliche Erweiterung wäre:
    $dir_stream = opendir(PHP_PATH);
    while ( $dir_files = readdir( $dir_stream ) ) {
    if ( is_dir(PHP_PATH . $dir_files) ) {
    // Ein Ordner
    } else {
    // Eine 'normale' Datei
    }
    }
    closedir($dir_files);


    Jetzt folgt eine wiedergabe aller Datein mit einigen Infos:
    $dir_stream = opendir(PHP_PATH);
    while ( $dir_files = readdir( $dir_stream ) ) {
    if ( is_dir(PHP_PATH . $dir_files) ) {
    // Ein Ordner
    print '<strong>'.$dir_files.'</strong><br />';
    } else {
    // Eine 'normale' Datei
    $file_size = filesize(PHP_PATH . $dir_files);
    $file_size = round($file_size/1024,2);
    $file_date = strftime("%a, %d.%b.%y, %H:%M", filemtime(PHP_PATH . $dir_files));
    print '<a href="'.PHP_PATH . $dir_files.'">'.$dir_files.'</a><br />
    <small>
    '.$file_size.' KByte
    '.$file_date.'
    </small>';
    }
    }
    closedir($dir_files);

    Liebe user-125y aka user-125 aka dionysos