real_connect
In questo articolo discutiamo la funzione mysqli_real_connect() in PHP, usata per stabilire una connessione a un database MySQL.
In questo articolo discutiamo il metodo real_connect() in PHP, utilizzato per stabilire una connessione a un database MySQL. (L'equivalente procedurale è mysqli_real_connect().)
Questa pagina illustra cosa differenzia real_connect() dal semplice mysqli_connect(), l'elenco completo dei parametri, come abilitare SSL e altri flag di connessione, e i problemi più comuni.
Cos'è real_connect() e perché usarlo?
Il metodo real_connect() apre una connessione a un server MySQL, proprio come mysqli_connect(). La differenza chiave è che real_connect() opera su un handle di connessione che hai già creato con mysqli_init(), invece di creare la connessione e connettersi in un unico passaggio.
Questo passaggio aggiuntivo è importante perché ti offre una finestra tra la creazione dell'handle e la connessione, in cui puoi configurare opzioni che possono essere impostate solo prima che la connessione venga stabilita. Usa real_connect() (invece di mysqli_connect()) quando hai bisogno di:
- Impostare opzioni di connessione con
mysqli_options()— ad esempio un timeout di connessione (MYSQLI_OPT_CONNECT_TIMEOUT) o il supporto per i file locali. - Abilitare una connessione SSL/TLS con
ssl_set()e il flagMYSQLI_CLIENT_SSL. - Passare flag client come
MYSQLI_CLIENT_COMPRESSoMYSQLI_CLIENT_FOUND_ROWS. - Aprire una connessione persistente anteponendo
p:all'host.
Se non hai bisogno di nulla di tutto ciò, il più semplice mysqli_connect() è perfettamente adeguato.
Utilizzo di base
real_connect() segue sempre uno schema in due fasi: crea l'handle, poi connettiti. Ecco l'approccio orientato agli oggetti:
<?php
$mysqli = mysqli_init();
if (!$mysqli) {
die('mysqli_init failed');
}
if (!$mysqli->real_connect('localhost', 'username', 'password', 'database')) {
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
echo 'Success... ' . $mysqli->host_info . "\n";
$mysqli->close();
?>Prima creiamo un handle MySQLi con mysqli_init() e verifichiamo che abbia avuto successo. Poi chiamiamo real_connect() sull'oggetto $mysqli per connetterci. In caso di errore, lo segnaliamo con connect_errno e connect_error e ci fermiamo; in caso di successo stampiamo le informazioni sull'host e infine rilasciamo la connessione con close().
Parametri
real_connect() accetta i seguenti parametri, tutti opzionali, in questo ordine:
| Parametro | Descrizione | Default |
|---|---|---|
host | Hostname o IP. Anteponi p: per una connessione persistente. | localhost (o default da ini) |
username | Nome utente MySQL. | utente corrente |
password | La password dell'utente. | "" |
database | Database predefinito da selezionare alla connessione. | "" |
port | Numero di porta TCP. | 3306 |
socket | Socket Unix o named pipe Windows. | da ini |
flags | Bitmask di flag client (vedi sotto). | 0 |
Nota: con l'API OO l'handle è l'oggetto, quindi il primo argomento è
host. Con il proceduralemysqli_real_connect($link, $host, ...), il link viene passato per primo.
Impostare opzioni prima della connessione
Questo è il motivo principale per cui esiste real_connect(). Configura l'handle con mysqli_options() tra init e real_connect:
<?php
$mysqli = mysqli_init();
// These can only be set before connecting:
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
$mysqli->options(MYSQLI_INIT_COMMAND, "SET autocommit = 0");
if (!$mysqli->real_connect('localhost', 'username', 'password', 'database')) {
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
echo 'Connected with a 5-second timeout.';
$mysqli->close();
?>Connessione con SSL e flag client
Il settimo parametro è una bitmask di flag client. Per richiedere una connessione cifrata, configura i certificati con ssl_set() e passa MYSQLI_CLIENT_SSL:
<?php
$mysqli = mysqli_init();
$mysqli->ssl_set(null, null, '/path/to/ca-cert.pem', null, null);
$mysqli->real_connect(
'db.example.com', 'username', 'password', 'database',
3306, null,
MYSQLI_CLIENT_SSL
);
echo 'Encrypted connection established.';
$mysqli->close();
?>Flag comuni che puoi combinare con |:
MYSQLI_CLIENT_SSL— usa la cifratura SSL/TLS.MYSQLI_CLIENT_COMPRESS— usa il protocollo compresso.MYSQLI_CLIENT_FOUND_ROWS— restituisce le righe corrispondenti invece delle righe modificate.
Connessioni persistenti
Anteporre p: all'host riutilizza una connessione esistente dal pool tra le richieste invece di aprirne una nuova ogni volta, il che può ridurre il sovraccarico di connessione sui server ad alto traffico:
<?php
$mysqli = mysqli_init();
$mysqli->real_connect('p:localhost', 'username', 'password', 'database');
?>Problemi comuni
- Dimenticare
mysqli_init().real_connect()deve essere chiamato su un handle restituito damysqli_init(). Chiamarlo su un oggettonew mysqli()appena costruito che è già connesso fallirà. - Controllare la proprietà di errore sbagliata. Prima che esista una connessione, usa
connect_errno/connect_error, nonerrno/error. - Impostare le opzioni troppo tardi. Opzioni come il timeout di connessione non hanno effetto una volta che la connessione è aperta — devono essere impostate prima di
real_connect().
Conclusione
Il metodo real_connect() stabilisce una connessione MySQL da un handle creato con mysqli_init(), offrendoti la possibilità di configurare timeout, SSL e flag client che un mysqli_connect() one-shot non può. Una volta connesso, puoi eseguire istruzioni con query() e selezionare un database con select_db().