Kategorie: Fehler in der dritten Auflage

In den letzten Tagen hat Christoph Krebs fleißig weiter gelesen und noch ein paar kleinere Fehler im Text gefunden. Vielen Dank Christoph!

Seite 256:
Auf Seite 256 findet sich diese Zeile bei der natürlich ein „s“ in „Klas(s)en“ fehlt: „[…] gibt es einige Klasen im PEAR-Framework […]“

Seite 258/259:
In der Auflistung auf Seite 258 nennt sich ein Verzeichnis in der Auflistung „configs“, auf Seite 259 gibt es einen Ordner „config“. Dort fehlt leider ein „s“ am Ende. Korrekt wäre auch hier „configs“

Seite 265:
Auf Seite 265 fehlt bei dem {$name|spacify:“&nbsp“} natürlich ein Semikolon nach dem &nbsp. Korrekt wäre also {$name|spacify:“ “}

Seite 268:
Hier ist einiges schief gelaufen… Als Beispiel für den Modifikator date_format finden sich dort die folgenden Zeilen:

PHP-Datei
$smarty=new MySmarty;
$smarty->display(‚template.tpl‘);

template.tpl
{$smarty.now|date_format:“}

Ausgabe
Hallo Welt

Zuerst fehlt nach dem date_format zuerst mal die Formatangabe wie das Datum formatiert werden soll. Das heißt nach dem date_format müsste eine Angabe wie z.B. „%d.%m.%Y“ um das Datum eines Tages auszugeben. Die Ausgabe lautet dann natürlich auch nicht „Hallo Welt“ sondern beispielsweise „15.01.1999“.

Seite 278:
Auf Seite 278 findet sich die Zeile

Wie gesagt sind die Funktionsweise von {section} und foreach} recht ähnlich,

am Anfang des dritten Absatzes. Heir fehlt eine geschweifte Klammer vor dem foreach}.

Seite 408:
In der zweiten Zeile des vorletzten Absatzes fehlt ein „zu erkennen“. Der Satz „Sie müssen dem JavaScript-DOM-Ausdruck nur ein dom= voranstellen, und schon ist Selenium in der Lage, dass es sich um DOM handelt.“ müsste natürlich so lauten: „Sie müssen dem JavaScript-DOM-Ausdruck nur ein dom= voranstellen, und schon ist Selenium in der Lage zu erkennen, dass es sich um DOM handelt.“

Christoph Krebs ist ein Mensch der Bücher erschreckend genau lesen kann. Die Fehler die er gefunden hat haben mich wirklich beeindruckt, muss ich zugeben. Freundlicherweise hat er mir eine Mail mit seinen Funden geschickt, sodass ich sie an Euch weitergeben und in der nächsten Auflage korrigieren kann. Vielen Dank Christoph!

Hier seine Funde:

Das Beispiel auf Seite 46 soll diese Ausgabe generieren:

array(4) {
 [0]=>
 int(1)
[]
}

Korrekt wäre aber diese Ausgabe:

array(4) {
 [0]=>
 int(5)
[]
}

Auf Seite 88 findet sich diese Zeile

while (false === ($zeile = mysql_fetch_assoc($erg))) {

die so natürlich keinen Sinn ergibt. Im schlimmsten Fall könnte sie sogar zu einer Endlosschleife führen. Richtig wäre hier ein Ungleich:

while (false !== ($zeile = mysql_fetch_assoc($erg))) {

Auf Seite 97 ist in dem Satz

"Das heißt, hier ist sind die Abfrage und der […]"

ein „ist zu viel enthalten

Auf Seite 117 findet sich diese Fehlermeldung:

die ("Falscher Aufruf: Parameter 3 und 4 müssen Integer-Werte sein");

Leider handelt es sich aber nicht um die Parameter 3 und 4 sondern um die Parameter 2 und 3.

Auf Seite 120 fehlt in dieser Zeile ein s da die Variable natürlich $sql heißen müsste:

$erg = mysql_query($ql, $db);

Auf Seite 129 habe ich einen Fehler in einen Kommentar eingebaut. Der Kommentar in der Klasse ShoppingCart sollte nicht

// Deklaration der Eigenschaften

sondern

// Deklaration der Methoden

heißen

Auf Seite 191 unten steht

"Die Methode bindet dann eine Klassendatei mit dem Namen db_mysql.php ein, […]"

was natürlich nicht korrekt ist. Die Namen der Dateien die eingebunden werden haben noch ein „class“ in der Mitte, sodass der Dateiname „db_mysql.class.php“ lautet.

Auf Seite 222 fehlt im vierten Absatz das Wort „die“ in dem Satz „Sollte es das Verzeichnis mit der externen Bibliothek betreffen, dann schreiben Sie Meldung in ein Logfile.“

In der dritten Auflage habe ich auf Seite 142 bei dem Beispiel mit dem Setter für die Temperatur leider einen Fehler eingebaut.
Dort findet sich diese if-Abfrage:
if (0 > $neue_temp)
Da ist das Größer-Als-Zeichen natürlich falsch. Ein Kleiner-Als-Zeichen wäre korrekt. Das heißt, die if-Abfrage müsste so lauten:
if (0 < $neue_temp)
Vielen Dank an Martin Riedel, der den Fehler gefunden und mich darauf hingewiesen hat.

Am 17.04.09 hat Timo Furrer mir eine Mail geschrieben, in der er mir mitteilte, dass er einige Fehler gefunden hat, die sonst noch niemand entdeckt hatte (zumindest niemand der mir geschrieben hat 😉 ).

Das erste Problem findet sich auf Seite 763, bzw. beginnt es da. Hier wird die Normalisierung von Tabellen erläutert. Bei der Normalisierung hat sich dann aber leider ein kleiner Fehler eingeschlichen. Die ursprüngliche Tabelle, die normalisiert werden soll lautet so:

ID Name Strasse Ort Kinder
1 Meiser Am Wühlwasser 12 33125 Paderborn Gerd 12
Hans 13
2 Müller Gottesberg 1 33119 Paderborn Paula 17
Josy 12
3 Görgens Willemstraße 14 22104 Hamburg

Bei den folgenden Tabellen heißt das älteste Kind von Herrn oder Frau Müller dann aber nicht mehr Paula sondern Gerd, was natürlich falsch ist. Davon sind die Tabellen 9.41, 9.43 und 9.46 betroffen.

Auf Seite 768 füge ich Daten in die Tabelle aenderungen ein und schreibe dann, dass die Spalte aenderungen automatisch ergänzt wird. Die Spalte heißt aber nicht aenderungen sondern nur aenderung.

Auch auf Seite 808 findet sich ein Fehler im Text. In der ersten Zeile auf der Seite steht „Um sowohl bei einem UPDATE als auch bei einem BACKUP einen Backup…“. Korrekt wäre hier allerdings „Um sowohl bei einem UPDATE als auch bei einem DELETE einen Backup…“

Vielen Dank an Timo Furrer

Gestern erreichte mich eine E-Mail in der Steven Lüttig mich freundlicherweise darauf hingewiesen hat, dass ich in der dritten Auflage auf Seite 603 einen Fehler eingebaut habe. In der vorletzten Zeile auf der Seite habe ich start_session() geschrieben. Korrekt wäre natürlich session_start(), wie ich es auch im Listing davor korrekt geschrieben habe.
Leider ist das Verwechseln von session_start() und start_session() wirklich mein absoluter „Lieblingsfehler“ bei der Arbeit mit PHP. Irgendwie schreibe ich das ständig falsch herum. Sorry for inconvenience…
Oh, korrekterweise muss man sagen, dass der Fehler nicht nur die dritte Auflage sondern auch die erste und zweite Auflage betrifft. Der ist nämlich schon immer da. Leider habe ich gerade kein Exemplar der ersten Auflage da, aber in der zweiten Auflage ist der Fehler auf Seite 509 im dritten Absatz in der ersten Zeile.
Vielen Dank an Steven Lüttig für den Hinweis auf den Fehler.

Auch auf Seite 118 (Kapitel 4.2.1) hat sich leider noch ein Fehler eingeschlichen. Und zwar prüfe ich hier mithilfe des Operators instanceof ob $obj eine Instanz der Klasse 'klasse' ist. Ungefähr auf der Mitte der Seite findet sich diese Zeile:

if ($obj instanceof 'klasse')

Das ist leider nicht korrekt. Der Name der Klasse darf bei der Nutzung instanceof nicht in Anführungszeichen (Gänsefüßchen, Hochkommas etc.) gesetzt werden. Nutzt man die Zeile so wie Sie im Buch steht, dann quittiert PHP das mit dieser Meldung:

...syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, 
   expecting T_STRING or T_VARIABLE or '$' in...

Die Zeile müsste also eigentlich so lauten:

if ($obj instanceof klasse)

Vielen Dank an Ralf Oltmanns, der diesen Fehler gefunden und sich bei mir gemeldet hat.
[edit] Fehler korrigiert die Marko gefunden hatte. Vielen Dank für den Hinweis, Marko 🙂

In der dritten Auflage von „Besser PHP programmieren“ ist auf den Seiten 137 und 138 ein gewisses Durcheinander mit den Konstruktoren entstanden. Der Hintergrund ist, dass PHP 4 noch vorgesehen hat, dass der Konstruktor eine Methode ist welche denselben Namen hat wie die Klasse. In PHP 5 funktioniert das zwar auch noch aber ein Konstruktor sollte in PHP 5 den Namen __construct() haben.

Die vorhergehenden Auflagen von „Besser PHP programmieren“ bezogen sich noch auf PHP 4. Bei der Übernahme der Texte für die neue Auflage habe ich auf den Seiten 137 und 138 leider ein paar Sachen mit den Namen der Konstruktoren durcheinander gebracht.

In Listing 4.5 sollte der Konstruktor den Namen __construct() haben und nicht kunde(). Zwar wäre es nicht unbedingt falsch den Konstruktor kunde() zu nennen aber es ist halt PHP 4 und nicht 5. Hier nochmal das Listing 4.5 in einer korrekten Version:

class Kunde extends Kontakt
{
   var $anrede; // die zusätzlichen Eigenschaften
   var $email;
   function __construct ($anrede,$name,$telefon,$email) // Konstruktor
   {
      parent::__construct($name,$telefon); // Konstruktor der Basisklasse aufrufen
      $this->anrede=$anrede; // neue Eigenschaften zuweisen
      $this->email=$email;
   }
   function zeigeAn() // zeigt alle Daten an
   {
      echo "Anrede: $this->anrede <br />"; // Anrede ausgeben
      parent::zeigeAn(); // zeigeAn aus der Basisklasse aufrufen
      echo "<br />E-Mail: $this->email"; // E-Mail ausgeben
   }
}

Des Weiteren findet sich in der Erläuterung des Konstruktors auf Seite 138 diese Zeile:

parent::kontakt($name, $telefon);

Das ist natürlich falsch. Im Code, in Listing 4.5, ist die Zeile korrekt. Das heißt, hier müsste eigentlich

parent::__construct($name, $telefon);

stehen…

Leider hat die Fehler niemand bemerkt bevor das Buch in Druck gegangen ist. Eigentlich ist es ja immer wieder erstaunlich, dass niemand einen solchen Fehler bemerkt. Ich selbst habe den Text geschrieben und mehrfach gelesen. Dann haben ihn noch der Gutachter, der Lektor und die Korrektorin gelesen aber niemandem ist das aufgefallen. Vielen Dank an José Stiller der diesen Fehler gefunden und mir eine Mail geschrieben hat.

Weitere Informationen zu Konstruktoren in PHP 4 und 5 gibt es hier