Corso yii #04 - il database

117
1 Lavorare con i database

description

 

Transcript of Corso yii #04 - il database

Page 1: Corso yii   #04 - il database

1

Lavorare con i database

Page 2: Corso yii   #04 - il database

2

Question time

Page 3: Corso yii   #04 - il database

3

Introduzione

Page 4: Corso yii   #04 - il database

4

Yii offre un potente supporto per la

programmazione con database

Page 5: Corso yii   #04 - il database

5

Il Data Access Object di Yii, è costruisto

sull’estensione PHP Data Object (PDO) di

PHP.

Page 6: Corso yii   #04 - il database

6

Possiamo accedere, con DAO, a tutti i DBMS che supportano PDO.

Page 7: Corso yii   #04 - il database

7

Mai più SQL...

più o meno

Page 8: Corso yii   #04 - il database

8

Query Builder&&

Active Record

Page 9: Corso yii   #04 - il database

9

Query Builder

Page 10: Corso yii   #04 - il database

10

Yii Query Builder:“queries object-

oriented”

Page 11: Corso yii   #04 - il database

11

SQL injection

Page 12: Corso yii   #04 - il database

12

Active Record

Page 13: Corso yii   #04 - il database

13

Approccio Object-Relational Mapping

(ORM)

Page 14: Corso yii   #04 - il database

14

Classe PHP==

Tabella

Page 15: Corso yii   #04 - il database

15

Oggetto PHP==

Record della Tabella

Page 16: Corso yii   #04 - il database

16

Question time

Page 17: Corso yii   #04 - il database

17

Database Access Object

Page 18: Corso yii   #04 - il database

18

Introduzione al DAO

Page 19: Corso yii   #04 - il database

19

API per accedere ai dati memorizzati nel DBMS

Page 20: Corso yii   #04 - il database

20

Basato su PDO, un’estensione che

fornisce un accesso unico a diversi DBMS

Page 21: Corso yii   #04 - il database

21

MySQL

Page 22: Corso yii   #04 - il database

22

PostgreSQL

Page 23: Corso yii   #04 - il database

23

SQLlite

Page 24: Corso yii   #04 - il database

24

Le classi del DAO

•CDbConnection: connessione al database

•CDbCommands: query SQL

•CDbDataReader: record di un result set

•CDbTransaction: transazione

Page 25: Corso yii   #04 - il database

25

Connessione al database

Page 26: Corso yii   #04 - il database

26

$conn = new CDbConnection($dsn, // Data Source Name$username,$password

);

$conn->active = true;

$conn->active = false;

Page 27: Corso yii   #04 - il database

27

DSN (Data Source Name)

Page 28: Corso yii   #04 - il database

28

“nome driver PDO;sintassi della connessione”

Page 29: Corso yii   #04 - il database

29

MySQL: mysql:host=localhost;dbname=testd

b

Page 30: Corso yii   #04 - il database

30

Oracle: oci:dbname=//localhost:1521/testdb

Page 31: Corso yii   #04 - il database

31

array( 'components'=>array( 'mysql'=>array( 'class'=>'CDbConnection', 'connectionString'=>'mysql:host=localhost;dbname=testdb', 'username'=>'root', 'password'=>'root' ), ),)

Page 32: Corso yii   #04 - il database

32

array( 'components'=>array( 'oci'=>array( 'class'=>'CDbConnection', 'connectionString'=>'oci:dbname=//localhost:1521/testdb', 'username'=>'root', 'password'=>'root' ), ),)

Page 33: Corso yii   #04 - il database

33

Yii::app()->mysql

Page 34: Corso yii   #04 - il database

34

Yii::app()->oci

Page 35: Corso yii   #04 - il database

35

Eseguire query SQL

Page 36: Corso yii   #04 - il database

36

Le query si eseguono usando:

CDbCommand::createCom

mand();

Page 37: Corso yii   #04 - il database

37

$connessione = Yii::app()->mysql;$connessione = new

CDbConnection($dsn, $u, $p);

$sql = ‘select * from utenti’;$comando = $connessione-

>createcommand($sql);

Page 38: Corso yii   #04 - il database

38

execute()

INSERT, UPDATE, DELETE

Page 39: Corso yii   #04 - il database

39

query() // CDbDataReader

SELECT

Page 40: Corso yii   #04 - il database

40

$rows = $command->queryAll();

restituisce tutti i records

Page 41: Corso yii   #04 - il database

41

$rows = $command->queryRow();

restituisce il primo record

Page 42: Corso yii   #04 - il database

42

Fetching dei risultati

Page 43: Corso yii   #04 - il database

43

query() e queryXXX()

restituiscono un CDbDataReader

Page 44: Corso yii   #04 - il database

44

$dataReader = $command->query();foreach($dataReader as $read) { // ...}

Page 45: Corso yii   #04 - il database

45

query() // restituisce tutti i dati

queryXXX() // restituiscono il primo record

Page 46: Corso yii   #04 - il database

46

Transazioni

Page 47: Corso yii   #04 - il database

47

CDbTransaction

Page 48: Corso yii   #04 - il database

48

$t = $conn->beginTransaction();

try {$conn->createcommand($sql)-

>execute();$conn->createcommand($sql)-

>execute();$conn->createcommand($sql)-

>execute();$t->commit();

} catch(Exception $e) {$t->rollback();

}

Page 49: Corso yii   #04 - il database

49

Bind dei parametri

Page 50: Corso yii   #04 - il database

50

SQL injection

Page 51: Corso yii   #04 - il database

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();

Page 52: Corso yii   #04 - il database

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;

}

Page 53: Corso yii   #04 - il database

53

Prefisso delle tabelle

Page 54: Corso yii   #04 - il database

54

Se si usano più applicazioni con lo stesso database

Page 55: Corso yii   #04 - il database

55

ogni applicazione può avere un proprio

prefisso

Page 56: Corso yii   #04 - il database

56

yii_ potrebbe essere il prefisso della nostra

app

Page 57: Corso yii   #04 - il database

57

phpbb_ il prefisso del nostro forum

Page 58: Corso yii   #04 - il database

58

wp_ il prefisso del blog wordpress

Page 59: Corso yii   #04 - il database

59

e così via ...

Page 60: Corso yii   #04 - il database

60

CDbConnection::tablePrefix

contiene il prefisso della tabella

Page 61: Corso yii   #04 - il database

61

Nelle query sql possiamo usare {{table_name}}

Page 62: Corso yii   #04 - il database

62

yii_user ?select * from yii_user

select * from {{user}}

Page 63: Corso yii   #04 - il database

63

Question time

Page 64: Corso yii   #04 - il database

64

Query Builder

Page 65: Corso yii   #04 - il database

65

Introduzione al Query Builder

Page 66: Corso yii   #04 - il database

66

Modo object-oriented di scrivere query SQL

Page 67: Corso yii   #04 - il database

67

Assembla parti di SQL per renderle eseguibili

nel DAO di Yii

Page 68: Corso yii   #04 - il database

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();

Page 69: Corso yii   #04 - il database

69

Con il QB è possibile comporre query

complesse

Page 70: Corso yii   #04 - il database

70

Gestisce automaticamente il quoting dei nomi di

tabella e dei campi per prevenire confrlitti

Page 71: Corso yii   #04 - il database

71

SQL injection

Page 72: Corso yii   #04 - il database

72

Ha un buon livello di astrazione che semplifica la

migrazione tra i vari DBMS

Page 73: Corso yii   #04 - il database

73

Preparazione del QB

Page 74: Corso yii   #04 - il database

74

$command = Yii::app()->mysql->createCommand();

Page 75: Corso yii   #04 - il database

75

select()selectDistinct()

Page 76: Corso yii   #04 - il database

76

from()

Page 77: Corso yii   #04 - il database

77

where()andWhere()orWhere()

Page 78: Corso yii   #04 - il database

78

join()leftJoin()

rightJoin()crossJoin()

naturalJoin()

Page 79: Corso yii   #04 - il database

79

group()having()order()limit()offset()union()

Page 80: Corso yii   #04 - il database

80

$user = Yii::app()->db->createCommand()

->union(‘select * from {{tabella}}’)

->queryRow();

Page 81: Corso yii   #04 - il database

81

$users = Yii::app()->db->createCommand() ->select('*') ->from('tbl_user') ->queryAll();

Page 82: Corso yii   #04 - il database

82

$sql = Yii::app()->db->createCommand() ->select('*') ->from('tbl_user') ->text;

Page 83: Corso yii   #04 - il database

83

$command = Yii::app()->db->createCommand();$users = $command->select('*')->from('tbl_users')->queryAll();

$command->reset();$posts = $command->select('*')->from('tbl_posts')->queryAll();

Page 84: Corso yii   #04 - il database

84

Manipolare i dati

Page 85: Corso yii   #04 - il database

85

insert()update()delete()

Page 86: Corso yii   #04 - il database

86

$command->insert('utenti', array( 'nome'=>'Simone', 'email'=>'[email protected]',));

Page 87: Corso yii   #04 - il database

87

$command->update('utenti', array( 'nome'=>'Fabio',), 'id=:id', array(':id'=>1));

Page 88: Corso yii   #04 - il database

88

$command->delete('utenti', 'id=:id', array(':id'=>1));

Page 89: Corso yii   #04 - il database

89

Alterare lo schema del database

Page 90: Corso yii   #04 - il database

90

createTable()renameTable()

dropTable()truncateTable()

Page 91: Corso yii   #04 - il database

91

addColumn()renameColumn()

alterColumn()dropColumn()

Page 92: Corso yii   #04 - il database

92

createIndex()dropIndex()

Page 93: Corso yii   #04 - il database

93

Abstract Data Types•pk

•text

•string

•integer

•float

•decimal

•datetime

•timestamp

•time

•date

•binary

•boolean

•money

Page 94: Corso yii   #04 - il database

94

Question time

Page 95: Corso yii   #04 - il database

95

Active Record

Page 96: Corso yii   #04 - il database

96

Transazioni con Active Record

Page 97: Corso yii   #04 - il database

97

$model=Post::model();$transaction=$model->dbConnection->beginTransaction();try{ $post=$model->findByPk(10); $post->title='new post title'; $post->save(); $transaction->commit();}catch(Exception $e){ $transaction->rollback();}

Page 98: Corso yii   #04 - il database

98

Scopes

Page 99: Corso yii   #04 - il database

99

$post = Post::model()->findAll(array( 'order'=>'create_time DESC',

'limit'=>5, ));

Page 100: Corso yii   #04 - il database

100

class Post extends CActiveRecord{ public function scopes() { return array( 'recenti'=>array( 'order'=>'create_time DESC', 'limit'=>5, ), 'ultimo'=>array( 'order'=>'create_time DESC', 'limit'=>1, ), ); }}

$postRecenti = Post::model()->recenti()->findAll();

$postRecenti = Post::model()->ultimo()->findAll();

Page 101: Corso yii   #04 - il database

101

public static funtion getSomeValues ($campo = 33) {

return Post::model()->findAll(array( ‘condition’ => ‘campo=:campo’, ‘params’ => array( ‘:campo’ => $campo ) ));}

Page 102: Corso yii   #04 - il database

102

class Post extends CActiveRecord{ public function recenti($limit = 3) { $this->getDbCriteria()->mergeWidth(array( ‘order’ => ‘create_time DESC’, ‘limit’ => $limit )); return $this; }}

$postRecenti = Post::model()->recenti(4)->findAll();

Page 103: Corso yii   #04 - il database

103

Relazioni

Page 104: Corso yii   #04 - il database

104

Per non usare il lazy loading

$post = Post::model()->with(‘author’, ‘tags’)->findAll();

Page 105: Corso yii   #04 - il database

105

$posts=Post::model()-

>with('comments:recently:approved')->findAll();

$posts=Post::model()->findAll(array( 'with'=>array( 'comments'=>array( 'scopes'=>array('recently','approved') ), ),));

Page 106: Corso yii   #04 - il database

106

class User extends CActiveRecord{ public function relations() { return array( 'posts'=>array(self::HAS_MANY, 'Post', 'author_id', 'with'=>array( 'comments'=>array( 'scopes'=>'approved' ), ), ), ); }}

Page 107: Corso yii   #04 - il database

107

Question time

Page 108: Corso yii   #04 - il database

108

Database Migration

Page 109: Corso yii   #04 - il database

109

Marco aggiunge una tabella ed il codice ed i modelli che ne fanno

uso.

Page 110: Corso yii   #04 - il database

110

Marco ha aggiunto la tabella con una

migrazione e committa sul repository

Page 111: Corso yii   #04 - il database

111

Giuseppe scarica il codice sorgente e

langia le migrations

Page 112: Corso yii   #04 - il database

112

Giuseppe, senza sapere che cosa ha fatto

Marco, ha il database aggiornato.

Page 113: Corso yii   #04 - il database

113

Lanciando le migrazioni in produzione,

possiamo aggiornare lo schema del DB

Page 114: Corso yii   #04 - il database

114

Senza fare interventi MANUALMENTE

Page 115: Corso yii   #04 - il database

115

class m999999_999999_creo_una_tabella extends CDbMigration{ public function up() { $this->createTable('una_tabella', array( 'id' => 'pk', 'stringa' => 'string NOT NULL', 'testo' => 'text', )); } public function down() { $this->dropTable('una_tabella'); }}

Page 116: Corso yii   #04 - il database

116

Question time

Page 117: Corso yii   #04 - il database

117

Fine