2. Több adatbázis támogatása
● Drupal 6
● MySQL: támogatott
● PostgreSQL: core támogatja, contribok kevésbé
● MSSQL: a Microsoft nagyon szeretné
● Oracle: contribként elérhető
● Drupal 7
● MySQL: támogatott
● PostgreSQL: tesztekkel bizonyítottan támogatott
3. Könnyűsúlyú API
● Előny
● Kevés visszaesés teljesítményben
● Könnyen használható
● Hátrány
● SQL írásakor nagyon figyelni kell a szintaxisra
● Csak olyan funkciókra lehet támaszkodni, amelyek
mindegyik támogatott adatbáziskezelőn elérhetőek
4. Szintaxis különbség
● Tábla neveket körbe kell venni {}kkel
● Értékek helyett placeholderek
● Példa
SELECT ”name” FROM {users} WHERE uid = %d
9. Példák
● Az előző példa helyesen
$res = db_query(”SELECT * FROM {users}
WHERE uid = %d”, $uid);
● Az uid lehet bármi, a %d miatt numerikus értékké
lesz konvertálva.
● Az előző rosszindulatú paraméter esetén 1 lesz.
10. String
● String használata
$res = db_query(”SELECT uid, name FROM
{users} WHERE name = '%s'”, $searchstring);
11. További típusok
● Float
$res = db_query(”SELECT * FROM {spec_tabla}
WHERE valami_mezo > %F”, $float_ertek);
12. További típusok
● Bináris
$res = db_query(”UPDATE {spec_tabla} SET
valami_adat = %b WHERE id = %d”,
$binaris_adat, $id);
13. A % escape-elése
%%
db_query('SELECT nid FROM {node} WHERE
title LIKE '%%%s%%' ORDER BY nid DESC',
$searchstring);
14. Változó számú érték
$data = array(1, 2, 3);
db_query('SELECT foo FROM {bar} WHERE
client_id IN (' . db_placeholders($data, 'int') . ')
ORDER BY client_id', $data);
17. Schema API
● Automatikus adatbázisséma generálás
● Biztosan adatbázisfüggetlen lesz a kód, amit generál
● Könnyebb karbantartani
● Könnyen lehet csak egyes részeket felhasználni
20. Mezők
array(
'mezoneve' => array(
'type' => $tipus,
'unsigned' => TRUE, // csak numerikus típussal
'not null' => TRUE,
'length' => $hossz, // nem minden típusnál
'default' => $alapertek, // nem kötelező
'size' => $hossz, // adattípus hossza (nem kötelező),
'precision' => $p, // csak numerikus mezőknél
'scale' => $s, // csak numerikus mezőknél
'serialize' => FALSE,
),
);
21. Típusok
● serial (pg: automatikus sequence, mysql: auto_increment)
● int
● float
● numeric
● varchar
● char
● text
● blob
● datetime
22. Opciók
● size: az adattípus mérete ('tiny', 'small', 'medium',
'normal', 'big'), lásd: Adattípusok és méreteik
● not null: NULL érték engedélyezése
● default: alapértelmezett érték
● length: hossz a következő típusoknál: 'varchar',
'text', 'int'
● unsigned: 'int', 'float', 'numeric' értékeknél érvényes,
alapértelmezett: FALSE
23. Opciók
● precision, scale: a 'numeric' típusnál a pontosság
(szignifikáns bitek száma)
● serialize: boolean érték, hogy a tárolt adat
szerializált sztringe
27. További tudnivalók
● Primary key nem lehet NULL
● NOT NULL utólagos hozzáadása, alapértelmezett
érték nélkül:
$ret = array();
db_add_field($ret, 'mytable0', 'col1', array('type' =>
'text', 'not null' => TRUE, 'initial' => 'start'));
28. Típusok
Field type PHP types Correct Incorrect
int integer 0, 3, 17 0.5, '0'
float float 7, 5.75 1.24'
numeric float 3.14 2.17'
datetime string '2007-08-26 13:00:00' Unix timestamp
varchar string '', 'hi mom' 0, 3.14
text N/A none
serial N/A none
blob N/A none
29. JOIN
● A direktszorzat nem hatékony
● 3 tábla, 1 millió, fél millió és 50 millió rekorddal
● Hatékony (polinom idejű és memóriaigényű)
megoldás: JOIN
30. JOIN
● (INNER) JOIN
SELECT * FROM foo JOIN bar ON foo.fid = bar.fid
SELECT * FROM foo JOIN bar USING (fid)
● LEFT, RIGHT (OUTER) JOIN
SELECT * FROM foo LEFT JOIN bar ON foo.fid =
bar.fid
● NATURAL JOIN
SELECT * FROM foo NATURAL JOIN bar
● http://en.wikipedia.org/wiki/Join_(SQL)
31. Kompatibilis SQL
● Táblanév köré ” ` helyett
● String köré szigorúan '
● Adattörlés egyszerre egy táblából
● MySQLnél az int és a boolean ugyanaz,
Postgresnél nem!
32. Kompatibilis SQL
● Kerülni:
● IGNORE
● REPLACE
● ON DUPLICATE KEY
● CONCAT() csak két argumentummal
● Minden nem aggregált mezőnek szerepelnie kell a
GROUP BY után
● http://drupal.org/node/555514