Wednesday, January 2. 2008
PEAR unter OSX Leopard installieren
OSX 10.5 Leopard installiert. Dies sollte unter den vorherigen OSX
Versionen sicher ähnlich funktionieren.
Auf meinem lokalen System habe ich PHP5 von entropy.ch am laufen, da
ich unbedingt die GD-Lib benötige. Dies hat nur Einfluss auf die Ablage
der php.ini. Dies muss eben von den auf dem jeweilig auf dem System vorhandenen
Gegebenheit abhängig gemacht werden.
Wir werden in /usr/local/ installieren, und dem System gestatten die TEMP-Files
in /usr/local/temp abzulegen.
sudo chmod -R 777 /usr/local/temp
sudo mkdir /usr/local/share/pear
sudo chmod -R 777 /usr/local/share/pear
Im nächsten Schritt wird go-pear ausgeführt.
Hier muss bei den Pfaden der 1. auf /usr/local geändert werden.
Alle anderen Einstellungen können in der Regel beibehalten werden.
Während der Installation kommt dann die Warnung, dass der PEAR Pfad
noch nicht in der php.ini vorhanden ist, und es deswegen zu Problemen
mit der Verwendung von den PEAR Scripts kommen kann.
Hier kommen wir an den Punkt wo es wichtig ist, zu wissen, wo die
Konfigurationsdatei des Webservers liegen muss. Dies kann man einfach
über ein kurzes Script herausfinden:
Im Browser die Datei ansehen und nach folgender Zeile suchen.
Hier muss die php.ini für den Webserver liegen, die php.ini für
das Command-Line-Interface (CLI) unabhängig davon in /etc/
Standardgemäß ist eine php.ini.default in /etc/. Diese kopieren
und modifizieren wir zunächst.
sudo nano /etc/php.ini
Nun nach dem Eintrag include_path suchen und diesen um "/usr/local/share/pear"
ergänzen. Bei mir sah dies nach der Anpassung so aus.
Ist eine php.ini in dem Config-Path des Webservers vorhanden bearbeiten
wir diese, ansonsten kopieren wir die Datei /etc/php.ini an die gewünschte
Stelle
Abschließend muss noch der Webserver neu gestartet werden, dann ist PEAR
einsatzfähig.
Anmerkung: Kann PEAR von der Konsole nicht mit dem Befehl pear aufgerufen werden,
ist /usr/local/bin nicht korrekt in den SHELL-Pfaden eingetragen, und sollte nachgetragen
werden. Tipp: echo $PATH zum überprüfen in der SHELL eingeben.
Monday, October 1. 2007
jpgraph und utf-8 daten
in kryptischen Buchstaben dargestellt werden, obwohl gültige Daten in UTF-8
angeliefert wurden, ist nur einen kleinen Schritt von der Lösung entfernt.
Die Ursache des Problems liegt darin dass die Standardschriftarten von jpgraph
kein UTF-8 darstellen können.
Daher kann man sich einfach wie auch auf der jpgraph Seite angegeben ein
entsprechendes Schriftpaket herunterladen. Ich hab mich in meinem Fall für
Verda entschieden.Dies bekommt man hier: http://www.gnome.org/fonts/
Die Schirften lädt man sich herunter und lädt Sie in ein beliebiges Verzeichnis.
Nun muss nur noch das Verzeichnis der Library bekannt gemacht werden:
Nun muss man noch mittels SetFont angeben, wo welche Schrift eingesetzt werden
soll. Mir ist es allerdings nicht gelungen die Schriftart für die Beschriftung in den
Netzdiagrammen (jpgraph_radar.php) festzulegen, daher musste ich manuell
die Standardschrift ändern, indem ich in jpgraph.php und jpgraph_radar.php FF_FONT1
durch FF_VERA ersetzt habe.
Nun sollten alle Umlaute auch angezeigt werden können.
Thursday, August 16. 2007
Weitere Lektion in der Umlautproblematik
Speicherplatzgründen die im UTF-8 Format sind in z.b. dem latin1 charset abzulegen,
muss ich dem nun komplett wiedersprechen.
Bei einem durchschnittlichen Projekt lädt man sich deutlich mehr Ärger auf,
als dass man dadurch Vorteile durch Speicherplatzersparnis erzielt.
In meiner Situation sah das dann so aus, dass ich ca. 8 Stunden damit beschäftigt
war, alle Datenbanken meiner Kunden umzustellen, was enorm händische Arbeit
erforderte.
Im Ist-Zustand war es nun auch so, dass mittels phpMyAdmin logischerweise
alle Umlaute kaputt angezeigt wurde, und man nicht oder nur mit hohem manuellen
Aufwand direkt die Daten bearbeiten konnte.
Ausgangssituation
Datenbank mit latin1 als Standardcharset, alle Tabellen latin1, und UTF-8 Daten darin gespeichert.
Ziel
Datenbank & Tabellen UTF-8, und alle Inhalte UTF-8
Ich habe mich für utf8_general_ci entschieden, der unterschied zu utf8_unicode_ci liegt nur in
der Abhandlung von Sortierreihenfolgen. Dies kann man aber im Detail dem MySQL Manual entnehmen.
1.) Datenbank Backup erstellen
Gehen wir einfach mal auf nummer sicher, um die Daten auch sicher nicht
endgültig zu zerstören.
2.) Umwandeln aller Tabellen voll automatisch, und davon sollen auch alle
Text und Varchar Felder umgewandelt werden. Manch einer wird hier noch anpassungen
vornehmen müssen, da ich keine Char Felder umwandle, da die nicht benötigt
werden. ACHTUNG! Das Script basiert wie alle meine Code Snippets auf adodb,
kann aber Problemlos auf die von MySQL zur Verfügung stehenden Funktionen
portiert werden.
// fetch all tables
$data = $cfg['db']->pExecute("SHOW
TABLES");
while($row = $data->FetchRow())
{
$sres = $cfg['db']->pExecute("DESCRIBE ".($row[0]));
while( $column = $sres->FetchRow())
{
// if column is text or varchar, convert
if(strpos($column['Type'],'text')!==false || strpos($column['Type'],'char')!==false
|| strpos($column['Type'],'varchar')!==false)
{
$cfg['db']->Execute("ALTER TABLE ".($row[0])." CHANGE ".($column['Field'])." ".($column['Field'])." ".($column['Type'])." CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL");
}
}
// confert now also full table
$cfg['db']->Execute("ALTER TABLE ".$row[0]." DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci");
}
?>
3.) Manuelles Umwandeln der Datenbank
Ich habe mich dazu entschieden die eigentliche Datenbank händisch umzuwandeln,
da ich mich eh mit der Datenbank verbinden musste. Dazu habe ich dann folgendes
SQL Statement eingegebn
4.) Exportieren der Daten
Nun werden die Daten der kompletten Datenbank exportiert, nicht aber die
Struktur. Dies wird für die meisten am besten mittels einer grafischen Oberfläche
wie phpMyAdmin erledigt. Hier kann man dies mit weigen Mausklicks erreichen.
5.) Umwandeln des Datendumps
Nun wandeln wir einfach noch die "kaputten Zeichen" zurück in UTF8.
In meinem Fall und in den meisten wird folgendes Script hinreichend sein.
Dazu muss eine Datei data.sql im gleichen Verzeichnis wie das eigentliche
PHP Skript sein.
$str=file_get_contents('data.sql');
$bad_char=array("ä","ö","ü","Ä","Ö","Ü","ß");
$right=array('ä','ö','ü','Ä','Ö','Ü','ß');
$bla=str_replace($bad_char,$right,$str);
echo $bla;
?>
6.) Abschließende Arbeiten
Um die ganze Aktion abzuschließen, muss nur noch die Datenbank geleert werden,
un der neue Dump eingelesen werden. Dann sollte man die Umlaute alle
im entsprechenden Format in der Datenbank haben.
Nun werden einige aber sicher zerstörte Umlaute in der Ausgabe haben,
und sich wundern warum. Dies liegt an der MySQL Verbindung die einen
Befehl zu beginn benötigt um UTF8 sauber zu behandeln.
Nun sollte es endlich geschafft sein, und man sollte sich nun hoffentlich
wieder wichtigeren Dingen widmen können
Achja, heikel ist dann auch das string handling an manchen stellen, daher sollte man auf
die mb_* funktionen von PHP zurückgreifen.
Thursday, June 7. 2007
gängige PHP Fehler - Tipps & Tricks
und bei der Fehlersuche zu helfen. Dabei ist mit allerdings sehr schnell
aufgefallen dass einige grundlegende Unschönheiten zu finden sind.
Daher will ich anhand des mir zugesandten Codes einige Tipps zur PHP Entwicklung
geben.
register_globals
Ein immer wieder auftrendes Problem ist die register globals Geschichte,
da PHP einem lange Zeit die Freiheit ließ, auf die POST Variable 'test' auf
zwei Arten zuzugreifen. Entweder als $test, oder per $_POST['test'].
Nutzt man erstere Variante kann man sich nie sicher sein, woher der
Inhalt der Variablen eigentlich stammt, und man vergisst leicht einen
vielleicht gefährlichen Inhalt zu escapen. Sofern die Möglichkeit besteht
ist es sogar empfehlenswert register_globals auszuschalten. Aber man
sollte es sich zumindest immer angewöhnen, auf POST/GET/REQUEST variablen
immer mittels den dafür vorgesehenen superglobalen Arrays zuzugreifen.
SQL Injections
Eine große Gefahr stellen vor allem im Zusammenhang mit register_globals
die SQL Injections dar, über die nicht gewollter SQL Code eingeschleußt
werden kann. Um hier nicht auszuschweifen sollte man sich immer angewöhnen,
Inhalt der manipuliert sein kann, zu escapen. Eine einfach Möglichkeit
hierzu bietet mysql_real_escape_string(). Man sollte sich wenigstens
angewöhnen den Inhalt immer zu escapen. Es empfiehlt sich auch eine
eigene Funktion dafür zu nehmen, dass man später auch noch andere
Verfahren einsetzen könnte, indem man nur eine Funktion überarbeiten
muss. Hier ein Beispiel:
CODE:/**
* easy accesible handle to escape all db strings
* @param string $string string which should be escaped to be put into an sql statement
* @return string returns the escaped string
*/
function escapeDB($string)
{
global $run;
if(is_numeric($string))
{
return $string;
} else {
return $run['db']->qstr($string,get_magic_quotes_gpc());
}
}
Variablen
Man sollte Variablen immer klein schreiben, und Umlaute sollten nicht
eingesetzt werden. Es ist meist auch recht angenehm die äquivalente englische
Bezeichnung für Variablen zu verwenden. EIn unschönes Beispiel:
CODE:'$Arbeitsverhaeltnis', '$Kündigungsfrist', '$Sonstiges'
Fehlermeldungen
Fehlermeldungen sollte man am besten immer beherzigen. PHP kennt verschiedene
Modi, je nach "wichtigkeit" eines Fehlers. Meist werden die NOTICE's
ausgeblendet. Allerdings sind NOTICES oft auch recht hilfreich,
da man erkennt wo man z.B. eine noch nicht initialisierte Variable
verwendet. Es empfiehlt sich meistens alle Fehlermeldungen anzuzeigen.
Die macht man wie folgt:
CODE:error_reporting(E_ALL);
Vor allem gefährlich ist das manuelle Unterdrücken von Fehlermeldungen
mittels dem @ Operator. Diesen sollte man auch nicht einsetzen, da dadurch
die Fehlersuche oft erschwert sein kann.
Dies mal nur als kurze Zusammenfassung.
Saturday, March 31. 2007
PHP5/PHP5 method_exists
vermutlich an method_exists() kaum vorbei.
Heute musste ich allerdings feststellen, dass PHP4 alle Klassennamen im lowercase überprüft,
PHP5 hingegen so wie es geschrieben wurde. Dies führte natürlich in meinem aktuellen Projekt
zu massiven Schwierigkeiten.
Es bleibt kaum eine andere Lösung, als sich selber eine lowercase Version von method_exists anzufertigen.
Die könnte wie folgt aussehen.
{
$classMethods = array_map('strtolower', get_class_methods($class));
if(in_array(strtolower($method),$classMethods))
{
return true;
} else {
return false;
}
}
Das hab ich dann implementiert, und seither funktioniert alles so wie man es verwenden sollte.
Achja und wenn wir gerade beim Thema sind, man wird auch schnell feststellen, dass
call_user_method deprecated ist und daher nicht mehr eingesetzt werden sollte.
Zumindest laut meiner PHP4 version, im Manual konnte ich dazu nicht viel finden.
Dies kann man aus dem Weg schaffen, indem man call_user_func() oder call_user_func_array()
mit folgenden Parametern aufruft.
Monday, March 19. 2007
MSSQL to MySQL konvertieren
in MSSQL gehalten wurde, und ich die Datenbank nur umständlich über ein Weboberfläche
"verwalten" konnte.
Da ich wenigstens die aktuelle Datenstruktur ansehen wollte, den Code der zu dem Projekt
gehört kann eh nicht weiterverwendet werden, musste ich irgendwie ein SQL Statement
erzeugen, was mit dem Tool aber nicht möglich war.
Dann stieß ich auf das MySQL Migration Toolkit, mit welchem man an sich
komfortabel eine MSSQL Datenbank auslesen könnte, und direkt in eine MySQL Datenbank
schreiben kann. Allerdings war, wie nicht anders zu erwarten, der SQL Server nicht von außen
zugänglich.
Die einzige Lösung die somit noch blieb war über ein PHP/ASP Skript, was direkt auf dem
Server liegen kann und soch somit auch verbinden kann. Nach längerer Suche stieß ich auf
das Greenlight SQL Tool.
Aus dem heruntergeladenen ZIP Archiv muss man nur noch die dumpdb.php hochladen und
anpassen. In meinem Fall wollte ich eine MSSQL DB auslesen und in ein MySQL Format bringen.
Standardmäßig sieht der erste teil der Config so aus
$dbhost = (! empty($HTTP_POST_VARS["dbhost"])) ? $HTTP_POST_VARS["dbhost"]
: "localhost";
$dbname = @$HTTP_POST_VARS["dbname"];
$dbuser = @$HTTP_POST_VARS["dbuser"];
$dbtype = (! empty($HTTP_POST_VARS["dbtype"])) ? $HTTP_POST_VARS["dbtype"]
: (function_exists("mssql_connect") ? "mssql" : "mysql");
$targetType = (! empty($HTTP_POST_VARS["targetType"]))
? $HTTP_POST_VARS["targetType"] : $dbtype;
Woher die HTTP_POST_VARS kommen sollen, war mir unklar daher habe ich das wie folgt
angepasst.
$dbhost = 'localhost';
$dbname = 'db123';
$dbuser = 'user123';
$dbtype = 'mssql';
$targetType = 'mysql';
Nun kann man das Skript über den Browser aufrufen und erhält die Datei direkt zum
Download. Ist dies nicht der Fall fehlt vermutlich PEAR::DB, welches unbedingt vorhanden
sein muss.
Dies kann man allerdings auch direkt in das Verzeichnis hochladen, wenn PEAR nicht
direkt gegeben ist. Auf dies komme ich in einem der nächsten Blog Einträge zurück.
Sunday, March 18. 2007
FCK Editor 2.4 und das Phänomen der kleingeschriebenen Pfade
Bisher hat der Editor die Dateien die man hochgeladen hat, immer in
/userfiles/Image/ oder z.b. /userfiles/File/ hochgeladen
Image oder File sind die Ressource Typen.
Seit 2.4 lädt der Editor aber die Dateien immer in /userfiles/image/.
Das ist ziemlich blöd, wenn der Kunde alle seine Bilder in /Image/ liegen hat.
Dazu gibt es 2 Lösungsansätze.
1.) Umbenennen von /Image/ in /image/
Das alte Verzeichnis kann einfach in kleingeschrieben umbenannt werden.
Dies sollte man mit allen Ressource Typen machen, die man verwendet.
Allerdings sollte man beachten, dass man evtl. noch eine Datenbank updaten
muss, wenn sich die Pfade geänder haben.
Dies kann man mit der Anleitung des vorherigen Blog Posts machen.
2.) Man passt die PHP Datein vom FCKEditor an
Seit der neuen Version hat sich hier was verändert
return $GLOBALS["UserFilesPath"] . strtolower( $resourceType ) . $folderPath ;
editor/filemanager/browser/default/connectors/php/io.php:45:
$sResourceTypePath = $GLOBALS["UserFilesDirectory"] . strtolower( $resourceType ) . '/' ;
Und zwar ist das strtolower hinzugekommen. Entfernt man dieses verhält sich alles wieder wie gehabt.
return $GLOBALS["UserFilesPath"] . $resourceType . $folderPath ;
editor/filemanager/browser/default/connectors/php/io.php:45:
$sResourceTypePath = $GLOBALS["UserFilesDirectory"] . $resourceType . '/' ;
Zusammenfassung
Allerdings ist die Methode 1 sicher die zukunftssichere. Da man sonst bei jedem Update wieder an das ändern der
Dateien denken muss.
Monday, March 5. 2007
Validierung von Ausweisdaten mit PHP
die letzte Ziffer, sei die Zahl, wieviele Leute in Deutschland einem ähnlich
sind
Dem ist nicht so. Hinter der Ausweisnummer steckt ein triviales System.
Der erste Block setzt sich zusammen aus der Ausgabenummer des Ortes, von dem
man den Ausweis bezogen hat, einer zufälligen Nummer, einer Prüfziffer, und
der Staatsangehörigkeit.
Beispiel:
Die letzte Zahl vor dem D ist die Prüfziffer (5), und das D ist die Staatsangehörigkeit,
also Deutsch.
Der zweite Block beinhaltet das Geburtsdatum des Ausweisinhabers, in der
Form YYMMDD und eine Prüfziffer
Beispiel:
9 ist in dem Beispiel die Prüfziffer, und der Ausweisinhaber wurde am 20. Juli 1986
geboren.
Der dritte Block ist wie der zweite, beinhaltet allerdings das Gültigkeitsdatum.
Beispiel:
In dem Fall ist die Prüfziffer wieder 9, und der Ausweis ist gültig bis zum 20. Juli 1986.
Der letzte Block ist eine Prüfziffer von den Prüfziffern.
Prüfziffern
Hinter den Prüfziffern verbirgt sich ein einfacher Algorithmus.
Dies wird solange wiederholt, bis alle Zahlen summiert werden. Das Ergebnis Modulo 10
ist dann die Prüfziffer.
Beispiel:
Berechnung:
129 % 10 = 9
Daher ist die Prüfziffer 9.
Auch die Prüfziffer der Prüfziffern wird nach dem gleichen Algorithmus berechnet.
Code
/**
* class to verify the german passport number
*/
class verify_passport
{
var $full_number;
var $blocks=array();
var $result;
var $is_valid=true;
var $expires;
/**
* Constructor
* @param string $number passportnumber
* @return void
*/
function verify_passport($number)
{
/**
* Remove the < and split into the 4 blocks
* If $number > 26 $number is invalid
*/
if(strlen($number)>26 || strlen($number)<26)
{
$number=str_replace('<','',$number);
if(strlen($number)>26)
{
die('invalid passport length');
}
}
$this->blocks[1]=substr($number,0,11);
$this->blocks[2]=substr($number,11,7);
$this->blocks[3]=substr($number,18,7);
$this->blocks[4]=substr($number,25,1);
foreach($this->blocks as $key => $value)
{
if(!$this->verify_block($key,$value))
{
echo $key;
$this->is_valid=false;
return;
}
}
/**
* Set the expire date
*/
$this->expires=mktime(0,0,0,substr($this->blocks[3],2,2),substr($this->blocks[3],4,2),substr($this->blocks[3],0,2));
}
/**
* Verifies the single Blocks
* @param integer $type block id
* @param string $data block content
* @return boolean
*/
function verify_block($type,$data)
{
switch($type)
{
case 1:
return ($this->calc_checksum(substr($data,0,-2))==$data{9} ? true : false );
break;
case 2:
case 3:
return ($this->calc_checksum(substr($data,0,-1))==$data{6} ? true : false );
break;
case 4:
return ($this->calc_checksum(substr($this->blocks[1],0,-1).substr($this->blocks[2],0).substr($this->blocks[3],0))==$data{0} ? true : false );
break;
}
}
/**
* Calculates the Checksum for the given line
* @param string $data
* @result unit place of the checksum
*/
function calc_checksum($data)
{
$result=0;
$length=strlen($data);
for($i=0;$i<$length;$i++)
{
switch($i%3)
{
case 0:
$result+=$data{$i}*7;
break;
case 1:
$result+=$data{$i}*3;
break;
case 2:
$result+=$data{$i};
break;
}
}
return $result%10;
}
/**
* Checks if all was valid - Also if passport is not expired
* @return boolean
*/
function is_valid()
{
if($this->is_valid)
{
if(time()<=$this->expires)
{
return true;
}
}
return false;
}
/**
* Returns the Age in array or unix timestamp
* @param integer $type 0=array 1=timestamp
* @return array or timestamp
*/
function get_age($type='0')
{
$year=substr($this->blocks[2],0,2);
/*
* Create a 4 digit Year number
*/
if($year>=20)
{
$year=(substr(date("Y"),0,2)-1)*100+$year;
} else {
$year=substr(date("Y"),0,2)*100+$year;
}
$month=substr($this->blocks[2],2,2);
$day=substr($this->blocks[2],4,2);
if($type==0)
{
return array('year'=>$year,
'month'=>$month,
'day'=>$day);
} else {
return mktime(0,0,0,$month,$day,$year);
}
}
}
?>
Funktionsweise
Der Constructor teilt die Nummer in die Blocks auf, und überprüft ob die Länge
der Nummer korrekt ist. Ist dies nicht der Fall wird die Class sofort beendet.
Der die() ist zugegeben etwas hart, und sollte im Produktiven Einsatz vielleicht
nicht so verwendet werden
Danach kann ich mir über die Methode is_valid() anzeigen lassen, ob die
Ausweisnummer gültig ist. Die Funktion gibt einen Boolschen Wert zurück.
Neben den Prüfziffern wird auch überprüft, ob das Ablaufdatum noch nicht
erreicht ist.
Man kann sich auch das Geburtsdatum als Unix Timestamp oder als Array ausgeben lassen.
Dies geht mittels get_age($type). ist type 0 wird in Array mit den Keys (year,month,day
zurückgegeben, ansonsten ein Unix Timestam.
Der Einsatz
Das folgende Beispiel soll abschließend die Funktionsweise verdeutlichen.
var_dump( date("Ymd",$try->get_age(1)) );
var_dump( $try->is_valid() );
$ppn sollte die Ausweisnummer beinhalten.
Saturday, February 17. 2007
Mails UTF-8 kodiert versenden
Man kann zum einen die Mails wieder in ISO konvertieren, allerdings möchte ich nur auf die Möglichkeit eingehen,
Mails unkonvertiert zu versenden. Dazu muss an sich nur das Encoding im Header in der Funktion mail()
gesetzt werden.
"subject",
"content",
"From: bla@bla.de\r\nContent-Type: text/plain; charset=UTF-8");
Alternativ kann man auch mb_send_mail() verwenden.
Thursday, January 18. 2007
CSV Dateien in MySQL importieren
class csv2mysql
{
/**
* DB Host
*/
var $host='';
/**
* DB User
*/
var $user='root';
/**
* DB Pass
*/
var $pass='';
/**
* DB Name
*/
var $db;
/**
* Table Name
*/
var $table;
/**
* CSV Separator
*/
var $separator=';';
/**
* Filename to import
*/
var $filename;
/**
* DB Handle
*/
var $db_handle;
/**
* File Handle
*/
var $file_handle;
/**
* Max Line length in CSV File
*/
var $max_line_length=1000;
/**
* Insert Count
*/
var $count=0;
/**
* Konstruktor to set the options
*
* options: dbname,tablename,separator
*/
function csv2mysql($options)
{
if(empty($options['dbname']))
{
die("you have to enter a database name!");
} else {
$this->db=$options['dbname'];
}
if(empty($options['table']))
{
die("you have to enter a table name!");
} else {
$this->table=$options['table'];
}
if(empty($options['filename']))
{
die("you have to enter a filename!");
} else {
$this->filename=$options['filename'];
if(!file_exists($this->filename))
{
die("file does not exist");
}
}
if(!empty($options['separator']))
{
$this->separator=$options['separator'];
}
$this->db_handle=mysql_connect($this->host,$this->user,$this->pass);
mysql_select_db($this->db,$this->db_handle);
return;
}
function convert()
{
$this->file_handle=fopen($this->filename,"r");
if($this->file_handle && $this->db_handle)
{
while($data=fgetcsv($this->file_handle,$this->max_line_length,$this->separator))
{
$res=mysql_query("INSERT INTO ".$this->table."
VALUES (".join($data,',').")",$this->db_handle) or die(mysql_error());
if($res)
{
$this->count++;
}
}
echo $this->count;
} else {
die("could not open file or database");
}
}
}
$imp=new csv2mysql(array('filename'=>'/www/test.csv',
'dbname'=>'plzdb',
'table'=>'plz'));
$imp->convert();
?>
Aufgrund den anstehenden Prüfungen verzichte ich auf das erklären des Codes, das müsste man auch so verstehen können
Sunday, December 31. 2006
Arrays in Smarty
Dies stellt die einfachste Art dar, wie man dies erledigen kann. Mit der ist man wohl
auch desöfteren konfrontiert, und stellt daher bestimmt kein Problem dar.
Allerdings kann Smarty auch mit [] umgehen, und ermöglicht daher auch den dynamischen
Zugriff auf mehrdimensionale Arrays.
<th>{$calc[$car.sxID].20000.total_saving}</th>
{/foreach}
Dies ist für manche Anwendungsfälle ganz praktisch.
Saturday, December 30. 2006
PHP4 und PHP5 auf einem Confixx Server
Allerdings ist das sicher für einige interessant, ich wäre auch froh, wenn das mein Provider endlich umsetzen würde
http://www.mytso.net/howtos/suphp-confixx3-php4-php5
Wednesday, November 22. 2006
Nächtlicher Spaß mit PEAR::Services_Google
$key='FxrFp55QFHJv0ccvxxxxxxxxxxxxxxxxxxx';
$test=new Services_Google($key);
echo $test->spellingSuggestion(utf8_encode('tippfheler'));
Das ist eine tolle Funktion bei der man auf die "Vorschlags"-Funktion von
Google zurückgreifen kann. Man braucht nur einen Google Key, aber
den bekommt man dann einfach so.
Man kann bis zu 1000 Anfragen / Tag über die API machen.
Viel Spaß!
Saturday, November 18. 2006
UTF-8 in Webapplikationen
Die Erfahrungen will ich hier nun kundtun.
Es ist vielleicht noch keine perfekte Lösung, aber Sie tut erstmal Ihren Dienst.
Allgemeines
Zum ersten muss dem Browser gesagt werden, welches Charset verwendet werden soll, nämlich UTF-8.
Dies ist vor allem dann ein Problem wenn der Browser das selbst festlegt, kann man böse Überraschungen
erhalten.
Dies sollte überall eingebunden werden. Man kann auch in der Css festlegen, welche Zeichensatz
verwendet werden soll, dies habe ich bisher aber noch nicht benötigt
Praktisch ist vor allem im Umgang mit PHP, die Anwendung von header()
Man kann dies auch in der php.ini spezifizieren, sofern man Zugriff darauf hat. (default_mimetype & default_charset)
Damit der Besucher der Website auch in allen Formularen UTF-8 eingeben kann sollte man
accept-charset in den FORM-Kopf mit aufnehmen.
Der Vollständigkeit halber auch noch die Einbindung in XML
PHP
All diese Einstellungen machen es möglich, dass UTF eingegeben und ausgegeben werden kann.
Die meisten die das verwenden haben allerdings eine Datenbank im Hintergrund, und schon da kann
es komplizierter werden. Als erstes benötigen wir eine Funktion, die überprüft ob ein String bereits
UTF-8 ist:
* Checks if String is UTF-8 Encoded
* @param string $string string to check
* @return boolean
*/
function is_utf8($string)
{
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $string);
}
Dies ist nach der Vorgabe von W3.
Somit kann nun schoneinmal festgestellt werden ob der String utf8 ist.
Nun noch eine Funktion, die UTF8 encodiert. Achtung, die Funktion benötigt is_utf8()
* Encodes String to UTF8
* @param string $string
* @return string
*/
function cms_utf8_encode($string)
{
if(is_utf8($string))
{
return $string;
} else {
if(function_exists('mb_convert_encoding'))
{
return mb_convert_encoding($string,'utf-8');
} else {
return utf8_encode($string);
}
}
}
Hier wird der String encodiert, bevor er z.B. in die Datenbank geschrieben wird.
Datenbank
Ich habe mich auch mit dem Thema UTF-8 und Datenbank auseinandergesetzt. Dabei muss man folgendes Wissen:
UTF-8 kostet mehr als z.B. der latin1 Zeichensatz, da mehr Speicherplatz verwendet wird. Sogar 3x soviel
Daher habe ich mich dazu entschlossen, da in der regel die wenigsten Zeichen in meinem System in Unicode gespeichert werden sollen, den latin1 Zeichensatz zu lassen.
Ich encodiere nur UTF-8 und leg das eben dann so ab. Funktioniert wunderbar, und ich hoffe das gibt keine Probleme.
In dem zug auch eine sehr detaillierte Beschreibung zu dem Thema von Kris Köhntopp.
Monday, November 6. 2006
PHP4 & PHP5 auf einem MacBook Pro
Nun will ich wieder beide PHP Versionen Parallel zueinander laufen lassen.
PHP4 muss man sich Compilen, oder man kann auf die mit OSX ausgelieferte
Version zurückgreifen. Dies werde ich in diesem Fall tun.
In der http.conf muss nur PHP4 aktiviert werden. Nachdem dies getan ist,
kopieren wir die Konfigurationsdatei.
Nun installieren wir gleich PHP5. Die Packages dazu findet
Ihr bei
In der Regel ist Apache 1.3 vorinstalliert.
Nachdem PHP5 installiert ist kopieren wir die Config erneut
Nun kommt das Script das für den Wechsel zuständig ist:
if [[ "$1" == 5 || "$1" == 4 ]]; then
VERSION=$1;
else
echo -n "Please choose between PHP4 and PHP5 (4/5)";
echo -e "";
fi
if [ "$VERSION" == 4 ]; then
sudo cp /etc/httpd/httpd.php4.conf /etc/httpd/httpd.conf;
echo "config updated to php4 - restarting Apache graceful..";
sudo apachectl graceful;
elif [ "$VERSION" == 5 ]; then
sudo cp /etc/httpd/httpd.php5.conf /etc/httpd/httpd.conf;
echo "config updated to php5 - restarting Apache graceful..";
sudo apachectl graceful;
fi
Das Skript habe ich hier auch schonmal geposted, aber in diesem Zuge nochmals...
Einfach das Skript speichern, und dann wie folgt ausführen:
Dann wird die PHP4 Config kopiert und der Apache neugestartet.
Das Gleiche geht auch in die andere Richtung.
Inhalt
Calendar
|
|
March '10 | |||||
| Mon | Tue | Wed | Thu | Fri | Sat | Sun |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 | ||||
Google Werbung
Archives
Categories
Syndicate This Blog
Getaggte Artikel
Top Referers
www.baidu.com (1)
Statistiken
© Copyright 2006, nerdwg.org design by Luka Cvrk, port for s9y by nerdwg.org

