18.04.2007 - Zend_Db_Table in Javascript

Da hat sich wieder jemand einige Gedanken gemacht, wie man es einem erleichtern kann, in AJAX Applikationen, mit Zend_Db_Table zu arbeiten. Dieser Jemand ist war und ist Maurice Fonk. In seinem Blog beschreibt er sein JsTable getauftes Projekt, wie folgt:

JsTable is a Prototype class that allows you to work with Zend_Db_Table objects directly from Javascript. It has mechanisms for basic communication with a server that holds the ‘real’ models. It gets it’s information in Json, either synchronously or asynchronously.

Ich finde dieses Projekt sehr interessant, jedoch hat es, wie schon im Artikel beschrieben und im ersten Kommentar von Greg noch einige Sicherheitsprobleme, wodurch ich derzeit noch jedem davon abrate es zu nutzen. Testen kann man es aber für den öffentlichen Einsatz ist es meiner Meinung noch nicht geeignet. Ich habe mir das für das Projekt mal ein Lesezeichen angelegt und ich werde auch die Diskussion in der Zend Framework Mailinglist verfolgen.


06.04.2007 - pecl_http entdeckt

Gestern musste ich aufgrund einer kleineren Umstrukturierung ein Skript von $_POST auf $_GET umschreiben, da die PHP Datei nicht mehr direkt sondern nurnoch indirekt eingebunden wurde (durch ein <embed>). Also suchte ich etwas, womit ich einen POST Request schnell in einen GET Request umwandeln kann und da fand ich pecl_http. Ich muss sagen, dass diese Extension super ist. Mit http_build_str konnte ich einfach meinen POST Request in eine GET URL umwandeln. Sehr nett finde ich auch die 7 HTTP*-Klassen, denn mit ihnen kann man einiges einfacher handhaben und man muss sich nicht mehr um die Formatierung des Requests kümmern. Meiner Meinung nach eine sehr gute Extension, aber leider ist es noch eine Extension und muss so nachträglich installiert werden.


14.03.2007 - Bug Report ZF-1018 fixed

18

In der Revision 3916 des Zend Frameworks wurde der, von mir gemeldete, Bug gefixed. Beim Testen von Zend_XmlRpc_Server hatte ich das Problem, dass meine Requests nicht angenommen wurden. Fehler war dahingehend, dass alle Parameter als "void" gekennzeichnet wurde und dem war eben nicht so und zudem gibt es keine Fuktionen/Methoden mit mehr als einem "void" in der Parameterliste. Nach langem hin und her kam heraus, dass der Fehler daran liegt, dass ich bei den phpDoc´s in meinem Code mehrere Leerzeichen zwischen dem Tag und dem Datentyp bzw. der Beschreibung geschrieben habe. Die Lösung war dann schnell geschaffen, denn es fehlten lediglich an 4 Stellen im Code in regulären Ausdrücken jeweils ein "+" (Plus).

Dahingehend ein Danke an Matthew Weier O'Phinney, der diesen Bug heute Mittag gefixed und ins SVN eingespielt hat.


22.02.2007 - Zend Framework 0.8.0 ist da

18

Seit gestern gibt es ein neues Release des [url=http://framework.zend.com/]Zend Frameworks[/url]. Wenn man sich mal die [url=http://framework.zend.com/changelog]Changelog[/url] anschaut, dann sieht man mal wie da derzeit reingehauen wird um bald endlich die Version 1.0 zu präsentieren. Diese soll, laut Roadmap, Ende März kommen und dann wird das Zend Framework sicherlich nochmal einen großen Schub bekommen, denn dann ist das Framework endlich auf einen Stand, mit dem man produktiv arbeiten können soll. Das wird dahingehend noch sehr viele hinzuziehen, die sich bisher noch nicht getraut haben was damit zu machen, da sich noch zu oft was ändert.

Wenn man sich mal meinen eingesetzte Version des Zend Frameworks anschaut, dann sieht man mal wie alt die Version ist. Ich nutze noch die Version 0.2.0 mit Revision 1478 und aktuell gibt es nun Version 0.8.0 mit Revision um 3500.

Stolz auf diesen Release bin ich auch, da zwei meiner Reports für diese Version beachtet wurden und sogar geschriebener Patch (#ZF-728) für Zend_Log_Adapter_Db eingespielt wurde. Somit gehört mir zumindest schonmal eine Zeile im Code des Zend Frameworks.


08.02.2007 - Privates mal ganz Öffentlich II

Hinweis: Dieser Artikel bezieht sich auf Privates mal ganz Öffentlich.

Aus dem deutschen Zend Framework Forum ging die Diskussion nun in die Mailinglist des Zend Frameworks und das eigentliche Problem hat sich herausgefiltert. Der Fehler ist nicht, dass man private Eigenschaften, die Objekte beinhalten, manipulieren kann, sondern dass bei einem Array-Typecast die protected und private Eigenschaften auch rüberkommen. Bei dem Typecast sollten theoretisch nur als public deklarierte Eigenschaften in einen Array umgewandelt werden, dann würde sich das genauso verhalten wie folgender Code:

<?php

class ForeachTest {
    public 
$a 'test_a';
    protected 
$b 'test_b';
    private 
$c 'test_c';
}

$oForeachTest = new ForeachTest;
foreach (
$oForeachTest as $sKey => $mValue) {
    echo 
$sKey ' => ' $mValue;
}

?>

Bei diesem Code werden nur die öffentlichen (public) Eigenschaften beachtet. Ein Array-Typecast soll sich also genau verhalten und nur die public Eigenschaften beinhalten. Mal schauen was draus wird. Ich hoffe jedoch, dass das anerkannt wird.

a => test_a

08.02.2007 - Privates mal ganz Öffentlich

45

Hinweis: Dieser Artikel wird weitergeführt in Privates mal ganz Öffentlich II.

Programmierern die sich schonmal mit der Objektorientierten Programmierung auseinandergesetzt haben, wissen sicherlich was der Unterschied der verschiedenen Sichbarkeiten (public, protected, private) ist. Diese Sichbarkeiten wurden aus dem Grunde geschaffen um den Zugriff auf einzelne Eigenschaften und Methoden nur für bestimmte Zwecke freizugeben. Für die, die nun noch nicht wissen, was die Sichbarkeiten genau sind, nochmal ein kleiner Exkurs.

Es gibt in PHP und vielen anderen Sprachen drei Sichbarkeiten (andere Sprachen können auch mehr haben). Zu diesen Sichtbarkeiten zählen public (öffentlich), protected (geschützt) und private (privat). Alle Methoden und Eigenschaften in Klassen die als public deklariert sind können innerhalb der Klasse sowie von ausserhalb durch eine Instanz genutzt werden. Sie sind für alle öffentlich verfügbar. Ist eine Methode oder eine Eigenschaft als protected deklariert, so ist sie nur aus der eigentlichen Klasse und allen erbenden Klassen verfügbar. Der Zugriff von aussen ist somit nicht mehr möglich. Als private deklarierte Methoden und Eigenschaften gelten nur in der Klasse, in der sie deklariert wurden.

Bei PHP gab es hinsicht auf die Sichtbarkeit schon einige Diskussionen, aber nun habe ich vor einigen Wochen durch Zufall herausbekommen, wie man an protected und private Eigenschaften kommt. Wenn man nun ein wenig zurückdenkt, so habe ich erklärt, dass sie nur für die eigentliche Klasse und alle erbenden Klassen verfügbar sind. Aufgefallen ist mir dies beim Arbeiten mit der Zend_Config-Klasse bei der ich ein Objekt zu einem Array umwandeln wollte und einfach mal einen Array-Typecast genutzt habe. Primär war mir dabei aufgefallen, dass mir bei einer Ausgabe mittels Zend::dump() bzw. var_dump() irgendwelche Zeichen untergekommen waren, die es sogar verhinderten die Ausgabe in den Zwischenspeicher zu kopieren. Erst dachten wir, dass es an einem falschen Zeichensatz liegt, aber es wird wohl mitunter ein Sicherheitsaspekt sein. Trotz dessen habe ich weitergeschaut und herausgefunden, wie man an, als protected und private deklarierte, Eigenschaften kommt. Am besten kann ich das mit einem Beispiel erklären.

<?php

class Visibility
{
    private 
$privProp;
    public function 
__construct() {
        
$this->privProp = new stdClass;
        
$this->privProp->bImportant true;
    }
    public function 
isImportant() {
        return 
$this->privProp->bImportant;
    }
}

?>

Hier haben wir die Visibility (engl. Sichtbarkeit) Klasse, die eine private Eigenschaft beinhaltet. Beim Erzeugen einer Instanz der Klasse wird im Konstruktor die private Eigenschaft privProp mit einem Objekt der Klasse stdClass gefüllt. Diesem Objekt geben wir dann ebenfalls noch eine Eigenschaft (public) namens bImportant. Sie beinhaltet einen boolschen Wert und ist wichtig für den weiteren Verlauf. Okay, in diesem Beispiel ist diese Eigenschaft eher unwichtig aber wir stellen uns nun einmal vor, dass dort ein wichtiger Status gespeichert wurde, der unbedingt für den weiteren Verlauf benötigt wird. Die Methode isImportant() macht nichts als den Wert der Eigenschaft bImportant zurückzugeben. Wir erwarten nun also, dass die Methode true zurückgibt. Hier nun ein weiteres Beispiel:

<?php

$oVisibility 
= new Visibility;
var_dump($oVisibility->isImportant()); // true

?>

Das hat ja bis dahin super geklappt, die Methode gibt, wie erwartet true zurück. Laut der Definition der Sichtbarkeit müsste man sich in diesem Fall voll und ganz darauf verlassen können, denn solange der Code der Klasse nicht geändert wird, kann da auch nichts passieren. Falsch gedacht, denn genau das können wir nicht. Wir können uns noch nicht mal bei private Eigenschaften darauf verlassen, dass drin steht, was vorher mal drin stand. Man nimmt also die Variable $oVisibility und wandelt das beinhaltete Objekt in einen Array:

$aProperties = (array) $oVisibility;

Eine Ausgabe von $aProperties spare ich mir nun, da es genau bei dieser Ausgabe vorkommt, dass da irgendwelche kryptischen Zeichen drin sind, die es verhindern die Ausgabe im Zwischenspeicher zu speichern. Dies tritt aber nur bei private und protected Eigenschaften auf. Soweit sogut, jetzt müssen wir an die Eigenschaft kommen und sie manipulieren. Einen direkten Zugriff haben wir durch die kryptischen Zeichen nicht, also müssen wir alle Eigenschaften durchlaufen und prüfen, ob wir ein Objekt finden, das eine Instanz der Klasse stdClass ist. Haben wir es gefunden, können wir es manipulieren.

<?php

foreach ($aProperties as $mProperty) {
    if (
is_object($mProperty) && ($mProperty instanceof stdClass)) {
        
$mProperty->bImportant false;
    }
}

?>

So, das wärs schon. Haben wir die Eigenschaft gefunden überschreiben wir die Eigenschaft bImportant durch ein false. Fügen wir diesen Codeblock nun in unser Beispiel ein haben wir ein komplett anderes Bild:

<?php

$oVisibility 
= new Visibility;
foreach (
$aProperties as $mProperty) {
    if (
is_object($mProperty) && ($mProperty instanceof stdClass)) {
        
$mProperty->bImportant false;
    }
}
var_dump($oVisibility->isImportant()); // false

?>

Wieso ist denn nun die Ausgabe von isImportant() nicht mehr true? Ja, wie kommt das wohl? Wir haben sie von aussen manipuliert, ohne die eigentliche Klasse zu verändern. Nun ist die Frage, ob dies wirklich im Sinne der PHP Entwickler ist, dass man trotz der Sichtbarkeit, als private und protected deklarierte Eigenschaften manipulieren kann. Meiner Meinung nach ist das ein Bug und sollte behoben werden.


09.01.2007 - Patch für Zend_Log_Adapter_Db::write()

18

Heute stiess ich beim Zend Framework auf kleinere Probleme, die jedoch einen umständlichen Workaround erforderten. Aufgrund einer falschen Benutzung der Zend_Db_Adapter_Abstract::insert()-Methode konnte man die Zend_Log_Adapter_Db::write()-Methode nicht benutzen und musste sich bisher immer einen Workaround schreiben. Nach einer kleinen Diskussion im deutschen Zend Framework Forum habe ich dies gemeldet und einen Patch geschrieben, der diese Probleme löst.

Mal schauen was sich draus entwickelt.


26.12.2006 - Deutsches ZF Forum

Seit einigen Wochen gibt es nun für das Zend Framework, ein kleines deutsches Forum für Anfänger bis ZF-Entwickler, in dem man sich über Neuerungen und Ideen zum Zend Framework unterhalten kann, aber auch seine eigenen Projekte, welche mit dem Zend Framework entwickelt werden, planen und diskutieren kann.

Dieser meinige Blog war Anfangs nur ein erster Test des Zend Frameworks und hat bisher auch noch nicht viel andrang bekommen an Lesern und daher kann ich es mir erlauben meinen Blog nochmal neu aufzubauen. Diese Neustrukturierung werde ich anfangs mit den Benutzern im Forum durchdiskutieren, damit die neue Version des Blogs in Sachen Programmierung auch sehr viel eleganter und übersichtlicher wird. Es wird einige neue Sektionen geben, ich werde ein wenig aufräumen und Funktionalitäten des Blogs ausbessern und stabiler gestalten.


13.12.2006 - Analoge Javascript Uhr

Nachdem ich vor einigen Wochen einen Javascript und AJAX basierten Texteditor geschrieben hab, habe ich mich heute nochmal drangesetzt und auf die schnelle eine analoge Uhr in Javascript geschrieben, die das neue Canvas-Element nutzt. Daher funktioniert diese Uhr auch nur im Firefox 2 , Opera 9 und anderen neuen Browsern.

Da die aktuelle Version noch nicht entgültigt ist, kann ich noch keinen absoluten Link posten, sondern muss euch auf die Startseite des Contest verweisen. Dort müsst ihr dann rechts auf "Clock" klicken. Dann kommt meine in Javascript geschriebene Uhr.


07.12.2006 - Bug in PHP 5.1.2

Heute habe ich einen kleinen Bug in PHP entdeckt, welcher in späteren Versionen jedoch schon gefixed wurde. Fehler ist nur auf Microsoft Windows XP Prof. SP2 getestet.

<?php

    $test 
= array(
        
'data' => array(
            
'persons' => array(
                array(), array(), array()
            )
        )
    );

    foreach(
$test->data->persons as $aPerson) {
        
// ...
    
}

?>

Wird also versucht auf einen Array zuzugreifen, als wäre es ein Objekt, so stürzt sich PHP mit folgender Meldung über den Jordan:

Die Anweisung in "0x10008f4a" verweist auf Speicher in "0x00000000". Der Vorgang "written" konnte nicht auf dem Speicher durchgeführt werden.

Ich habe diesen Bug in den Versionen 4.4.0, 5.1.4 und 5.2.0 getestet und es scheint ein Fehler in der Version 5.1.2 zu sein. Ein Update hilft also.


22.11.2006 - Javascript Texteditor

Aufgrund eines Contests bei WebmasterPro habe ich mich mal ein wenig hingesetzt und habe einen kleinen, einfachen Texteditor geschrieben, der auf Javascript basiert. Über das, von Firebird, bereitgestellte Backend, soll es später möglich sein, dass die einzelnen Tabs und deren Inhalte gespeichert werden. Derzeit ist es lediglich eine temporäre Speicherung und alles wird nach einer Aktualisierung der Seite (F5) zurückgesetzt. Mal schauen, was in nächster Zeit noch von anderen Usern dem Contest beigetragen wird. Curi hat schonmal angemerkt, dass er gerne einen WYSIWYG-Editor erstellen will, ihm jedoch noch kleine Fragen unbeantwortet sind.


16.11.2006 - MySQL FEDERATED Storage Engine

38

Ich habe mich gestern mal gefragt ob es möglich ist eine View zu erstellen, der Daten aus einem anderem Datenbankserver bezieht (beides MySQL-Datenbanken). Ich habe bei Google gesucht und in einigen Foruen rumgefragt aber ne wirkliche Information bzw. Antwort habe ich nirgends bekommen. Durch die PHPUG-OWL kenn ich Hartmut Holzgraefe, welcher bei MySQL arbeitet und da dachte ich mir mal, dass ich ihn mal fragen könnte. Er meinte, dass es nicht direkt geht, ich jedoch die FEDERATED Storage Engine nutzen könnte. Also habe ich in der MySQL Dokumentation gesucht und auch gefunden.

Was ich vor hatte war folgenden. Ich hatte einige Tabellen in denen Daten stehen zu denen ich gerne Statistiken hätte. Da ich dafür aber keine Views auf der Datenbank-A anlegen wollte, da dies lediglich Statistiken für mich werden sollten, wollte ich eine View erstellen auf Datenbank-B, welcher Daten aus der Datenbank-A bezieht und als View darstellt. Nun zur FEDERATED Storage Engine.

Hier mal ein kleines verständliches Beispiel. Auf Datenbank-A gibt es nun eine solche Tabelle:

CREATE TABLE test_info (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    user VARCHAR(50) NOT NULL,
    info VARCHAR(100) NOT NULL,
    status CHAR(1) NOT NULL,
    PRIMARY KEY (id)
) ENGINE=InnoDB;

Dazu will ich nun eine View, die mir angibt, wie oft die Benutzer in der Tabelle vorkommen. Ein View dafür wäre schnell erstellt:

CREATE VIEW ti_view AS
    SELECT
        user, COUNT(0) AS number
    FROM
        test_info
    GROUP BY
        user
    ORDER BY
        number DESC

Problem ist nun halt, dass die View keine Daten aus fremden Datenbankservern beziehen kann. Dafür gibt es nun die Möglichkeit eine Tabelle mit der FEDERATED Storage Engine zu erstellen. Diese Tabelle (Datenbank-B.test_info) muss genau gleich aussehen, wie die Quelltabelle (Datenbank-A.test_info), jedoch wird als ENGINE=FEDERATED genommen und es wird eine CONNECTION angegeben. Dies sieht nun so aus:

CREATE TABLE test_info (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    user VARCHAR(50) NOT NULL,
    info VARCHAR(100) NOT NULL,
    status CHAR(1) NOT NULL,
    PRIMARY KEY (id)
)
ENGINE=FEDERATED
CONNECTION='mysql://username:password@host:port/database/table';

Wie man vllt. schon erkennen kann, gibt man in CONNECTION die Datenbank-Verbindung an. Wenn diese Tabelle nun erstellt ist, kann man ganz einfach einen Query drauf ausführen und dieser gibt genau die Daten zurück, wie als würde man den Query auf der Datenbank-A ausführen. Nun kann darüber einfach eine View erstellt werden und schon hat man eine View für Daten einer anderen Datenbank.

Hinweis: Die FEDERATED Storage Engine ist nur in den MySQL-Max Paketen verfügbar.


17.10.2006 - Eintrag in den Quotes von #php.de

Heute habe ich mein erstes Zitat bekommen. Im IRC-Channel #php.de (Quakenet) wurde heute über eine kleine Anpassung einer Webseite diskutiert und da kam dann folgendes Zitat raus, welches auch hier betrachtet werden kann.

< eYo`awy> wie gesagt, 100eur und ich machs :D
< jumpy^afk> dafür geh ich mir lieber ne frau kaufn
< freq9> die kann aber ned programmieren

In diesem Zitat bin ich "freq9".


10.10.2006 - Eclipse

30

Da mein Zend Studio seit gestern sehr langsam ist, für einen Dateiwechsel >5 Sekunden braucht und auch das Öffnen von Dateien nicht schneller ist, habe ich mir mal Eclipse 3.1 mit den Plugins phpEclipse und subclipse installiert. Also ich muss sagen, dass ich noch nie so schnell von einer IDE begeistert war, wie jetzt. Ein paar Einstellungen, sodass der Highlighter gut aussah, die 80 Zeichen Grenze rein, kleinere Anpassungen an der Schrift und schon kann man super mit Eclipse arbeiten. Auch sehr gut finde ich das SVN Plugin (subclipse) womit man super easy mit einem SVN Repository arbeiten kann. So macht es sehr viel Spaß zu arbeiten.


19.08.2006 - Zend Framework Merchandise

Heute erreichte die Zend Framework Developer Mailinglist eine E-Mail von Andi Gutmans in der er berichtete, dass Zeev Suraski in Japan sei und dort einen Vortrag über das Zend Framework gehalten hat. Anbei dieser E-Mail befanden sich zwei Fotos von diesem Vortrag. Eines dieser Bilder könnt ihr euch hier anschauen. Andi Gutmans bezeichnete diese Tüte als:

[...] one of the first pieces of Zend Framework "merchandise". Cool stuff.