W3docs

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 flag MYSQLI_CLIENT_SSL.
  • Passare flag client come MYSQLI_CLIENT_COMPRESS o MYSQLI_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:

ParametroDescrizioneDefault
hostHostname o IP. Anteponi p: per una connessione persistente.localhost (o default da ini)
usernameNome utente MySQL.utente corrente
passwordLa password dell'utente.""
databaseDatabase predefinito da selezionare alla connessione.""
portNumero di porta TCP.3306
socketSocket Unix o named pipe Windows.da ini
flagsBitmask di flag client (vedi sotto).0

Nota: con l'API OO l'handle è l'oggetto, quindi il primo argomento è host. Con il procedurale mysqli_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 da mysqli_init(). Chiamarlo su un oggetto new mysqli() appena costruito che è già connesso fallirà.
  • Controllare la proprietà di errore sbagliata. Prima che esista una connessione, usa connect_errno / connect_error, non errno / 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().

Pratica

Pratica
Cosa si può fare con la funzione mysqli_real_connect() in PHP?
Cosa si può fare con la funzione mysqli_real_connect() in PHP?
Was this page helpful?