Linguaggi di Programmazione per il Web Parte 4
|
|
|
- Fabiano Salvi
- 8 anni fa
- Просмотров:
Транскрипт
1 Linguaggi di Programmazione per il Web Parte 4 PHP Hypertext Preprocessor L interazione con MYSQL Estensione MySQLi Autore Prof. Rio Chierego [email protected] 1
2 Siti Utili
3 PHP & MySql Collegarsi ad un database e interagire con i dati in esso archiviati è indubbiamente uno dei compiti principali di un sito Web dinamico costruito con PHP. PHP ci dà la possibilità di connetterci con un numero elevatissimo di database server (MySql, PostgreSql, Oracle, Microsoft Sql Server, Access, Sybase, Informix, msql ecc.). Prenderemo in considerazione MySql, che è il database server che si è affermato prepotentemente negli ultimi anni per la sua velocità e la sua stabilità, oltre che per il fatto di essere open source. 3
4 PHP & MySql Lo sviluppatore interessato a costruire delle applicazioni che possano colloquiare con MySQL, il DBMS (Database Management System) Open Source per la gestione di database relazionali più utilizzato in Rete con PHP, ha a sua disposizione principalmente tre scelte corrispondenti ad altrettante estensioni. 1) estensione nativa per MySQL N.B. presente dalla prima versione 2.0 di PHP ma deprecata a partire dalla versione 5.5 2) estensione MySQLi (MySQL improved) N.B. utilizzabile a partire dalla versione PHP 5.0 sia con l approccio procedurale sia con l approccio Object Oriented 3) estensione PHP Data Objects (PDO) N.B. completamente orientata alla programmazione Object Oriented 4
5 PHP & MySql estensione MySQLi MySQLi è l'abbreviazione di MySQL improveded ("perfezionato") ed è il nome di un'estensione per il linguaggio PHP che è stata realizzata per mettere a disposizione degli sviluppatori delle funzionalità più avanzate rispetto a quelle messe a disposizione dall'estensione MySQL nativa per l'interazione tra le applicazioni Web based e il noto DBMS Open Source MySQL. Ma perché utilizzare questa estensione invece della classica estensione MySQL nativa utilizzata in milioni di applicazioni? In realtà non è possibile sostenere in maniera assoluta che l estensione MySQLi sia preferibile rispetto alla sua alternativa più classica, in molti sostengono addirittura che si tratti di un progetto ancora incompleto e non ben supportato; grazie a MySQLi vi sono però degli indubbi vantaggi che meritano di essere sottolineati. 5
6 PHP & MySql estensione MySQLi può essere utilizzata sia all'interno di applicazioni realizzate seguendo il paradigma procedurale sia all'interno di applicazioni realizzate seguendo il paradigma Object Oriented; fornisce il supporto nativo al protocollo binario di MySQL introdotto con la versione 4.1; supporta stored procedures, query multiple e transactions; permette impostazioni avanzate per la connessione tramite mysqli_init(); supporta le prepared statements per il caching delle interrogazioni; garantisce prestazioni più elevate dell'estensione nativa MySQL, è ritenuta più sicura e fornisce in genere migliori risposte in fase di debugging. 6
7 PHP & MySql estensione MySQLi Come anticipato, gli strumenti forniti da MySQLi possono essere impiegati sia all'interno di applicazioni il cui codice è stato realizzato secondo il paradigma procedurale che in uno script creato grazie all'object-oriented Programming; infatti, come si vedrà a breve nel dettaglio, la gran parte delle funzioni messe a disposizione da questa estensioni possono essere sostituite da un metodo concepito per uno scopo analogo. Le funzioni dell'estensione MySQLi sono state concepite per rendere questo strumento il più possibile compatibile con l'estensione MySQL; nella maggior parte dei casi è infatti possibile ritrovare le funzioni classiche con una "i" finale aggiunta in coda al nome: per esempio, mysql_connect() è stata così "tradotta" in mysqli_connect() mentre mysql_query() è diventata mysqli_query() N.B. Ciò nonostante è opportuno sottolineare che, al di là delle somiglianze relative al nome, non tutte le funzioni di MySQLi possono essere utilizzare nello stesso modo di quelle fornite da MySQL 7
8 Connessione a MySQL con MySQLi Per la connessione tra un'applicazione Web based realizzata in PHP e un Database Manager MySQL tramite l'estensione MySQLi, sono disponibili due procedure: (-) una prima basata sul paradigma procedurale (-) una seconda basata invece sull'approccio per oggetti. N.B. Nel primo caso la connessione avviene per funzione, nel caso della OOP essa avviene invece per istanza La connessione effettuata utilizzando la programmazione procedurale si basa su una funzione specifica denominata mysqli_connect() che accetta come parametri i seguenti dati: hostname: il nome di Rete della macchina ospitante il Database server, ad esempio un indirizzo IP o "localhost" nel caso di installazioni locali; username: il nome dell'utente da utilizzare per la connessione, esso dovrà avere i privilegi necessari per l'accesso e la manipolazione dei dati; password: la parola chiave necessaria per l'autenticazione dell'utente che si desidera utilizzare in connessione; database: il nome del database che si desidera interfacciare alla propria applicazione 8
9 Connessione a MySQL con MySQLi I più accorti si saranno immediatamente resi conto di un'importante differenza tra le funzioni mysqli_connect() e mysql_connect() dell estensione nativa, la seconda infatti non accetta come parametro il nome della base di dati da selezionare, a questo scopo è infatti destinata la funzione mysql_select_db(). N.B. MySQLi mette a disposizione una funzione omologa, denominata non a caso mysqli_select_db(), che però deve essere utilizzata esclusivamente nel caso in cui si presenti la necessità di modificare il database predefinito (cioè quello selezionato tramite mysqli_connect()). 9
10 Connessione a MySQL con MySQLi 10 Esempio di apertura/chiusura di una connessione con approccio procedurale <?php // connessione a MySQL con mysqli_connect() // definizione delle variabili $host = "localhost"; $user = "username"; $pass = "password"; $db = "database"; // connessione al DBMS $connessione = mysqli_connect ($host, $user, $pass, $db) or die("connessione non riuscita ". mysqli_connect_error() );... mysqli_close ($connessione) or die("chiusura connessione fallita ". mysqli_error ($connessione));?>
11 Connessione a MySQL con MySQLi Esempio di apertura/chiusura di una connessione con approccio Object Oriented Per quanto riguarda invece le connessioni tramite approccio per oggetti, è stato già detto che in questo caso il fulcro della procedura è basato essenzialmente sul concetto di istanza 11 <?php // connessione a MySQL per istanza // definizione delle variabili $host = "localhost"; $user = "username"; $pass = "password"; $db = "database"; // connessione al DBMS $mysqli= new mysqli ($host, $user, $pass, $db) or die ("<br>connessione non riuscita ". $mysqli->connect_error. " ". $mysqli->connect_errno);... mysqli->close() or die ("<br>chiusura connessione fallita ". $mysqli->error. " ". $mysqli->errno );?>
12 Connessione a MySQL con MySQLi Esempio di connessione basato sull approccio Object Oriented Nel esempio proposto, viene effettuata un'istanza dell'oggetto "$connessione" appartenente alla classe "mysqli"; come è possibile osservare, questa operazione prevede il passaggio degli stessi parametri previsti per la funzione mysqli_connect(). Nel codice precedente viene introdotta anche un'altra funzione, mysqli_connect_errno() che ha il compito di produrre, in caso di malfunzionamento, il numero identificativo dell'errore notificato in connessione dal Database manager; se questo numero dovesse essere generato, allora la funzione mysqli_connect_error() comunicherà all'utente la tipologia di eccezione verificatasi. 12
13 Connessione a MySQL con MySQLi La funzione mysqli_connect() e l'istanza alla classe mysqli di connessione non sono le uniche soluzioni disponibili per l'accesso al Database manager MySQL messe a disposizione da MySQLi. In alternativa, è possibile utilizzare la funzione mysqli_real_connect() (con l approccio procedurale) o il relativo metodo mysqli::real_connect (con l approccio Object oriented); la funzione mysqli_real_connect() funziona in modo molto simile a mysqli_connect() per aprire una connessione al DBMS, ma presenta come differenza sostanziale la possibilità di specificare dei parametri addizionali (Flags). 13
14 Connessione a MySQL con MySQLi Funzione mysqli_real_connect() da usare con approccio procedurale La funzione mysqli_real_connect() funziona in modo molto simile a mysqli_connect() per aprire una connessione al DBMS, ma presenta come differenza sostanziale la possibilità di specificare dei parametri addizionali (Flags). I parametri addizionali previsti per questa funzione sono cinque e rappresentano altrettante opzioni di connessione: MYSQLI_CLIENT_COMPRESS: permette l'utilizzo del protocollo di compressione; MYSQLI_CLIENT_FOUND_ROWS: restituisce il numero di record rilevati, non quello dei record coinvolti dall'interrogazione; MYSQLI_CLIENT_IGNORE_SPACE: consente l'utilizzo di spazi vuoti dopo i nomi delle funzioni e permette di rendere riservati tutti i nomi delle funzioni; MYSQLI_CLIENT_INTERACTIVE: attiva l'impostazione di MySQL interactive_timeout espressa in secondi invece di wait_timeout (sempre espressa in secondi), in questo modo la connessione verrà chiusa dopo l'intervallo di tempo definito in mancaza di istruzioni al DBMS; MYSQLI_CLIENT_SSL: utilizza il protocollo crittografico SSL (Secure Sockets Layer) che consente una comunicazione sicura e l'integrità dei dati su reti TCP/IP. N.B. Per questioni di sicurezza, la funzione mysqli_real_connect() non supporta il flag MULTI_STATEMENT per l'invio simultaneo di più interrogazioni al DBMS, a questo scopo sarà invece possibile utilizzare come alternativa una funzione apposita, denominata mysqli_multi_query() (o il relativo metodo mysqli::multi_query). 14
15 Connessione a MySQL con MySQLi Esempio: Funzione mysqli_real_connect() da usare con approccio procedurale <?php // connessione con il metodo mysqli_real_connect() // inizializzazione di MySQLi $link = mysqli_init() or die ("<br> Errore nell'inizializzazione di MySQLi ". $mysqli->error. " ". $mysqli->errno ); // definizione delle variabili $host = "localhost"; $user = "username"; $pass = "password"; $db = "data"; // connessione al DBMS...Vedi slide seguente... 15
16 Connessione a MySQL con MySQLi Esempio: Funzione mysqli_real_connect() da usare con approccio procedurale // connessione al DBMS mysqli_real_connect($link, $host, $user, $pass, $db) or die ("<br>errore di connessione". mysqli_error($connessione). " ". mysqli_errno($connessione)); //resto del programma... // chiusura della connessione mysqli_close($link) or die ("<br>errore di chiusura". mysqli_error($connessione). " ". mysqli_errno($connessione));?> 16
17 Connessione a MySQL con MySQLi Esempio: Funzione mysqli_real_connect() da usare con approccio procedurale Si analizzi il codice proposto: viene inizializzato MySQLi tramite la funzione mysqli_init() che crea una risorsa ("link") da passare come argomento all'istruzione di connessione; vengono definite le variabili da utilizzare come parametri a mysqli_real_connect(); viene stabilita la connessione a meno di eventuali errori; viene chiusa la connessione tramite la funzione mysqli_close() a cui viene passata come argomento la risorsa creata in inizializzazione. 17
18 Connessione a MySQL con MySQLi Metodo mysqli::real_connect da usare con approccio Object Oriented <?php // connessione con il metodo mysqli_real_connect() // inizializzazione di MySQLi $link = mysqli_init() or die ("<br> Errore nell'inizializzazione di MySQLi ". $mysqli->error. " ". $mysqli->errno ); // definizione delle variabili $host = "localhost"; $user = "username"; $pass = "password"; $db = "data";... Vedi slide seguente 18
19 Connessione a MySQL con MySQLi Metodo mysqli::real_connect da usare con approccio Object Oriented // connessione al DBMS $mysqli->real_connect($host, $user, $pass, $db) or die( <br>errore di connessione". $mysqli->error. " ". $mysqli->errno ); //resto del programma... // chiusura della connessione $mysqli->close() or die ("<br>chiusura connessione fallita ". $mysqli->error. " ". $mysqli->errno );?> 19
20 Connessione a MySQL con MySQLi Metodo mysqli::real_connect da usare con approccio Object Oriented Le differenze tra i due codici proposti non sono tante: anche in questo caso MySQLi viene inizializzato tramite mysqli_init(), ma la risorsa creata non deve essere passata al metodo di connessione come parametro, perché disponibile per istanza all'interno della classe MySQLi; di conseguenza non sarà necessario passare questo argomento neanche al metodo mysqli::close che chiuderà la connessione 20
21 Eseguire una query con MySQLi Indipendentemente dall approccio che si intenderà utilizzare (procedurale o Object Oriented) in generale ciascuna query è composta di 4 fasi (3 + 1): preparazione = costruzione di una stringa contenente il comando SQL da eseguire esecuzione = invio del comando SQL al DBMS, generazione e ricezione del result set estrazione = lettura dei dati presenti nel result set formattazione = costruzione del codice HTML per visualizzare i risultati nella pagina L estrazione e formattazione solitamente sono organizzate in un ciclo (while o for) La formattazione è opzionale, dipende dalle esigenze (presentazione o uso per altre funzioni) 21
22 Eseguire una query con MySQLi comando SQL fisso Query: preparazione esempi $query = "SELECT login FROM utente"; $query = "INSERT INTO utente (login, password) VALUES ('pippo', 'xyz')"; comando SQL con valori variabili esempio: $query = "SELECT login FROM utente WHERE password = '. $password. ' " ; si usa l operatore di concatenazione (.) per inserire variabili PHP nella query SQL (N.B. usare gli apici singoli ' ' intorno ad ogni stringa) 22 N.B. la fase di preparazione della query è la stessa in entrambi gli approcci in quanto si tratta di costruire, tramite il PHP, un comando che rispetti la sintassi del linguaggio SQL
23 Eseguire una query con MySQLi Query: esecuzione una volta preparata, è sufficiente inviare la query SQL al DBMS, usando la connessione attiva ed il database attualmente selezionato: per le query di tipo INSERT, DELETE o UPDATE il lavoro è terminato per le query di tipo SELECT occorre estrarre ed analizzare il result set (-) il valore di ritorno è un riferimento al result set attraverso cui si arriva al risultato vero e proprio (-) liberare la memoria una volta esaminato il risultato 23
24 Eseguire una query con MySQLi Query: esecuzione (approccio procedurale) //apertura di una connessione... $query = "SELECT * FROM utente ; $result = mysqli_query ($connessione, $query) or die ("Query fallita ". mysqli_error($connessione). " ". mysqli_errno($connessione)); 24 // operazioni sul result set... // rilascio della memoria associata al result set solo per le query di selezione... // chiusura connessione...
25 Eseguire una query con MySQLi 25 Query: estrazione (approccio procedurale) si basa sull utilizzo di una delle due funzioni mixed mysqli_fetch_array ( mysqli_result $result [, int $resulttype = MYSQLI_BOTH ] ) oppure array mysqli_fetch_assoc ( mysqli_result $result ) result è il result set ottenuto da una precedente chiamata a mysqli_query il risultato della chiamata a mysqli_fetch_array è un array o solo numerico ($resulttype =MYSQLI_NUM), o solo associativo ($resulttype =MYSQLI_ASSOC), oppure entrambi gli array (default $resulttype =MYSQLI_BOTH ) oppure NULL quando è terminato il result set il risultato della chiamata a mysqli_fetch_assoc è ESCLUSIVAMENTE un array associativo dove gli indici = nomi dei campi o attributi oppure NULL quando è terminato il result set per ottenere il numero di elementi nel result set si utilizza la funzione int mysqli_num_rows ( mysqli_result $result )
26 Eseguire una query con MySQLi Query: estrazione (e formattazione) MODO 1 (approccio procedurale)... // apertura connessione... // esecuzione query while ($row = mysqli_fetch_array ($result, MYSQLI_NUM)) //solo numerico { echo <p> ID: $row[ 0] COGNOME: $row[ 1] NOME: $row[ 2] </p> ; }... // chiusura connessione 26
27 Eseguire una query con MySQLi Query: estrazione (e formattazione) MODO 1 (approccio procedurale)... // apertura connessione... // esecuzione query while ($row = mysqli_fetch_array ($result, MYSQL_ASSOC)) //solo associativo { echo <p> ID: $row[ 'id' ] COGNOME: $row[ 'surname' ] NOME: $row[ 'name' ] </p> ; }... // chiusura connessione 27
28 Eseguire una query con MySQLi Query: estrazione (e formattazione) MODO 1(approccio procedurale)... // apertura connessione... // esecuzione query while ($row = mysqli_fetch_array ($result, MYSQL_BOTH)) //entrambi -default { echo <p> ID: $row[ 0] COGNOME: $row[ 1] NOME: $row[ 2] </p><br> ; echo <p> ID: $row[ 'id' ] COGNOME: $row[ 'surname' ] NOME: $row[ 'name' ] </p> ; }... // chiusura connessione 28
29 Eseguire una query con MySQLi Query: estrazione (e formattazione) MODO 2 (approccio procedurale)... // apertura connessione... // esecuzione query while ($row = mysqli_fetch_assoc ($result)) //solo associativo { echo <p> ID: $row[ 'id' ] COGNOME: $row[ 'surname' ] NOME: $row[ 'name' ] </p>); }... // chiusura connessione 29
30 Eseguire una query con MySQLi Query: estrazione (e formattazione) MODO 3 (approccio procedurale)... // apertura connessione... // esecuzione query 30 $ num_righe = mysqli_num_rows($result); for ($i=1; $i<=$num_righe; $i++) { $row = mysqli_fetch_assoc($result); $id = $row[' id' ]; $surname = $row[' surname' ]; $name = $row[' name' ]; echo "<p> ID: $id COGNOME: $surname NOME: $name</p>"; }... // chiusura connessione
31 Eseguire una query con MySQLi Query: esecuzione (approccio Object-Oriented) //apertura connessione... $query = "SELECT * FROM utente ; $result= $mysqli->query($query) or die ("<br>query fallita ". $mysqli->error. " ". $mysqli->errno ); 31 // operazioni eventuali sul result set.. // liberazione risorse... // chiusura connessione
32 Eseguire una query con MySQLi Query: estrazione (approccio Object-Oriented) si basa sull utilizzo di di uno dei due metodi mixed mysqli_result::fetch_array ([ int $resulttype = MYSQLI_BOTH ] ) oppure array mysqli_result::fetch_assoc ( ) il risultato della chiamata al metodo fetch_array è un array $result o solo numerico ($resulttype =MYSQLI_NUM), o solo associativo ($resulttype =MYSQLI_ASSOC), oppure entrambi gli array (default $resulttype =MYSQLI_BOTH ) oppure NULL quando è terminato il result set il risultato della chiamata al metodo fetch_assoc è ESCLUSIVAMENTE l array associativo $result dove gli indici coincidono con i nomi dei campi (attributi) oppure NULL quando è terminato il result set per ottenere il numero di elementi nel result set si utilizza l attributo int $result->num_rows; 32
33 Eseguire una query con MySQLi Query: estrazione (e formattazione) MODO 1 (approccio Object-Oriented)... // apertura connessione... // esecuzione query while ($row = $result->fetch_array (MYSQLI_NUM)) //solo numerico { echo <p> ID: $row[ 0] COGNOME: $row[ 1] NOME: $row[ 2] </p> ; }... // chiusura connessione 33
34 Eseguire una query con MySQLi Query: estrazione (e formattazione) MODO 1 (approccio procedurale)... // apertura connessione... // esecuzione query while ($row = $result->fetch_array (MYSQL_ASSOC)) //solo associativo { echo <p> ID: $row[ 'id' ] COGNOME: $row[ 'surname' ] NOME: $row[ 'name' ] </p> ; }... // chiusura connessione 34
35 Eseguire una query con MySQLi Query: estrazione (e formattazione) MODO 1(approccio procedurale)... // apertura connessione... // esecuzione query while ($row = $result->fetch_array (MYSQL_BOTH)) //entrambi - default { echo <p> ID: $row[ 0] COGNOME: $row[ 1] NOME: $row[ 2] </p><br> ; echo <p> ID: $row[ 'id' ] COGNOME: $row[ 'surname' ] NOME: $row[ 'name' ] </p> ; }... // chiusura connessione 35
36 Eseguire una query con MySQLi Query: estrazione (e formattazione) MODO 2 (approccio Object-Oriented)... // apertura connessione... // esecuzione query while ($row = fetch_assoc()) //solo associativo { echo <p> ID: $row[ 'id' ] COGNOME: $row[ 'surname' ] NOME: $row[ 'name' ] </p>); }... // chiusura connessione 36
37 Eseguire una query con MySQLi Query: estrazione (e formattazione) MODO 3 (approccio Object-Oriented)... // apertura connessione... // esecuzione query 37 $nrow = $result>num_rows; for ($i=1; $i<=$num_righe; $i++) { $row = $result->fetch_array (MYSQL_BOTH); $id = $row[' id' ]; $surname = $row[' surname' ]; $name = $row[' name' ]; echo "<p> ID: $id COGNOME: $surname NOME: $name</p>"; }... // chiusura connessione
38 Risultati di una query con MySQLi Nel caso di entrambi gli approcci il fatto che una query sia stata eseguita correttamente non significa necessariamente che abbia prodotto dei risultati Può infatti verificarsi il caso in cui una query, pur essendo perfettamente corretta, non produce alcun risultato, ad esempio perché le condizioni che abbiamo specificato nella clausola WHERE non sono mai verificate sulle tabelle interessate. Se vogliamo sapere quante righe sono state restituite da una SELECT, possiamo usare: -Approccio procedurale: la funzione mysqli_num_rows ($result) -Approccio Object-Oriented: la proprietà $result>num_rows che in entrambi io casi ci restituisce il numero di righe contenute dall'identificativo del risultato che le passiamo. 38
39 Risultati di una query con MySQLi Se invece abbiamo eseguito una query di aggiornamento INSERT, UPDATE, DELETE e vogliamo sapere quante righe sono state modificate, possiamo usare: -Approccio procedurale: la funzione mysqli_affected_rows ($result) -Approccio Object-Oriented: la proprietà $result>affected_rows 39
40 Chiudere una connessione con MySQLi Per la chiusura di una connessione secondo l approccio procedurale, l'estensione MySQLi mette a disposizione la funzione mysqli_close() che accetta come parametro il link alla connessione che si desidera chiudere, nel caso in cui sia attiva un'unica connessione non sarà necessario passarne il link alla funzione mysqli_close ($connessione) or die ("<br>chiusura connessione fallita ". mysqli_error ($connessione). " ". mysqli_errno($connessione)); In alternativa, nel caso dell'approccio OOP, sarà possibile utilizzare il metodo mysqli::close() come istanza della classe di connessione: $mysqli->close() or die ("<br>chiusura connessione fallita ". $mysqli->error. " ". $mysqli->errno ); 40
41 Prepared statement con MySQLi La possibilità di definire prepared statements (o, meno comunemente, parameterized statements) è uno dei maggiori vantaggi nell utilizzo dell estensione MySQLI. Sono query SQL con struttura fissa ma dati variabili (di input e/o di output) I prepared statements costituiscono infatti una protezione contro gli attacchi basati su SQL injections, ciò è una conseguenza del fatto che in tali dichiarazioni l SQL e i dati rimangono separati; in pratica, anche in presenza di tentativi di SQL injections questi non potranno avere successo, in quanto le istruzioni malevole non entreranno a far parte del template e i dati verranno manipolati al di fuori delle istruzioni basate su SQL. 41 SQL injection è una tecnica di code injection, usata per attaccare applicazioni di gestione dati, con la quale vengono inseriti delle stringhe di codice SQL malevole all'interno di campi di input in modo che vengano eseguiti (es. per fare inviare il contenuto del database all'attaccante).
42 Prepared statement con MySQLi Per formulare una semplice query finalizzata all estrazione di dati da una tabella tramite la sintassi di MySQLi, potrebbe essere sufficiente per quanto visto finora un istruzione come le seguenti : (approccio procedurale) $result = mysqli_query ($connessione, "SELECT nome, cognome FROM agenda WHERE record_id = 5")); (approccio Object-Oriented) $result = $mysqli->query ("SELECT nome, cognome FROM agenda WHERE record_id = 5"); N.B. In entrambi i casi non sono stati utilizzati i prepared statements, come si può notare infatti la logica dell SQL non è stata separata dai dati, il valore relativo alla condizione della clausola WHERE non è rappresentato da un placeholder e al DBMS non è stato passato il template di una dichiarazione ma un istruzione SQL vera e propria. 42
43 Prepared statement con MySQLi Volendo parametrare la query proposta in precedenza, utilizzando l approccio Object-Oriented, si potrebbe riformularla in questo modo : // preparazione del template $pst = $mysqli->prepare ("SELECT cognome, nome FROM agenda WHERE record_id =?"); // definizione della variabile per la sostituzione del placeholder $pst->bind_param('i', $record_id); // valorizzazione della variabile per l esecuzione $record_id = 5; $pst->execute(); $pst->bind_result ($cogn, $nom); $pst->fetch(); $pst->close(); // esecuzione dell istruzione //effettuo bind variabili prepared statement //prelevo i valori delle variabili dopo il bind //chiusura dell istruzione 43
44 Prepared statement con MySQLi In pratica, l esempio appena riportato mostra la fase relativa alla preparazione con la relativa definizione del template, ad essa faranno seguito l associazione del parametro per la sostituzione del placeholder (? ) e, infine, l esecuzione dell istruzione sulla base del modello memorizzato da MySQL. Mentre il funzionamento de metodi prepare() ed execute() dovrebbe risultare sufficientemente intuitivo, bind_param() merita un ulteriore approfondimento; quest ultimo infatti si occuperà di effettuare il binding delle variabili accettando due argomenti: il primo (nel caso specifico i ) destinato a definire il tipo di dato associato ad un valore atteso, il secondo indicante la variabile a cui tale valore dovrà essere associato. Ecco perché, nell esempio, il placeholder? verrà sostituito dal valore 5 utilizzato per inizializzare la variabile intera $record_id. 44
45 Prepared statement con MySQLi L utilizzo di 'i' per l indicazione di un tipo di dato non è il frutto di una scelta arbitraria o di una semplice convenzione, ma di uno schema di corrispondenze previsto a livello sintattico che vede anche: 'd' corrispondere a variabili associate al tipo di dato double; 's' a variabili associate al tipo di dato string; 'b' corrispondere a blob, cioè a dati in formato binario. I caratteri per la specifica del tipo di dato dovranno essere ripetuti tante volte quante sono le variabili da valorizzare e ordinati sulla base di queste ultime, come nel caso concreto proposto nella slide successiva 45
46 Prepared statement con MySQLi Volendo parametrare la query proposta in precedenza, utilizzando l approccio procedurale, si potrebbe riformularla in questo modo : // preparazione del template $stmt = mysqli_prepare ( $conn, ("SELECT nome, cognome FROM agenda WHERE record_id =?")); // definizione della variabile per la sostituzione del placeholder mysqli_stmt_bind_param($stmt, "i", $record_id); // valorizzazione della variabile per l esecuzione $record_id = 5; mysqli_stmt_execute($stmt); // esecuzione dell istruzione mysqli_stmt_bind_result($stmt, $cogn, $nom); //Bind delle variabili mysqli_stmt_fetch($stmt); mysqli_stmt_close($stmt); // prelevo i valori delle variabili dopo il bind //chiusura dell istruzione 46
47 Prepared statement con MySQLi Stile procedurale Funzione per gli errori int mysqli_stmt_errno ( mysqli_stmt $stmt ) Stile orientato agli oggetti int $mysqli_stmt->errno; Returns the error code for the most recently invoked statement function that can succeed or fail. Client error message numbers are listed in the MySQL errmsg.h header file, server error message numbers are listed in mysqld_error.h. In the MySQL source distribution you can find a complete list of error messages and error numbers in the file Docs/mysqld_error.txt. 47
48 Prepared statement con MySQLi Funzioni di gestione degli errori Stile procedurale string mysqli_stmt_error ( mysqli_stmt $stmt ) Stile orientato agli oggetti string $mysqli_stmt->error; Returns a string containing the error message for the most recently invoked statement function that can succeed or fail. 48
49 Ulteriori informazioni con MySQLi Riepilogo delle funzioni e dei metodi estensione MySQLI La classe MySQLi 49
MY SQL Guida MySQL di base
2017 MY SQL Guida MySQL di base Progetto di Alternanza Scuola-Lavoro Anno scolastico 2016-2017 Istituto Tecnico Enrico Fermi, Siracusa Eleonora SikeWEB 15/05/2017 MySQL Collegarsi ad un database e interagire
Spiegazioni esercizio Gestione Tabella con PHP e MySQL
Spiegazioni esercizio Gestione Tabella con PHP e MySQL foglio_di_stile.css (foglio di stile esterno) Questo file contiene: 1. la struttura generale delle quattro pagine web dinamiche: index.php, inserisci.php,
SQL e linguaggi di programmazione. Cursori. Cursori. L interazione con l ambiente SQL può avvenire in 3 modi:
SQL e linguaggi di programmazione L interazione con l ambiente SQL può avvenire in 3 modi: in modo interattivo col server attraverso interfacce o linguaggi ad hoc legati a particolari DBMS attraverso i
Per poter interagire con un database in rete mediante uno script php bisogna. innanzitutto cerare una connessione. Ciò si ottiene mediante la funzione
MYSQL E PHP Per poter interagire con un database in rete mediante uno script php bisogna innanzitutto cerare una connessione. Ciò si ottiene mediante la funzione MySQL_connect(nome del host, nome utente,
Connessione con MySQL
Connessione con MySQL Architettura Server-Side Eventuali parametri cookie sessioni Elaborazione SELECT... DATABASE Quando i dati sono molti e la persistenza deve andare altre la sessione o la durata
Laboratorio Progettazione Web PHP e MySQL. Andrea Marchetti IIT-CNR 2014/2015
Laboratorio Progettazione Web PHP e MySQL Andrea Marchetti IIT-CNR 2014/2015 Architettura di una applicazione Web Browser Web HTTP Server Web Dati Presentation Application Storage PHP e DataBase Quando
Laboratorio Progettazione Web PHP e MySQL. Andrea Marchetti IIT-CNR 2016/2017
Laboratorio Progettazione Web PHP e MySQL Andrea Marchetti IIT-CNR 2016/2017 Architettura di una applicazione Web Browser Web HTTP Server Web Dati Presentation Application Storage PHP e DataBase Quando
Laboratorio Progettazione Web PHP e MySQL. Andrea Marchetti IIT-CNR 2013/2014
Laboratorio Progettazione Web PHP e MySQL Andrea Marchetti IIT-CNR 2013/2014 Architettura di una applicazione Web Browser Web HTTP Server Web API Dati Presentation Application Storage PHP e DataBase Quando
2011 Politecnico di Torino 1
SQL per le applicazioni Esercitazione PHP e MySQL Svolgimento D B M G Passi di risoluzione creazione e popolamento della base di dati Creazione di un script SQL Passo 2 creazione di una query d interrogazione
Laboratorio di Progettazione Web
PHP e MySQL (2) Laboratorio di Progettazione Web AA 2009/2010 Chiara Renso ISTI- CNR - [email protected] Nelle pagine web, quando le tabelle sono molto complesse, può risultare utile suddividere la visualizzazione
SISTEMI OPERATIVI, RETI, INTERNET
Competenze e Unità didattica formativa capitalizzabile 4.1 SISTEMI OPERATIVI, RETI, INTERNET Comprendere il significato dell'evoluzione dei sistemi operativi. Comprendere che cosa fa un sistema operativo
La connessione php-mysql con MySQLi
La connessione php-mysql con MySQLi Premessa Lo scenario che si intende alla base di questo capitolo è di disporre di un ambiente phpmysql rappresentato nel seguente schema: L'applicazione php viene eseguita
Basi di Dati: Corso di laboratorio
Basi di Dati: Corso di laboratorio Lezione 9 Raffaella Gentilini 1 / 41 Sommario 1 DBMS Attivi e Triggers 2 2 / 41 DBMS Attivi DBMS Attivi I DBMS tradizionale sono passivi: Eseguono delle operazioni solo
PHP e MySQL. Scripting server-side per accesso a DB MySQL
PHP e MySQL Scripting server-side per accesso a DB MySQL Connessione a un DB MySQL Prima di accedere ai dati è necessario creare una connessione con il DB In PHP si utilizza la funzione mysql_connect,
Interazione 1 linguaggio PHP con DB MySQL
Interazione 1 linguaggio PHP con DB MySQL Un problema sempre più frequente dei webmaster è quello di dover gestire intere sezioni dei loro siti in modo semplice e veloce. La gestione è quanto più efficiente,
PHP e MySQL. Guida scaricata da www.webstyling.it
Home -> Manuali & Tutorials -> Guida PHP PHP e MySQL E' possibile realizzare delle applicazioni in php appoggiandosi ad un database, quale ad esempio MySQL. Con le novità introdotte ai tempi di MySQL 4.1
APPUNTI DI PHP : V INFORMATICA SEZIONE G
APPUNTI DI PHP : V INFORMATICA SEZIONE G Prof. Conti R. mysql_connect() Apre una connessione verso un DB MySQL. $db = mysql_connect([$db_host[, $db_username[, $db_password[, $newlink[,$clientflags]]]]]);
Open Database Connectivity (ODBC)
Open Database Connectivity (ODBC) Open Database Connectivity (ODBC), proposto dalla Microsoft nel 1991, fornisce un interfaccia applicativa standard che permette ad una generica applicazione di accedere
DATABASE PER IL WEB. Programmazione Web 1
DATABASE PER IL WEB Programmazione Web 1 Archite3ura web con database Client Tier Web/App Tier DB Tier Client Web / App Server Database Il server web comunica con un altro server che con8ene il la banca
Gestire MySQL tramite PHP
Gestire MySQL tramite PHP Copyright (c) 2011 Antonio Gallo ([email protected]) Il seguente documento è rilasciato sotto licenza Creative Commons 2.5 Attribution Share alike. Per leggere una copia
PHP 5. PHP ed i database. Database e tabelle. Struttura di un DB relazionale. Accesso a database
PHP ed i database PHP 5 Accesso a database PHP funziona con molti database relazionale che includono: Oracle Access Postgres SQL Server MySQL Useremo MySQL poiché è semplice da usare, gratuito e molto
ASP e Database. A cura di Michele Cavalieri
ASP e Database A cura di Michele Cavalieri (fonte http://www.aspitalia.com/articoli/db/introduzione.aspx ) Un aspetto fondamentale di ASP è l'utilizzo dei componenti, che non sono altro che ActiveX come
Interrogare una base di dati: algebra relazionale e SQL. Savino Castagnozzi Giorgio Macauda Michele Meomartino Salvatore Picerno Massimiliano Sartor
Interrogare una base di dati: algebra relazionale e SQL Savino Castagnozzi Giorgio Macauda Michele Meomartino Salvatore Picerno Massimiliano Sartor Contesto didattico Il seguente materiale didattico è
liceo B. Russell PROGRAMMAZIONE INDIRIZZO: SCIENTIFICO SCIENZE APPLICATE TRIENNIO: TERZA DISCIPLINA: INFORMATICA
INDIRIZZO: SCIENTIFICO SCIENZE APPLICATE PROGRAMMAZIONE TRIENNIO: TERZA DISCIPLINA: INFORMATICA MODULO 1: HTMLe CSS UNITÀ ORARIE PREVISTE: 35 Il linguaggio HTML ed il web I principali tag I fogli di stile:
Data Base. Master "Bio Info" Reti e Basi di Dati Lezione 6
Data Base 1 Sommario I concetti fondamentali. Database Relazionale.. Query e SQL MySql, Creazione di un db in MySQL con PHPmyAdmin Creazione database e delle Tabelle Query Inserimento Ricerca Modifica
Laboratorio Progettazione Web PHP e MySQL - Lezione 9. Andrea Marchetti IIT-CNR [email protected] 2011/2012
Laboratorio Progettazione Web PHP e MySQL - Lezione 9 Andrea Marchetti IIT-CNR [email protected] 2011/2012 Architettura di una applicazione Web Browser Web HTTP Server Web PHP Dati View Control
File binari e file di testo
I file File binari e file di testo distinzione tra file binari file di testo si possono usare funzioni diverse per la gestione di tipi di file diversi Programmazione Gestione dei file 2 File binari e file
Guida introduttiva al PHP
Fabio Castellini 26/01/2016 Guida introduttiva al PHP Cos'è il PHP? Il PHP è un linguaggio di scripting interpretato, simile al JavaScript, per intenderci, originariamente concepito per la programmazione
PHP 5. Accesso a database
PHP 5 Accesso a database PHP ed i database PHP funziona con molti database relazionali che includono: Oracle Access Postgres SQL Server MySQL Useremo MySQL poiché è semplice da usare, gratuito e molto
bool mysql_select_db([string database_name [,resource link_identifier]]) Connessione ad un server MySQL vuole conettere
Connessione ad un server MySQL resource mysql_connect ([string server [, string username [, string password [, bool new_link [, int client_flags]]]]]) server nome o indirizzo del server username nome utente
Manuale d uso della Posta TBS. Oracle Collaboration Suite
Manuale d uso della Posta TBS. Oracle Collaboration Suite Indice 1 Introduzione...3 2 Prerequisiti:...3 3 Accesso WEB...3 3.1 Come cambiare la propria password...8 4 Quota spazio su disco del mail server...9
Manuale SQL. Manuale SQL - 1 -
Manuale SQL - 1 - Istruzioni DDL Creazione di una tabella : CREATE TABLE Il comando CREATE TABLE consente di definire una tabella del database specificandone le colonne, con il tipo di dati ad esse associate,
Esercitazione 1 SQL: DDL e DML di base
Esercitazione 1 SQL: DDL e DML di base Sistemi Informativi T Versione elettronica: L01.2.DDLDMLbase.pdf Prime cose da fare Fare login sul PC usando lo username di Scuola Procedura descritta qui: https://infoy.ing.unibo.it/new_account/
Laboratorio Progettazione Web PHP e MySQL - Lezione 9. Andrea Marchetti IIT-CNR [email protected] 2012/2013
Laboratorio Progettazione Web PHP e MySQL - Lezione 9 Andrea Marchetti IIT-CNR [email protected] 2012/2013 Architettura di una applicazione Web Browser Web HTTP Server Web API Dati Presentation
Caratteristiche dei linguaggi per Database
IL LINGUAGGIO Caratteristiche dei linguaggi per Database I linguaggi per basi di dati relazionali possiedono i comandi per: definizione del data base; manipolazione dei dati; associazione tra tabelle diverse;
DBMS. Affidabilità. Privatezza dei dati. Efficienza. Efficacia. Un DBMS deve garantire:
DBMS Un DBMS deve garantire: Affidabilità Privatezza dei dati Efficienza Efficacia DBMS Affidabilità Un DBMS deve garantire di poter mantenere intatto il suo contenuto, anche in caso di malfunzionamento.
V. Moriggia Modelli di Base Dati. Modelli di Base Dati. a.a. 2001/2002 4.1
Modelli di Base Dati 4 Un DBMS: Access a.a. 2001/2002 4.1 DBMS 4.2 DBMS = Data Base Management System Software per la costruzione e la gestione di una base dati Esempi di DBMS: Oracle, MySQL, SQLServer,
LABORATORIO di INFORMATICA
Università degli Studi di Cagliari Corso di Laurea Magistrale in Ingegneria per l Ambiente ed il Territorio LABORATORIO di INFORMATICA A.A. 2010/2011 Prof. Giorgio Giacinto IL MODELLO RELAZIONALE http://www.diee.unica.it/giacinto/lab
Programmazione web lato client con JavaScript. Marco Camurri 1
Programmazione web lato client con JavaScript Marco Camurri 1 JavaScript E' un LINGUAGGIO DI PROGRAMMAZIONE che consente di inserire codice in una pagina web Sintassi simile a Java (e al C), ma NON E'
Elaborato Shell. Elementi di architettura e sistemi operativi 2016/2017
Elaborato Shell Elementi di architettura e sistemi operativi 2016/2017 Introduzione passwd è il file di configurazione di sistema in cui sono memorizzate alcune delle informazioni relative agli account
SQL - Structured Query Language
SQL - Structured Query Language Lab 05 Alessandro Lori Università di Pisa 27 Aprile 2012 Riepilogo esercitazione precedente Operatori insiemistici (UNION, INTERSECT, EXCEPT) Riepilogo esercitazione precedente
I.I.S. G. COSSALI - ORZINUOVI DATABASE. Marzo 2017 Prof. Dario Tomasoni 1
I.I.S. G. COSSALI - ORZINUOVI DATABASE Marzo 2017 Prof. Dario Tomasoni 1 IMPOSTAZIONE 60 min = Database concetti + Esercizi; 10 min = pausa; 30 min = Linguaggio SQL; 30 min = Database prove LibreOffice
Non si deve fare ALCUN riferimento alla parte specifica di JDBC.
Un applicazione per la quale sia fondamentale l indipendenza dal Database può essere scritta in Java usando le specifiche. (Package java.sql) Non devono essere usate chiamate specifiche del database: Si
Structured Query Language
IL LINGUAGGIO SQL Structured Query Language Contiene sia il DDL sia il DML, quindi consente di: Definire e creare il database Effettuare l inserimento, la cancellazione, l aggiornamento dei record di un
Istruzioni DCL di SQL. Pag. 119 par.5
Istruzioni DCL di SQL Pag. 119 par.5 Comando: GRANT (Per concedere diritti su tabelle a nuovi o vecchi utenti) Dato un determinato DB è necessario predisporre e concedere i relativi diritti d accesso a
Lavorare con MySQL Parte Seconda.
Lavorare con MySQL Parte Seconda. PHP, dalla versione 4.0, usufruisce difunzioni native per colloquiare con MySQL, senza appoggiarsi ad alcuna libreria o modulo esterno. In questa lezione verranno esaminate
MySQL Migration Toolkit
MySQL Migration Toolkit Mysql Migration Toolkit è un wizard completamente grafico per migrare i dati da database come Oracle e Access a MySQL. Per utilizzarlo occorre innanzitutto lanciare un service MySQL
Sommario. Introduzione... 13
Sommario Introduzione... 13 1. Database pro e contro... 19 A cosa serve conoscere i database?...19 Le alternative alla gestione manuale...22 Quando non serve un database?...24 Domande ed esercizi...26
Basi di Dati CREAZIONE E POPOLAMENTO DI UNA BASE DI DATI
Basi di Dati CREAZIONE E POPOLAMENTO DI UNA BASE DI DATI La finalità di questa esercitazione è quella di creare, date delle specifiche progettuale, appositi script di creazione e popolamento di una base
MySQL Database Management System
MySQL Database Management System http://www.mysql.com/ DATABASE RELAZIONALI Un database è una collezione strutturata di informazioni. I database sono delle strutture nelle quali è possibile memorizzare
Costruzione di Sit Web con PHP e MySQL. Lezione 7 - Esercitazione - Introduzione a MySQL: le tabelle, i tpi di dato, le query
Costruzione di Sit Web con PHP e MySQL Lezione 7 - Esercitazione - Introduzione a MySQL: le tabelle, i tpi di dato, le query Esercitazione In questa lezione si farà insieme una seconda esercitazione che
SQL Server 2008. Architettura Client-Server. SQL Server 2008. Introduzione all uso di SQL Server 2008. Dutto Riccardo. http://dbdmg.polito.
SQL Server 2008 Introduzione all uso di SQL Server 2008 Dutto Riccardo http://dbdmg.polito.it SQL Server 2008 Gestione dei server OLAP e OLTP Gestione Utenti Creazione e gestione DB SQL Server Business
Basi di dati attive. Paolo Atzeni Stefano Ceri. Basi di dati attive
Basi di dati attive Paolo Atzeni Stefano Ceri Basi di dati attive BD con componente per la gestione di regole Evento- Condizione-Azione (regole di produzione): eventi: normalmente modifiche della base
Uso dei data bases con PHP. Prof. Francesco Accaino Iis Altiero Spinelli Sesto Sa Giovanni
Uso dei data bases con PHP Prof. Francesco Accaino Iis Altiero Spinelli Sesto Sa Giovanni MDAC MDAC è l acronimo di Microsoft Data Access Component e fa parte della tecnologia Microsoft denominata Universal
D B M G Il linguaggio HTML
Programmazione Web Il linguaggio HTML Il linguaggio HTML Concetti di base Le interfacce utente in HTML I form Le tabelle Il passaggio dei parametri contenuti nei form @2011 Politecnico di Torino 1 Concetti
Javascript e CSS nelle pagine WEB
1 Javascript e CSS nelle pagine WEB Esempi applicativi Autrice: Turso Antonella Carmen INDICE ARGOMENTI 2... 5 LEZIONE 1... 6 COSA SONO I JAVASCRIPT... 6 LEZIONE 2... 8 STRUTTURA DEL LINGUAGGIO JAVASCRIPT
Progettazione di Servizi Web e Reti di Calcolatori
Progettazione di Servizi Web e Reti di Calcolatori Prompt dei comandi Politecnico di Torino Prof. Antonio Lioy AA 2015-2016, esercitazione di laboratorio n.2 Per usare gli applicativi nslookup e wget è
VARIABILI, ASSEGNAZIONE, DECISIONI
LEZIONE-TSQL-03 PROGRAMMAZIONE (VER02) PAG. 1 / 6 LEZIONE-TSQL-03 PROGRAMMAZIONE (VER02) T-SQL PROGRAMMAZIONE PARTE TERZA VARIABILI, ASSEGNAZIONE, DECISIONI Tratto da Gregory A. Larsen, http://www.databasejournal.com/features/mssql/article.php/3087431/t-sql-programming-part-1---defining-variables-and-if-logic.htm
Fabio Proietti (c) 2013 Licenza:
N N Fabio Proietti (c) 2013 Licenza: http://creativecommons.org/licenses/by-sa/3.0/ Esame di stato 2009 Una casa editrice pubblica... vocabolario (tipo di)pubblicazione: tipo di rivista che ha una certa
Le basi del linguaggio Java
Le basi del linguaggio Java Compilazione e interpretazione Quando si compila il codice sorgente scritto in Java, il compilatore genera il codice compilato, chiamato bytecode. È un codice generato per una
19. LA PROGRAMMAZIONE LATO SERVER
19. LA PROGRAMMAZIONE LATO SERVER Introduciamo uno pseudocodice lato server che chiameremo Pserv che utilizzeremo come al solito per introdurre le problematiche da affrontare, indipendentemente dagli specifici
INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica
Fondamenti di Informatica INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica - Programma Un programma è una formulazione
Strumenti per l automazione del testing di applicazioni web Javascript-based
tesi di laurea Strumenti per l automazione del testing di applicazioni web Javascript-based Anno Accademico 2005/2006 relatore Ch.mo prof. Porfirio Tramontana 1 candidato Salvatore Agnello Matr. 41/2612
Introduzione a PHP Gestione dei Dati e della Conoscenza
Introduzione a PHP Gestione dei Dati e della Conoscenza Diego De Cao, Roberto Basili {decao,basili}@info.uniroma2.it a.a. 2008/2009 PHP Overview PHP (acronimo ricorsivo per "PHP: Hypertext Preprocessor")
Linee di programmazione
Ministero dell Istruzione, dell Università e della Ricerca Ufficio Scolastico regionale per il Lazio Istituto Tecnico Industriale A. Pacinotti ISTITUTO TECNICO TECNOLOGICO - LICEO SCIENTIFICO DELLE SCIENZE
MySQL per amministratori di database
Oracle University Chiamaci: 800 672 253 MySQL per amministratori di database Duration: 5 Days Description Il corso MySQL per amministratori di database è alla base del percorso di formazione per sviluppatori
Javascript. - Corso Web Design - Media Dream Academy. Stefano Gaborin
Javascript - Corso Web Design - Media Dream Academy Stefano Gaborin [email protected] www.above.company Cos è Javascript? JavaScript è un linguaggio di programmazione interpretato. Utilizzato
Come registrare la SoundStation IP7000 a un Server SIP HOME
Come registrare la SoundStation IP7000 a un Server SIP HOME Benvenuti nell'utility di configurazione SoundStation IP 7000. Assicurarsi di avere sempre installata l ultima versione firmware CONFIGURAZIONE
MODULO 2. Query normali e parametriche Query di:
MODULO 2 TITOLO DBMS e SQL In questo Modulo si affronta lo studio dei DBMS Access e MySQL. In particolare per Access, si descrive come progettare, impostare e modificare gli strumenti di lavoro (tabelle,
Ripasso Concetti Pratica in Access Link utili. ECDL - Database. European Computer Driving Licence - Modulo 5 - Database LEZIONE 3
ECDL - Database Ripasso European Computer Driving Licence - Modulo 5 - Database LEZIONE 3 Ripasso Cosa sono le relazioni? Come si gestiscono le relazioni in Access? Cosa si intende per query? Come interroghiamo
Raccolta e memorizzazione dei dati immessi nei moduli dai visitatori
Raccolta e memorizzazione dei dati immessi nei moduli dai visitatori Raccolta e memorizzazione dei dati immessi nei moduli dai visitatori Per impostazione predefinita, i risultati dei moduli vengono salvati
Guida per la personalizzazione dei modelli di stampa / salvataggio documenti
Guida per la personalizzazione dei modelli di stampa / salvataggio documenti 1. Premessa. Questa è una guida generale sulla funzione di personalizzazione dei modelli e come tale contiene informazioni a
