Zitat von
Matze:
Code:
// unset deprecated globals
unset($HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS, $HTTP_SERVER_VARS, $HTTP_POST_FILES, $HTTP_ENV_VARS, $HTTP_SESSION_VARS);
Du weisst dass du unter PHP5 mit $_GET, $_POST usw. Vorlieb nehmen musst und die Variablen nur bei gesetztem Ini-Flag noch gefuellt werden?
Ich kann den Prepared-Statement-Vorschlag nur empfehlen, aber noch mehr empfehle ich aber nen Blick ueber den Tellerrand (naja, teilweise). Hier mal ein Beispiel mit Prepared Statements von php.net kopiert:
Code:
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;
/* execute prepared statement */
$stmt->execute();
Hier ein Beispiel, das auf
Doctrine basiert:
Code:
public function getEmploymentHistory()
{
return Doctrine::getTable('EmployeesEmploymentVersion')->createQuery()->
where('id = ?', $this->id)->
orderBy('start_date DESC')->
execute();
}
Hier wird ohne grossen Aufwand ein Select-
Query zusammengestellt. Im Unterschied zum obigen Code ist es mir als Entwickler hier auch vollkommen egal, was fuer ne Datenbank dahinterliegt. Das koennte
mySQL sein, aber auch Oracle,
MSSQL, ein
ODBC-Treiber, usw.
Und um weiter zu gehn, das obige Beispiel von php.net fuegt ein Objekt ein. Insofern ist das Doctrine-Beispiel vielleicht nicht so gut gewaehlt. Deshalb nochmal das Erstellen von Objekten in Doctrine:
Code:
$countryLanguage = new CountryLanguage();
$countryLanguage->code = 'DEU';
$countryLanguage->language = 'Bavarian';
$countryLanguage->official = 'F';
$countryLanguage->percent = 11.2;
$countryLanguage->save();
Du sparst dir also viel Handarbeit mit nem ORM wie Doctrine oder Propel, da du nichtmal mehr die Queries selbst ausfuehren musst. Du kannst zwar noch selbst
SQL schreiben, aber die oben notierte DQL-Syntax (Doctrine
Query Language) ist so intuitiv und angenehm, dass du es nicht mehr willst
Ausserdem hat ein ORM immer Ahnung von den verwendeten Datentypen. Es wird also dafuer sorgen, dass du nen Boolean ins Objekt reinstopfst und ihn wieder rauskriegst, egal was die Datenbank dahinter davon haelt. Foreign Relations sind auch kein Problem - die sind (lazy-loaded natuerlich) im Objekt verfuegbar.
Oh, referentielle Integritaet? Klar - ich zeig nochmal ganz kurz wie man ne Datenbanktabelle mit YAML fuer Doctrine definiert:
Code:
EmployeesEmployee:
actAs:
TimeStampable: ~
Sluggable:
name: employee_slug
unique: true
canUpdate: true
fields: [nickname]
columns:
lastname: { type: string(255), notnull: true }
firstname: { type: string(255), notnull: true }
nickname: { type: string(255), notnull: true, unique: true }
birthday: { type: date, notnull: true }
Hier definiere ich eine Mitarbeitertabelle. Der actAs-Block sagt Doctrine, dass es bestimmte Verhaltensmuster anwenden soll. TimeStampable sorgt dafuer, dass meine Datensaetze bei jedem Update einen aktuellen Zeitstempel kriegen, damit ich weiss wann der zuletzt bearbeitet wurde.
Sluggable erstellt nen Unique-Identifier, der SEO-technisch besser ist als ne ID. In diesem Fall wird der nickname als zusaetzlicher Identifier verwendet, so dass man einfach sprechende URLs bauen kann.
Ich empfehl euch echt nen Blick auf Doctrine, das kann einiges an Arbeit abnehmen. Im naechsten Teil gibts dann den Hinweis, warum es Sinn macht, nicht nur ein ORM sondern ein Framework zu verwenden
Greetz
alcaeus