<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
> <channel><title>knallisworld &#187; PHP</title> <atom:link href="http://www.knallisworld.de/blog/category/entwicklung/php/feed/" rel="self" type="application/rss+xml" /><link>http://www.knallisworld.de/blog</link> <description>Where is the beef?</description> <lastBuildDate>Thu, 02 Feb 2012 23:10:07 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <item><title>{DEVELOPERS SHAME DAY}</title><link>http://www.knallisworld.de/blog/2010/11/03/developers-shame-day/</link> <comments>http://www.knallisworld.de/blog/2010/11/03/developers-shame-day/#comments</comments> <pubDate>Tue, 02 Nov 2010 22:01:38 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Allgemeines]]></category> <category><![CDATA[Entwicklung]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Technologie/IT]]></category> <category><![CDATA[Wtf..?!]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1278</guid> <description><![CDATA[Cem hat kÃ¼rzlich den Developers Shame Day ins Leben gerufen. Als Stichtag wÃ¼rde ich denÂ 3.11.2010 vorschlagen.Â Ich stelle mir vor, dass an diesem Tag alle Entwickler, die ein Blog oder eine Seite betreiben, ein kleines StÃ¼ck Code prÃ¤sentieren, dass aus heutiger (oder vielleicht auch damaliger) Sicht total hirnverbrannt ist. Ein StÃ¼ck Code, dass uns [...]]]></description> <content:encoded><![CDATA[<p>Cem hat kÃ¼rzlich den <a
href="http://phphacker.net/2010/10/26/der-developers-shame-day/">Developers Shame Day ins Leben gerufen</a>.</p><blockquote><p>Als Stichtag wÃ¼rde ich denÂ <strong>3.11.2010</strong> vorschlagen.Â Ich stelle mir vor, dass an diesem Tag alle Entwickler, die ein Blog oder eine Seite betreiben, ein kleines StÃ¼ck Code prÃ¤sentieren, dass aus heutiger (oder vielleicht auch damaliger) Sicht total hirnverbrannt ist. Ein StÃ¼ck Code, dass uns selbst die SchamrÃ¶te ins Gesicht steigen lÃ¤sst. Dabei ist egal, ob es sich um PHP, JavaScript, CSS, HTML, Java, C oder sonst etwas handelt. Es muss nur von euch sein und es darf nicht verÃ¤ndert werden (umeventuell doch als total verrÃ¼ckter Hund dazustehenÂ  ). Ein kleiner erlÃ¤uternder Text sollte natÃ¼rlich auch nicht fehlen.</p></blockquote><p><img
class="aligncenter size-full wp-image-1287" title="Developers Shame Day" src="http://www.knallisworld.de/blog/wp-content/uploads/2010/11/developersshameday.png" alt="" width="500" height="100" /></p><p>Und das ist mein Beitrag, wohl einer meiner ersten Gehversuche in PHP. Der Quellcode entstammt einer Datei namens &#8220;functions.inc.php&#8221; [sic!]. Und <em>es scheint</em> <em>so</em> <img
src='http://www.knallisworld.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> , also wÃ¤re es eine grÃ¶ÃŸere Anwendung gewesen, ich habe jedoch echt keine Ahnung mehr welche &#8212; vielleicht die erste PHP-Homepage in Eigenentwicklung? Die Datei hatte sich irgendwie auf meine &#8220;Informatik-Diskette&#8221; [sic!] (Oberstufenkurs) verirrt, von der ich tatsÃ¤chlich noch ein Abbild hatte. Der Rest der ProgrammiersÃ¼nden muss entweder (m)einen Backup-AufrÃ¤umaktionen oder einem vor einigen Jahren aufgetreten Backupmediumfehler zum Opfen gefallen sein. Zu meiner Verteidigung kann ich wohl nur sagen hoffen, dass dies einer erste Spielversion war und nie &#8220;produktiv&#8221; wurde.</p><h3>Listing</h3><p>Bitte in voller LÃ¤nge genieÃŸen. Jede Zeile ist ein Genuss. *ankoppfass*</p><p>UnverÃ¤ndert, nur Benutzername/Passwort habe ich ausgeixt.</p><p>Datei: <em>functions.inc.php (von 2002 oder 2003)</em></p><pre class="brush: php; title: ; notranslate">
&lt;?php
//conf.inc.php
//please don't change this file manually - go to your admin-area to change settings!!!
$listname=&quot;Meine Linkliste&quot;;
$listname2=&quot;Downloads&quot;;
$linkwidth=&quot;100%&quot;;
$addpagewidth=&quot;50%&quot;;
$catorder=&quot;name&quot;;
$incatsort=&quot;Hits&quot;;
$perpage=&quot;5&quot;;
$max_search=&quot;10&quot;;
$adminpw=&quot;a&quot;;
$max_desc_leng=&quot;500&quot;;
$html=&quot;ON&quot;;
$language=&quot;german.lang&quot;;
$timeformat=&quot;1&quot;;
 @include(&quot;global/$language&quot;); // language-file
 @include(&quot;../global/$language&quot;); // language-file
//connect.inc.php
// DON'T CHANGE THIS FILE MANUALLY - EDIT ONLY VIA ADMIN-AREA
$server=&quot;localhost&quot;;
$user=&quot;xxx&quot;;
$pass=&quot;xxx&quot;;
$mydb=&quot;xxx&quot;;
$db_prefix=&quot;xl_&quot;;
$db_prefix2=&quot;dl_&quot;;
function JPDiv ($a,$b) {
  $i=0;
  $j=0;
  while($j==0) {
    if(($a/($b*($i+1)))&gt;1) {
      $i++;
    } else {
      $j = 1;
    }
  }
return $i;
}
function JPDatumZeit ($a) {
  $JPTag = array(&quot;Sonntag&quot;,&quot;Montag&quot;,&quot;Dienstag&quot;,&quot;Mittwoch&quot;,&quot;Donnerstag&quot;,&quot;Freitag&quot;,&quot;Samstag&quot;);
  $JPMonat = array(&quot;Januar&quot;,&quot;Februar&quot;,&quot;MÃ¤rz&quot;,&quot;April&quot;,&quot;Mai&quot;,&quot;Juni&quot;,&quot;Juli&quot;,&quot;August&quot;,&quot;September&quot;,&quot;Oktober&quot;,&quot;November&quot;,&quot;Dezember&quot;);
  $JPDatumTag = $JPTag[date(&quot;w&quot;,$a)];
  $JPDatumMonat = $JPMonat[date(&quot;n&quot;,$a)-1];
  $JPDatumJahr = date(&quot;Y&quot;,$a);
  $JPZeit = date(&quot;H:i:s&quot;,$a);
  $b = $JPDatumTag . &quot;, &quot; . date(&quot;j&quot;) . &quot;. &quot; . $JPDatumMonat . &quot; &quot; . $JPDatumJahr . &quot; [&quot; . $JPZeit . &quot;]&quot;;
return $b;
}
function JPDatumZeit2 ($a) {
  $JPDatumJahr = date(&quot;Y&quot;,$a);
  $JPZeit = date(&quot;H:i:s&quot;,$a);
  $b = date(&quot;j&quot;) . &quot;.&quot; . date(&quot;w&quot;,$a)+1 . &quot;.&quot; . $JPDatumJahr . &quot; [&quot; . $JPZeit . &quot;]&quot;;
return $b;
}
class my_zugriff{
//Variablen fÃ¼r Zugangsdaten
var $user=&quot;xxx&quot;;		//Benutzername fÃ¼r den MySQL-Zugang
var $password=&quot;xxx&quot;;		//Passwort
var $host=&quot;localhost&quot;;	//Name (IP-Adr.) des Rechners mit MySQL
var $dbname=&quot;xxx&quot;; 	//Name der Datenbank
//Weitere Variablen
var $db_verbindung=false; //Speichert die Verbindungskennung
var $sql_result=false; //Speichert die Kennung eines ausgewerteten SQL-Befehls
//Konstruktor definieren
function my_zugriff(){
   //Funktion verbinden wird bei Aufruf der Klasse ausgefÃ¼hrt
	 $this-&gt;verbinden();
}
//Falls keine Verbindung besteht,
//Verbindung aufbauen und Datenbank als Standard definieren
function verbinden(){
if ($this-&gt;db_verbindung==false){
   $this-&gt;db_verbindung = @mysql_connect($this-&gt;host, $this-&gt;user, $this-&gt;password);
   if(empty($this-&gt;db_verbindung)){
      $this-&gt;fehler(&quot;Beim Verbinden&quot;);
   }
   $auswahl = @mysql_select_db($this-&gt;dbname, $this-&gt;db_verbindung);
   if(empty ($auswahl)){
      $this-&gt;fehler(&quot;Beim Ausw&amp;auml;hlen der DB&quot;);
   }
   return $this-&gt;db_verbindung;
}
}
//Gibt Fehlermeldung aus und beendet das Skript
function fehler($fehlerpunkt){
    echo $fehlerpunkt . &quot; ist ein Fehler aufgetreten!&lt;br&gt;&quot;;
		echo mysql_error() . &quot;&lt;br&gt;&quot;; //Fehlerbezeichnung
		echo mysql_errno();	 	 		//Fehlernummer
		echo &quot;&lt;/body&gt;&lt;/html&gt;&quot;;		//Html-Tags schlieÃŸen
		exit;
}
//SQL-Befehl ausfÃ¼hren
function sql_befehl($sql){
$this-&gt;sql_result = @mysql_query($sql, $this-&gt;db_verbindung);
if (empty($this-&gt;sql_result)){
	 $this-&gt;fehler(&quot;Beim Senden der Abfrage&quot;);
}
return $this-&gt;sql_result;
}
//Falls zuvor ein SQL-Befehl ausgefÃ¼hrt wurde,
//wird hier das Array mit den DatensÃ¤tzen ausgegeben
function sql_daten(){
if(!empty($this-&gt;sql_result)){
		$sql_array=@mysql_fetch_array($this-&gt;sql_result);
		return $sql_array;
}else{
		$this-&gt;fehler(&quot;Beim Ausgeben der Datens&amp;auml;tze&quot;);
}
}
//eig. Fkt
function sql_num_rows($sql){
$this-&gt;sql_befehl($sql);
$rows = MYSQL_NUM_ROWS($this-&gt;sql_result);
return $rows;
}
}
$db=new my_zugriff();
$db-&gt;sql_befehl(&quot;SELECT elem_string FROM elem_global WHERE elem_name='JPmyVersion'&quot;);
$myVersion_now = $db-&gt;sql_daten();
 $JPmyVersion = $myVersion_now[0];
?&gt;
</pre><h3>Selbstreflexion</h3><ul><li>Struktur: globale Variablen</li><li>Struktur/Aufbau:Â als Script noch okay, aber als Include? Oweh..</li><li>Includes mittendrin</li><li>Variabel- und Funktionsnamen multilingual</li><li>Inhalt der Funktionen..</li><li>kein gÃ¤ngiger Codestyle (ja, der Blog zeigt&#8217;s richtig an)</li><li>Inline-SQL(!)</li></ul><p>Kurzum: What the hell&#8230;?</p><p>Weitere via <a
href="http://www.google.de/search?q=%22developers+shame+day">Google</a> oder <a
href="http://twitter.com/#!/search/Developers%20Shame%20Day">Twitter</a> oder <a
href="http://www.facebook.com/event.php?eid=165246213503708">Facebook</a>.</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2010/11/03/developers-shame-day/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Best practices in papayaCMS 5 &#8211; oder: Sinnvolle Aufteilung der Modulklassen.</title><link>http://www.knallisworld.de/blog/2009/10/29/best-practices-in-papayacms-5-oder-sinnvolle-aufteilung-der-modulklassen/</link> <comments>http://www.knallisworld.de/blog/2009/10/29/best-practices-in-papayacms-5-oder-sinnvolle-aufteilung-der-modulklassen/#comments</comments> <pubDate>Thu, 29 Oct 2009 19:31:21 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Empfehlungen]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Technik]]></category> <category><![CDATA[Tipps]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=887</guid> <description><![CDATA[Vor wenigen Tagen wurde papayaCMS 5.0Â verÃ¶ffentlicht. Da eventuell der ein oder andere mit dem System nun herumexperimentiert, wird man als Entwickler auch schnell Module entwickeln wollen. Vor allem bei grÃ¶ÃŸeren Modulen (bestehend aus vielen Ausgabe-Klassen) empfiehlt sich eine weit granulÃ¤rere Aufteilung als zwingend vorgeschrieben ist. Ich erspare mir die ErklÃ¤rung der Basispapayasystems, dafÃ¼r mÃ¶ge [...]]]></description> <content:encoded><![CDATA[<p>Vor wenigen Tagen wurde <a
title="papayaCMS 5.0" href="http://www.papaya-cms.com">papayaCMS</a> 5.0Â <a
href="http://www.knallisworld.de/blog/2009/10/27/papaya-cms-5-released-neue-homepage/">verÃ¶ffentlicht</a>. Da eventuell der ein oder andere mit dem System nun herumexperimentiert, wird man als Entwickler auch schnell Module entwickeln wollen. Vor allem bei grÃ¶ÃŸeren Modulen (bestehend aus vielen Ausgabe-Klassen) empfiehlt sich eine weit granulÃ¤rere Aufteilung als zwingend vorgeschrieben ist.</p><p>Ich erspare mir die ErklÃ¤rung der Basispapayasystems, dafÃ¼r mÃ¶ge man bitte die entsprechenden <a
href="http://www.papaya-cms.com/papaya-cms-5-dokumentation.172.html">Dokumentionen</a> (PDF) konsultieren. Nur so viel sei gesagt: Um die Daten von der Datenbank auf den Bildschirm zu bekommen, braucht man grundsÃ¤tzlich nur eine Ausgabeklasse (Seite, Box, usw.) und ein entsprechendes XSL-Template. Aber, aber..</p><div
id="attachment_888" class="wp-caption alignright" style="width: 310px"><a
href="http://www.knallisworld.de/blog/wp-content/uploads/2009/10/schlechtes_beispiel.png"><img
class="size-medium wp-image-888" title="Ineffiziente Strukturierung der Klassen" src="http://www.knallisworld.de/blog/wp-content/uploads/2009/10/schlechtes_beispiel-300x171.png" alt="Ineffiziente Strukturierung der Klassen" width="300" height="171" /></a><p
class="wp-caption-text">Ineffiziente Strukturierung der Klassen</p></div><p>Prinzipiell gilt: MVC-Kenner werden einen sehr leichten Einstieg haben, die anderen sollten bei Fragen zunÃ¤chst diese Thematik verinnerlichen.</p><p>Damit eine Klasse Zugriff auf die Datenbank hat, muss es von base_db (sys_base_db.php) abgeleitet werden. Vor allem bei kleinen Seitenmodulen passiert es hÃ¤ufig, dass der Entwickler die Kurzversion nimmt: Generalisierung der Datenbankklasse, 1-2 Queries und XML-Ausgabe. SpÃ¤testens, wenn man die gleiche FunktionalitÃ¤t &#8211; etwa &#8220;last blog post titles&#8221; &#8211; nicht nur als Seiten- sondern auch als Boxmodul benÃ¶tigt, entsteht doppelte Code. Doppelter und redundanter Code. Schlecht. Ein guter Ansatz, um die <em>ZustÃ¤ndigkeiten</em> zu prÃ¼fen und zu ermitteln, ob Operationen sich nicht generalisieren und delegieren lassen kÃ¶nnen. Und ja, wir kommen dem Ziel <em>MVC</em> damit praktisch sehr nahe.</p><p>Alleine aus diesem praktische Grunde (und selbstverstÃ¤ndlich ist die Verwendung von Delegation grundsÃ¤tzlich in Modulsystem zu befÃ¼rworten) <strong>empfiehlt sich der Einsatz einer Datenbasisklasse</strong>. Diese Klasse erweitert die o.g. Datenbankklasse, die Ausgabemodule instanziieren nur noch diese Basisklasse. Und fÃ¼r unsere Freunde der notorischen Delegationsverweigerer: Mit &#8220;Seitenklasse erweitert Datenbankklasse&#8221; kommt ihr nicht weiter&#8230; und das gilt selbstverstÃ¤ndlich auch fÃ¼r alle anderen Arten von Modulen. TatsÃ¤chlich ist hier Delegation unbedingt notwendig.</p><p>Ein weiterer Vorteil ist die bessere Wartbarkeit und Ãœbersichtlichkeit (vgl. MVC). SelbststÃ¤ndlich werden auch schreibene Operationen in dieser Klasse implementiert. Der Einsatz von Interfaces oder mehrerer Datenbasisklassen steht jedem frei. Man sollte aber nicht mit Kanonen auf Spatzen schieÃŸen, ein komplexes System wird durch mehr KomplexitÃ¤t nicht wirklich einfacher.</p><div
id="attachment_890" class="wp-caption alignleft" style="width: 310px"><a
href="http://www.knallisworld.de/blog/wp-content/uploads/2009/10/gutes_beispiel1.png"><img
class="size-medium wp-image-890" title="Beispiel mit Kompetenzen: Delegation" src="http://www.knallisworld.de/blog/wp-content/uploads/2009/10/gutes_beispiel1-300x236.png" alt="Beispiel mit Kompetenzen: Delegation" width="300" height="236" /></a><p
class="wp-caption-text">Beispiel mit Kompetenzen: Delegation</p></div><p>Die weitere Aufgabe des Ausgabemoduls (vgl. Controller) ist natÃ¼rlich auch die Ausgabe.. ja, kein Witz <img
src='http://www.knallisworld.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> Auch hier gibt es eine Ã¤hnliche Konstellation wie bei den Datenbankabfragen, aber in der umgekehrten Sicht: Es gibt in grÃ¶ÃŸeren System hÃ¤ufig gleiche oder Ã¤hnliche Ausgaben. Auch hier kann die Faulheit einen schnell dazu verleiten, den XML-Code im Controller selbst zu schreiben &#8211; ist ja praktisch. Aber auch hier gilt: SpÃ¤testens wenn man selber [beim Refactoring] anfÃ¤ngt, und klasseninterne Helpermethoden zur Sub-XML-Generierung zu bauen oder gleichen XML-Code an mehr als 1-2 Stellen verwendet.. richtig: Delegation! Hier <strong>empfiehlt sich der Einsatz einer Ausgabebasisklasse</strong>. Jene Klasse hat im Wesentlichen nur eine Aufgabe: FÃ¼r einen oder mehrere Parameter (idR eine Datenarraystruktur) ein geschÃ¤ftsklassenabhÃ¤ngiges XML zu bauen. Es gibt weder eine Verbindung zur Datenbank noch zu anderen Ausgabemodulen.</p><p>Ebenfalls fÃ¼r diese Klassen gilt: Eine weitere strukturelle Aufteilung der Ausgabebasisklassen kann, muss aber nicht vorteilhaft sein.</p><p>SelbstverstÃ¤ndlich lassen sich beide Klasse auch in Nicht-Ausgabemodulen verwenden, etwa einem Connectormodul. Das ist vor allem fÃ¼r Module interessant, die bestimmte Daten und/oder XML (aus welchen GrÃ¼nden auch immer) weitergeben mÃ¼ssen.</p><p>Tipp 1: Vor allem bei mehreren Seiten- oder Boxmodulen kann es durchaus sinnvoll sein, eine gemeinsame Oberklasse (base_myplugin_content) zu erstellen. Hier lassen sich auch direkt die notwendigen Basisklassen korrekt instanziieren.</p><div
id="attachment_892" class="wp-caption alignright" style="width: 310px"><a
href="http://www.knallisworld.de/blog/wp-content/uploads/2009/10/gutes_beispiel2.png"><img
class="size-medium wp-image-892" title="Komplexes Beispiel mit Oberklassen fÃ¼r Module" src="http://www.knallisworld.de/blog/wp-content/uploads/2009/10/gutes_beispiel2-300x114.png" alt="Komplexes Beispiel mit Oberklassen fÃ¼r Module" width="300" height="114" /></a><p
class="wp-caption-text">Komplexes Beispiel mit Oberklassen fÃ¼r Module</p></div><p>Tipp 2: Die Verwendung des Singleton-Pattern steht einem frei: In der Regel hat es aber wenig Sinn, die Datenbasisklasse mehrfach zu erstellen (kann vorkommen, wenn Boxen in Seiten des gleichen Modules auftauchen). Daher: <em>getInstance()</em>.</p><p>In der Zusammenfassung:</p><ul><li>Trennung der ZustÃ¤ndigkeiten und Verwendung von Delegation, aber: Generalisierung geht auch</li><li>Verwendung von Datenbasisklassen, bspw. base_myplugin_data extends base_db</li><li>Verwendung von Ausgabebasisklassen, bspw. base_myplugin_output extends base_object</li><li>delegierte Verwendung der o.g. Klassen in Seiten- und Boxmodulen</li></ul> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2009/10/29/best-practices-in-papayacms-5-oder-sinnvolle-aufteilung-der-modulklassen/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Database Exporter: Database Structure and Naming Analyzer</title><link>http://www.knallisworld.de/blog/2007/10/24/database-exporter-database-structure-and-naming-analyzer/</link> <comments>http://www.knallisworld.de/blog/2007/10/24/database-exporter-database-structure-and-naming-analyzer/#comments</comments> <pubDate>Wed, 24 Oct 2007 19:06:16 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Allgemeines]]></category> <category><![CDATA[Downloads]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Privat]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/2007/10/24/database-exporter-database-structure-and-naming-analyzer/</guid> <description><![CDATA[Mit dem Database Exporter 1.0 kann man die Struktur und die Namensgebung seiner Datenbank (mitsamt aller Tabellen und Feldern) analysieren. Dabei reicht es, die Zugangsdaten (Host, Benutzername, Password) anzugeben, und man kann eine komplette Datenbank (hier: DATABASENAME) in ein Verzeichnis (hier: xml) zu exportieren. $dbexporter->exportDbStructureToXML('DATABASENAME', 'xml'); WÃ¤hrend des Schemaexports wird auch die Struktur analysiert und [...]]]></description> <content:encoded><![CDATA[<p>Mit dem <a
href='http://www.knallisworld.de/blog/2007/10/24/database-exporter-database-structure-and-naming-analyzer/database-exporter-10/' rel='attachment wp-att-330' title='Database Exporter 1.0'>Database Exporter 1.0</a> kann man die Struktur und die Namensgebung seiner Datenbank (mitsamt aller Tabellen und Feldern) analysieren.</p><p>Dabei reicht es, die Zugangsdaten (Host, Benutzername, Password) anzugeben, und man kann eine komplette Datenbank (hier: DATABASENAME) in ein Verzeichnis (hier: xml) zu exportieren.</p><pre lang="php">$dbexporter->exportDbStructureToXML('DATABASENAME', 'xml');</pre><p>WÃ¤hrend des Schemaexports wird auch die Struktur analysiert und nach einigen Gesichtspunkten bewertet:</p><ul><li>FremdschlÃ¼sselabhÃ¤ngigkeiten werden automatisch gefunden, wenn FremdschlÃ¼ssel einmalig heiÃŸen; d.h. beispielsweise in der Tabelle postings heiÃŸt es user_id und nicht poster_id, wenn damit eigentlich auf users.user_id verwiesen wird (id wie in ROR wird nicht verwendet)</li><li>gefundene AbhÃ¤ngigkeiten werden zudem mit ihren Typen verglichen, wobei davon ausgegangen wird, dass der Typ im HauptschlÃ¼ssel (Primary Key) der richtige ist</li></ul> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2007/10/24/database-exporter-database-structure-and-naming-analyzer/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>PHP/zlib: Wie ermittelt man die unkomprimierte DateigrÃ¶ÃŸe einer .gz-Datei?</title><link>http://www.knallisworld.de/blog/2007/10/22/phpzlib-wie-ermittelt-man-die-unkomprimierte-dateigrose-einer-gz-datei/</link> <comments>http://www.knallisworld.de/blog/2007/10/22/phpzlib-wie-ermittelt-man-die-unkomprimierte-dateigrose-einer-gz-datei/#comments</comments> <pubDate>Mon, 22 Oct 2007 18:36:59 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Allgemeines]]></category> <category><![CDATA[Howtos]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Technologie/IT]]></category> <category><![CDATA[Was ich schon immer mal wissen wollte..]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/2007/10/22/phpzlib-wie-ermittelt-man-die-unkomprimierte-dateigrose-einer-gz-datei/</guid> <description><![CDATA[Problem: Mit $fh = gzopen($fileName, 'r'); erhÃ¤lt man einen Filepointer auf die Datei, aber fÃ¼r gzread() benÃ¶tigt man neben dem Filepointer auch eine Leseinheit (und in den meisten FÃ¤llen dÃ¼rfte das der Inhalt sein). Allerdings kommen wir mit filesize($fileName) nicht weiter, denn damit erhalten wir nur die GrÃ¶ÃŸe der komprimierten Datei zurÃ¼ck. Antwort: Nach einem [...]]]></description> <content:encoded><![CDATA[<p>Problem: Mit <code>$fh = gzopen($fileName, 'r');</code> erhÃ¤lt man einen Filepointer auf die Datei, aber fÃ¼r <code>gzread()</code> benÃ¶tigt man neben dem Filepointer auch eine Leseinheit (und in den meisten FÃ¤llen dÃ¼rfte das der Inhalt sein). Allerdings kommen wir mit <code>filesize($fileName)</code> nicht weiter, denn damit erhalten wir nur die GrÃ¶ÃŸe der komprimierten Datei zurÃ¼ck.</p><p>Antwort: Nach einem Beitrag von <a
href="http://de3.php.net/manual/de/function.gzread.php#73724">zaotong</a> auf <a
href="http://php.net/gzread">php.net/gzread</a> wird die OriginaldatengrÃ¶ÃŸe in den letzten 4 Bytes der Datei gespeichert; alles was man machen muss, ist also die letzten 4 Bytes auslesen und als BuffergrÃ¶ÃŸe nutzen.</p><p>Snippet:</p><pre lang="php" lineno="1">$fileName = 'compressed.gz';
// normal Ã¶ffnen, windows-binÃ¤rmode
$fh = fopen($fileName, "rb");
// springe zum 4. vorletzen byte
fseek($fh, -4, SEEK_END);
//lese die nÃ¤chsten 4 bytes (also die letzten)
$readBuf = fread($fh, 4);
// binÃ¤rdaten lesen, ist integer (4 Byte)
$gzSize = end(unpack("V", $readBuf));
// pointer wieder schliesen
fclose($fh);
// nun entkomprimieren, windows-binÃ¤rmode
$fh = gzopen($fileName, "rb");
// nun kÃ¶nnen wir angeben, wieviel wirkliche daten wir lesen wollen
$content = gzread($fh, $gzSize);
// und brav wieder schlieÃŸen
gzclose($fh);</pre>]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2007/10/22/phpzlib-wie-ermittelt-man-die-unkomprimierte-dateigrose-einer-gz-datei/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
