Willkommen in der Webstatt Zum Webstatt Blog und Stories
bastey bastey am 14.03.06 15: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.

netcup.de Warum gibt es hier Werbung?
bastey bastey am 14.03.06 15:30

[SIZE=16]Kurze IF-Bedingungen[/SIZE]
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"
?>

Flom Flom am 14.03.06 15:34

[SIZE=16]Die Funktion phpinfo()[/SIZE]

<?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.

phore phore am 14.03.06 15:37

[SIZE=16]String "zerlegen"[/SIZE]

<?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 :) - 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 - phore

phore phore am 14.03.06 15:53

[SIZE=16]Kurzschreibweise[/SIZE]

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

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

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


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

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


[SIZE=14]php echo()[/SIZE]
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 - phore

bastey bastey am 30.03.06 21:59

[SIZE=16]Zeilenumbruch & Sonderzeichen[/SIZE]
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/

Sven Sven am 16.04.06 01:59

[SIZE=16]Mehrere Dateien gleichzeitig laden[/SIZE]
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 :)

<?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');
$head = $templates['example1.htm'];
$main = $templates['example2.htm'];
?>


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

sili sili am 18.04.06 22:11

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


[SIZE=20]Mehrere Zeilen mit einem Zeichen kommentieren[/SIZE]
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 :)

Danke für die Aufmerksamkeit.

der_nic der_nic am 05.05.06 16:00

[SIZE=16]Modulo[/SIZE]
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 [COLOR=red]Rest 4[/COLOR]..."
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 :)

crooked am 10.05.06 20:32

Länge eines Strings zählen


strlen($alphabet)//ausgabe: 26


$alphabet beinhaltet:
abcdefghijklmnopqrstuvwxyz

Franky Franky am 10.05.06 21:02

[SIZE=16]Alphabet --> Array[/SIZE]


    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');
    // bzw.
    $Alphabet = range('A', 'Z');
    // für große Buchstabene

    Das Gleiche funktioniert auch mit Zahlen:
    $numbers = range(0, 9);
    Wer's also braucht ;)

    Manual
    range()
nuit nuit am 04.06.06 04:18

[SIZE=16]Fakultät Berechnung - Schneller[/SIZE]

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 ;)

dookie dookie am 22.07.06 20: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')) ?
'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')) ?
'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']));

Franky Franky am 31.07.06 23:26

[SIZE=16]htmlentities() für RSS/XML[/SIZE]
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('ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß', '&');

$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;
}

Al3x0r Al3x0r am 14.08.06 02:24

[SIZE=20]Dateiname aus Dateiname.Endung isolieren[/SIZE]

Mit dieser Funktion könnt ihr den Namen einer Datei von der Endung abtrennen.
Somit würde aus isolate_name('Index.html') -> 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') kommt also auch 'D.a.teina.me' heraus.

function isolate_name($file) {
$suffix = substr(strrchr ($file, "."),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

keppi2 am 02.09.06 01: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:

Quote
$var == "12";


Keppi

milahu milahu am 12.09.06 13: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'));
?>

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 :)

Franky Franky am 22.04.07 12:02

function css_compress($css){
$css = preg_replace_callback('#(/\*)(.*?)(\*/)#s','css_comment_cb',$css);
$css = preg_replace('/(?<!:)\/\/.*$/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

bastey bastey am 22.04.07 16:07

[SIZE=20]Einen Ordner auslesen[/SIZE]
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);

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt