Archiv für den Monat: Januar 2010

HEREDOC in PHP – Kleine Einführung …

Muss man oft fremden Code in eine Seite einbinden und dies auch noch per JavaScript, so kommt es nicht selten vor, dass mensch den entsprechenden Code per E-Mail bekommt.

Ich rede hier von Fremdcode in der länge 6-60 Zeilen, so wie in etwa für Analyse-Javascripte oder sonstige, kleinere Sachen. Diese sollen dann meist über PHP in den HTML-Code eingebettet werden und meist auch exakt so, wie der Code vorgegeben wird (Stichwort Zeilenumbrüche).

Nun folgt der nächste Schritt, man öffnet das PHP-File und bereitet den Einbau vor. Oft sehe ich es bei Kollegen und Bekannten so:

  1. PHP-Datei öffnen.
  2. Fremdcode per Copy & Paste in den heimischen Editor bringen.
  3. Ein “echo” vorbereiten.
  4. Es folgt ein wildes getippe, damit alle Anführungszeichen entsprechend escaped werden.
  5. Hochladen
  6. zu 80%: Frust!

Frust! Der entsteht zu 80% am Ende der oft langen Phase des “coden” und “escapen”, weil am Ende vergessen wurde, den ganzen “echo’s” auch Zeilenumbrüche wie \n mitzugeben, damit nicht der ganze Code auf einer Zeile im Quelltext steht. Manche Analyse-Codes nehmen einem das mit falschem oder – schlimmstenfalls – keinem Tracking übel.

Nur, was tun? Das Stichwort dazu heißt: HEREDOC

Mit HEREDOC kann ich Fremdcode so in eine Variable oder an eine Ausgabe übergeben, dass der exakt so ausgegeben wird und das ist so einfach, dass ich auf jeden Fall schneller bin wie meine Kollegen – und dabei kann ich mich auch auf die Zeilenumbrüche verlassen.

HEREDOC funktioniert so:

$meinFremderInhalt = <<< MEINHEREDOC

Inhalt, Inhalt

Mehr Inhalt, kann auch Code sein

usw. , usf.

MEINHEREDOC;

Man nehme eine Variable und weise ihr mit Hilfe von <<< den Inhalt dessen zu, was der folgende HEREDOC-Delimiter enthält. Alles ab der Zeile unter MEINHEREDOC wird übernommen, Zeilenumbrüche, Einschübe usw.

Ein HEREDOC Bereich endet dann wieder mit dem exakten (!) HEREDOC Delimiter, den mensch auch oben benutzt plus einem abschließenden ; (nicht vergessen!).

Dannach kann mensch ganz einfach den Inhalt per

printf(‘%s’.”\n”,$meinFremderInhalt);

zum Beispiel in die Webseite ausgeben – inklusive Zeilenumbrüche.

Wie oft kommt string1 in string 2 vor? Kleine Hilfe …

Weil ich es nun schon oft gesehen habe, hier mal die kleine Anleitung zum Thema: „Wie zähle ich, wie oft string1 in string 2 vorhanden ist?“

Ich sehe fast täglich neue implementationen dazu, wobei sich die entsprechenden Programmierer des öfteres mal „einen abbrechen“, eine aufwändige Funktion zu erstellen, die dann aber doch an Kleinigkeiten scheitert (z.B. keine UFT-8 Unterstützung, nicht binary-safe, usw.).

Aber warum machen es sich die Leute so schwer?
Weil diese Leute die PHP-Funktion substr_count nicht kennen.

Ein Beispiel: Ihr wollt zählen, ob eine Zeichenkette in einem String vorkommt, dann geht das hiermit am schnellsten:

$string = "Hallo Welt, ich bin da, dein liebster elton!";
$suchstring = "elt";
if (substr_count($string,$suchstring) > 1)
{   
  // suchstring in string mindestens einmal vorhanden, macht was
}
else
{  
  // suchstring NICHT vorhanden
}

Gar nicht schwer, oder?

Darüberhinaus kann man auch einen offset angeben, sozusagen die Startposition, in unserem Beispiel oben ergibt das:

echo substr_count($string,$suchstring);
echo substr_count($string,$suchstring,12);

Ergebnis:
2
1

Der optionale vierte Parameter gibt die Suchlänge an, d.h.:

echo substr_count($string,$suchstring);
echo substr_count($string,$suchstring,12,3);

Ergebnis nun:
2
0

Die Funktion ist sehr schnell – in meinen Tests sogar schneller wie strpos – und läßt sich auch sehr einfach einsetzen; darüberhinaus ist substr_count binary-safe, d.h. es arbeitet auch mit UTF-8 usw.

Mein Tipp: spart euch Zeit und nerven, benutzt die Funktionen die schon da sind, erfindet nicht das Rad neu und werdet schneller produktiv…

strtolower auch für UTF-Sonderzeichen

Das Problem: Ein beliebiger String soll kleingeschrieben werden.

Unsere Funktion dazu:

$sMyString = strtolower(trim($sMyString));

Das funktionierte aber plötzlich für einen String nicht mehr, das große Ö blieb ein großes Ö, also debuggen und siehe da, im Zend Debugger stellt sich das Ö als Viereck dar –> Hinweis auf ein Somderzeichen. Es war auch wirklich kein ASCII-Ö, sondern ein UTF8-Ö (komm da erstmal drauf).

Die Lösung: Es wird die Multibyte-Variante von strtolower benutzt:

$sMyString = mb_strtolower(trim($sMyString));

Vorher allerdings drauf achten, dass euer Projekt auch wirklich UTF-8 geeignet ist.

Dazu

  • Datei als UTF-8 speichern
  • Charset UTF-8 einstellen
  • Die mysql-connect’s auf UFT-8 einstellen, dies geht so

// mysql_connect

mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");

// query ausführen

Diesen Code nach dem mysql_connect und der ersten Abfrage ausführen, dann hat man alle Daten als UTF-8.

Ach ja, und natürlich auch die Datenbank-Tabellen in einem geeigneten Charset speichern 😉

Immatrikuliert

Es geht weiter, grade kam per Post meine Imatrikulationsbescheinigung. Ab April geht es dann mit 3 Modulen los.

Natürlich war dem ganzen auch gleich der Gebührenbescheid angehängt, was dann die Freude wieder etwas trübt.

Naja, ab April kann ich meine Gedanken dann auf “Mathematische Grundlagen”, “Einführung in die objektorientiere Programmierung” und “Datenstrukturen I” lenken.