1
Lavorare con i database
2
Question time
3
Introduzione
4
Yii offre un potente supporto
per la programmazione con
database
5
Il Data Access Object di Yii,
è costruisto sull’estensione
PHP Data Object (PDO) di
PHP.
6
Possiamo accedere, con
DAO, a tutti i DBMS che
supportano PDO.
7
Mai più SQL
...
più o meno
più o meno
più o meno
8
Query Builder
&&
Active Record
Active Record
Active Record
9
Query Builder
10
Yii Query Builder:
“queries object-oriented”
“queries object-oriented”
11
SQL injection
12
Active Record
13
Approccio Object-Relational
Mapping (ORM)
14
Classe PHP
==
Tabella
Tabella
Tabella
15
Oggetto PHP
==
Record della Tabella
Record della Tabella
Record della Tabella
16
Question time
17
Database Access Object
18
Introduzione al DAO
19
API per accedere ai dati
memorizzati nel DBMS
20
Basato su PDO,
un’estensione che fornisce
un accesso unico a diversi
DBMS
21
MySQL
22
PostgreSQL
23
SQLlite
24
Le classi del DAO
•CDbConnection: connessione al database
•CDbCommands: query SQL
•CDbDataReader: record di un result s...
25
Connessione al database
26
$conn = new CDbConnection(
$dsn, // Data Source Name
$username,
$password
);
$conn->active = true;
$conn->active = fals...
27
DSN (Data Source Name)
28
“nome driver PDO;sintassi della connessione”
29
MySQL: mysql:host=localhost;dbname=testdb
30
Oracle: oci:dbname=//localhost:1521/testdb
31
array(
'components'=>array(
'mysql'=>array(
'class'=>'CDbConnection',
'connectionString'=>'mysql:host=localhost;dbname=...
32
array(
'components'=>array(
'oci'=>array(
'class'=>'CDbConnection',
'connectionString'=>'oci:dbname=//localhost:1521/te...
33
Yii::app()->mysql
34
Yii::app()->oci
35
Eseguire query SQL
36
Le query si eseguono usando:
CDbCommand::createCommand();
CDbCommand::createCommand();
37
$connessione = Yii::app()->mysql;
$connessione = new CDbConnection($dsn, $u, $p);
$sql = ‘select * from utenti’;
$coman...
38
execute()
INSERT, UPDATE, DELETE
INSERT, UPDATE, DELETE
INSERT, UPDATE, DELETE
39
query() // CDbDataReader
SELECT
SELECT
SELECT
40
$rows = $command->queryAll();
restituisce tutti i records
restituisce tutti i records
restituisce tutti i records
41
$rows = $command->queryRow();
restituisce il primo record
restituisce il primo record
restituisce il primo record
42
Fetching dei risultati
43
query() e queryXXX()
restituiscono un CDbDataReader
restituiscono un CDbDataReader
restituiscono un CDbDataReader
44
$dataReader = $command->query();
foreach($dataReader as $read) {
// ...
}
}
}
}
45
query() // restituisce tutti i dati
queryXXX() // restituiscono il primo record
queryXXX() // restituiscono il primo re...
46
Transazioni
47
CDbTransaction
48
try {
$conn->createcommand($sql)->execute();
$conn->createcommand($sql)->execute();
$conn->createcommand($sql)->execute...
49
Bind dei parametri
50
SQL injection
51
$sql = ‘insert into utenti (username, email) values (:username, :email)’;
$command = $connessione->createCommand($sql);...
52
$sql = ‘select username, email from utenti’;
$dataReader = $connessione->createCommand($sql)->query();
$dataReader->bin...
53
Prefisso delle tabelle
54
Se si usano più applicazioni
con lo stesso database
55
ogni applicazione può avere
un proprio prefisso
56
yii_ potrebbe essere il
prefisso della nostra app
57
phpbb_ il prefisso del nostro
forum
58
wp_ il prefisso del blog
wordpress
59
e così via ...
60
CDbConnection::tablePrefix
contiene il prefisso della
tabella
contiene il prefisso della
tabella
contiene il prefisso d...
61
Nelle query sql possiamo
usare {{table_name}}
62
yii_user ?
select * from yii_user
select * from {{user}}
select * from {{user}}
select * from {{user}}
63
Question time
64
Query Builder
65
Introduzione al Query
Builder
66
Modo object-oriented di
scrivere query SQL
67
Assembla parti di SQL per
renderle eseguibili nel DAO
di Yii
68
$user = Yii::app()->db->createCommand()
->select('username, email')
->from('utenti u')
->join('profili p', 'u.id=p.user...
69
Con il QB è possibile
comporre query complesse
70
Gestisce automaticamente il
quoting dei nomi di tabella e dei
campi per prevenire confrlitti
71
SQL injection
72
Ha un buon livello di
astrazione che semplifica la
migrazione tra i vari DBMS
73
Preparazione del QB
74
$command = Yii::app()->mysql->createCommand();
75
select()
selectDistinct()
selectDistinct()
76
from()
77
where()
andWhere()
orWhere()
orWhere()
orWhere()
78
join()
leftJoin()
rightJoin()
crossJoin()
naturalJoin()
naturalJoin()
naturalJoin()
naturalJoin()
79
having()
order()
limit()
offset()
union()
union()
union()
union()
80
$user = Yii::app()->db->createCommand()
->union(‘select * from {{tabella}}’)
->queryRow();
->queryRow();
->queryRow();
81
$users = Yii::app()->db->createCommand()
->select('*')
->from('tbl_user')
->queryAll();
->queryAll();
->queryAll();
->q...
82
$sql = Yii::app()->db-
>createCommand()
->select('*')
->from('tbl_user')
->text;
->text;
->text;
->text;
83
$command = Yii::app()->db->createCommand();
$users = $command->select('*')->from('tbl_users')->queryAll();
$command->re...
84
Manipolare i dati
85
insert()
update()
delete()
delete()
delete()
86
$command->insert('utenti', array(
'nome'=>'Simone',
'email'=>'sensorario@gmail.com',
));
));
));
));
87
$command->update('utenti', array(
'nome'=>'Fabio',
), 'id=:id', array(':id'=>1));
), 'id=:id', array(':id'=>1));
), 'id...
88
$command->delete('utenti', 'id=:id', array(':id'=>1));
89
Alterare lo schema del
database
90
createTable()
renameTable()
dropTable()
truncateTable()
truncateTable()
truncateTable()
truncateTable()
91
addColumn()
renameColumn()
alterColumn()
dropColumn()
dropColumn()
dropColumn()
dropColumn()
92
createIndex()
dropIndex()
dropIndex()
93
Abstract Data Types
• pk
• text
• string
• integer
• float
• decimal
• datetime
• timestamp
94
Question time
95
Active Record
96
Transazioni con Active
Record
97
$post=$model->findByPk(10);
$post->title='new post title';
$post->save();
$transaction->commit();
}
catch(Exception $e)...
98
Scopes
99
$post = Post::model()->findAll(array(
'order'=>'create_time DESC',
'limit'=>5,
));
));
));
));
100
$postRecenti = Post::model()->ultimo()->findAll();
101
{
return Post::model()->findAll(array(
‘condition’ => ‘campo=:campo’,
‘params’ => array(
‘:campo’ => $campo
)
));
}
}
...
102
$postRecenti = Post::model()->recenti(4)->findAll();
103
Relazioni
104
Per non usare il lazy loading
$post = Post::model()
->with(‘author’, ‘tags’)
->findAll();
->findAll();
->findAll();
->...
105
$posts=Post::model()->findAll(array(
'with'=>array(
'comments'=>array(
'scopes'=>array('recently','approved')
),
),
))...
106
'posts'=>array(self::HAS_MANY, 'Post', 'author_id',
'with'=>array(
'comments'=>array(
'scopes'=>'approved'
),
),
),
);...
107
Question time
108
Database Migration
109
Marco aggiunge una tabella
ed il codice ed i modelli che
ne fanno uso.
110
Marco ha aggiunto la tabella
con una migrazione e
committa sul repository
111
Giuseppe scarica il codice
sorgente e langia le
migrations
112
Giuseppe, senza sapere che
cosa ha fatto Marco, ha il
database aggiornato.
113
Lanciando le migrazioni in
produzione, possiamo
aggiornare lo schema del DB
114
Senza fare interventi
MANUALMENTE
115
'stringa' => 'string NOT NULL',
'testo' => 'text',
));
}
public function down()
{
$this->dropTable('una_tabella');
}
}...
116
Question time
117
Fine
Upcoming SlideShare
Loading in …5
×

Corso yii #04 - il database

711 views

Published on

Published in: Technology
  • Be the first to comment

Corso yii #04 - il database

  1. 1. 1 Lavorare con i database
  2. 2. 2 Question time
  3. 3. 3 Introduzione
  4. 4. 4 Yii offre un potente supporto per la programmazione con database
  5. 5. 5 Il Data Access Object di Yii, è costruisto sull’estensione PHP Data Object (PDO) di PHP.
  6. 6. 6 Possiamo accedere, con DAO, a tutti i DBMS che supportano PDO.
  7. 7. 7 Mai più SQL ... più o meno più o meno più o meno
  8. 8. 8 Query Builder && Active Record Active Record Active Record
  9. 9. 9 Query Builder
  10. 10. 10 Yii Query Builder: “queries object-oriented” “queries object-oriented”
  11. 11. 11 SQL injection
  12. 12. 12 Active Record
  13. 13. 13 Approccio Object-Relational Mapping (ORM)
  14. 14. 14 Classe PHP == Tabella Tabella Tabella
  15. 15. 15 Oggetto PHP == Record della Tabella Record della Tabella Record della Tabella
  16. 16. 16 Question time
  17. 17. 17 Database Access Object
  18. 18. 18 Introduzione al DAO
  19. 19. 19 API per accedere ai dati memorizzati nel DBMS
  20. 20. 20 Basato su PDO, un’estensione che fornisce un accesso unico a diversi DBMS
  21. 21. 21 MySQL
  22. 22. 22 PostgreSQL
  23. 23. 23 SQLlite
  24. 24. 24 Le classi del DAO •CDbConnection: connessione al database •CDbCommands: query SQL •CDbDataReader: record di un result set •CDbTransaction: transazione
  25. 25. 25 Connessione al database
  26. 26. 26 $conn = new CDbConnection( $dsn, // Data Source Name $username, $password ); $conn->active = true; $conn->active = false; $conn->active = false; $conn->active = false; $conn->active = false; $conn->active = false; $conn->active = false; $conn->active = false; $conn->active = false; $conn->active = false;
  27. 27. 27 DSN (Data Source Name)
  28. 28. 28 “nome driver PDO;sintassi della connessione”
  29. 29. 29 MySQL: mysql:host=localhost;dbname=testdb
  30. 30. 30 Oracle: oci:dbname=//localhost:1521/testdb
  31. 31. 31 array( 'components'=>array( 'mysql'=>array( 'class'=>'CDbConnection', 'connectionString'=>'mysql:host=localhost;dbname=testdb', 'username'=>'root', 'password'=>'root' ), ), ) ) ) ) ) ) ) ) )
  32. 32. 32 array( 'components'=>array( 'oci'=>array( 'class'=>'CDbConnection', 'connectionString'=>'oci:dbname=//localhost:1521/testdb', 'username'=>'root', 'password'=>'root' ), ), ) ) ) ) ) ) ) ) )
  33. 33. 33 Yii::app()->mysql
  34. 34. 34 Yii::app()->oci
  35. 35. 35 Eseguire query SQL
  36. 36. 36 Le query si eseguono usando: CDbCommand::createCommand(); CDbCommand::createCommand();
  37. 37. 37 $connessione = Yii::app()->mysql; $connessione = new CDbConnection($dsn, $u, $p); $sql = ‘select * from utenti’; $comando = $connessione->createcommand($sql); $comando = $connessione->createcommand($sql); $comando = $connessione->createcommand($sql); $comando = $connessione->createcommand($sql); $comando = $connessione->createcommand($sql);
  38. 38. 38 execute() INSERT, UPDATE, DELETE INSERT, UPDATE, DELETE INSERT, UPDATE, DELETE
  39. 39. 39 query() // CDbDataReader SELECT SELECT SELECT
  40. 40. 40 $rows = $command->queryAll(); restituisce tutti i records restituisce tutti i records restituisce tutti i records
  41. 41. 41 $rows = $command->queryRow(); restituisce il primo record restituisce il primo record restituisce il primo record
  42. 42. 42 Fetching dei risultati
  43. 43. 43 query() e queryXXX() restituiscono un CDbDataReader restituiscono un CDbDataReader restituiscono un CDbDataReader
  44. 44. 44 $dataReader = $command->query(); foreach($dataReader as $read) { // ... } } } }
  45. 45. 45 query() // restituisce tutti i dati queryXXX() // restituiscono il primo record queryXXX() // restituiscono il primo record queryXXX() // restituiscono il primo record
  46. 46. 46 Transazioni
  47. 47. 47 CDbTransaction
  48. 48. 48 try { $conn->createcommand($sql)->execute(); $conn->createcommand($sql)->execute(); $conn->createcommand($sql)->execute(); $t->commit(); } catch(Exception $e) { $t->rollback(); } } } } } } }
  49. 49. 49 Bind dei parametri
  50. 50. 50 SQL injection
  51. 51. 51 $sql = ‘insert into utenti (username, email) values (:username, :email)’; $command = $connessione->createCommand($sql); $command->bindParam(‘:username’, $username, PDO::PARAM_STR); $command->bindParam(‘:email’, $email, PDO::PARAM_STR); $command->execute(); $command->execute(); $command->execute(); $command->execute(); $command->execute(); $command->execute(); $command->execute();
  52. 52. 52 $sql = ‘select username, email from utenti’; $dataReader = $connessione->createCommand($sql)->query(); $dataReader->bindColumn(1, $username); $dataReader->bindColumn(2, $email); while ($dataReader->read() !== false) { echo $username; echo $email; } } } } } } } } } } }
  53. 53. 53 Prefisso delle tabelle
  54. 54. 54 Se si usano più applicazioni con lo stesso database
  55. 55. 55 ogni applicazione può avere un proprio prefisso
  56. 56. 56 yii_ potrebbe essere il prefisso della nostra app
  57. 57. 57 phpbb_ il prefisso del nostro forum
  58. 58. 58 wp_ il prefisso del blog wordpress
  59. 59. 59 e così via ...
  60. 60. 60 CDbConnection::tablePrefix contiene il prefisso della tabella contiene il prefisso della tabella contiene il prefisso della tabella
  61. 61. 61 Nelle query sql possiamo usare {{table_name}}
  62. 62. 62 yii_user ? select * from yii_user select * from {{user}} select * from {{user}} select * from {{user}}
  63. 63. 63 Question time
  64. 64. 64 Query Builder
  65. 65. 65 Introduzione al Query Builder
  66. 66. 66 Modo object-oriented di scrivere query SQL
  67. 67. 67 Assembla parti di SQL per renderle eseguibili nel DAO di Yii
  68. 68. 68 $user = Yii::app()->db->createCommand() ->select('username, email') ->from('utenti u') ->join('profili p', 'u.id=p.user_id') ->where('id=:id', array(':id'=>$id)) ->queryRow(); ->queryRow(); ->queryRow(); ->queryRow(); ->queryRow(); ->queryRow();
  69. 69. 69 Con il QB è possibile comporre query complesse
  70. 70. 70 Gestisce automaticamente il quoting dei nomi di tabella e dei campi per prevenire confrlitti
  71. 71. 71 SQL injection
  72. 72. 72 Ha un buon livello di astrazione che semplifica la migrazione tra i vari DBMS
  73. 73. 73 Preparazione del QB
  74. 74. 74 $command = Yii::app()->mysql->createCommand();
  75. 75. 75 select() selectDistinct() selectDistinct()
  76. 76. 76 from()
  77. 77. 77 where() andWhere() orWhere() orWhere() orWhere()
  78. 78. 78 join() leftJoin() rightJoin() crossJoin() naturalJoin() naturalJoin() naturalJoin() naturalJoin()
  79. 79. 79 having() order() limit() offset() union() union() union() union()
  80. 80. 80 $user = Yii::app()->db->createCommand() ->union(‘select * from {{tabella}}’) ->queryRow(); ->queryRow(); ->queryRow();
  81. 81. 81 $users = Yii::app()->db->createCommand() ->select('*') ->from('tbl_user') ->queryAll(); ->queryAll(); ->queryAll(); ->queryAll();
  82. 82. 82 $sql = Yii::app()->db- >createCommand() ->select('*') ->from('tbl_user') ->text; ->text; ->text; ->text;
  83. 83. 83 $command = Yii::app()->db->createCommand(); $users = $command->select('*')->from('tbl_users')->queryAll(); $command->reset(); $posts = $command->select('*')->from('tbl_posts')->queryAll(); $posts = $command->select('*')->from('tbl_posts')->queryAll(); $posts = $command->select('*')->from('tbl_posts')->queryAll(); $posts = $command->select('*')->from('tbl_posts')->queryAll(); $posts = $command->select('*')->from('tbl_posts')->queryAll();
  84. 84. 84 Manipolare i dati
  85. 85. 85 insert() update() delete() delete() delete()
  86. 86. 86 $command->insert('utenti', array( 'nome'=>'Simone', 'email'=>'sensorario@gmail.com', )); )); )); ));
  87. 87. 87 $command->update('utenti', array( 'nome'=>'Fabio', ), 'id=:id', array(':id'=>1)); ), 'id=:id', array(':id'=>1)); ), 'id=:id', array(':id'=>1));
  88. 88. 88 $command->delete('utenti', 'id=:id', array(':id'=>1));
  89. 89. 89 Alterare lo schema del database
  90. 90. 90 createTable() renameTable() dropTable() truncateTable() truncateTable() truncateTable() truncateTable()
  91. 91. 91 addColumn() renameColumn() alterColumn() dropColumn() dropColumn() dropColumn() dropColumn()
  92. 92. 92 createIndex() dropIndex() dropIndex()
  93. 93. 93 Abstract Data Types • pk • text • string • integer • float • decimal • datetime • timestamp
  94. 94. 94 Question time
  95. 95. 95 Active Record
  96. 96. 96 Transazioni con Active Record
  97. 97. 97 $post=$model->findByPk(10); $post->title='new post title'; $post->save(); $transaction->commit(); } catch(Exception $e) { $transaction->rollback(); } } } } } } }
  98. 98. 98 Scopes
  99. 99. 99 $post = Post::model()->findAll(array( 'order'=>'create_time DESC', 'limit'=>5, )); )); )); ));
  100. 100. 100 $postRecenti = Post::model()->ultimo()->findAll();
  101. 101. 101 { return Post::model()->findAll(array( ‘condition’ => ‘campo=:campo’, ‘params’ => array( ‘:campo’ => $campo ) )); } } } } } } }
  102. 102. 102 $postRecenti = Post::model()->recenti(4)->findAll();
  103. 103. 103 Relazioni
  104. 104. 104 Per non usare il lazy loading $post = Post::model() ->with(‘author’, ‘tags’) ->findAll(); ->findAll(); ->findAll(); ->findAll(); ->findAll();
  105. 105. 105 $posts=Post::model()->findAll(array( 'with'=>array( 'comments'=>array( 'scopes'=>array('recently','approved') ), ), )); )); )); )); )); ));
  106. 106. 106 'posts'=>array(self::HAS_MANY, 'Post', 'author_id', 'with'=>array( 'comments'=>array( 'scopes'=>'approved' ), ), ), ); } } } } } } } } } }
  107. 107. 107 Question time
  108. 108. 108 Database Migration
  109. 109. 109 Marco aggiunge una tabella ed il codice ed i modelli che ne fanno uso.
  110. 110. 110 Marco ha aggiunto la tabella con una migrazione e committa sul repository
  111. 111. 111 Giuseppe scarica il codice sorgente e langia le migrations
  112. 112. 112 Giuseppe, senza sapere che cosa ha fatto Marco, ha il database aggiornato.
  113. 113. 113 Lanciando le migrazioni in produzione, possiamo aggiornare lo schema del DB
  114. 114. 114 Senza fare interventi MANUALMENTE
  115. 115. 115 'stringa' => 'string NOT NULL', 'testo' => 'text', )); } public function down() { $this->dropTable('una_tabella'); } } } } } } } } } }
  116. 116. 116 Question time
  117. 117. 117 Fine

×