Connexions

Le serveur MySQL supporte l'utilisation de différentes couches de transport pour les connexions. Les connexions peuvent utiliser TCP/IP, les sockets de domaine Unix ou les pipes nommés Windows.

Le nom d'hĂŽte localhost a une signification particuliĂšre. Il est liĂ© Ă  l'utilisation des sockets de domaine Unix. Pour ouvrir une connexion TCP/IP sur l'hĂŽte local, 127.0.0.1 doit ĂȘtre utilisĂ© au lieu de localhost.

Exemple #1 Signification spéciale de localhost

<?php

$mysqli
= new mysqli("localhost", "user", "password", "database");

echo
$mysqli->host_info . "\n";

$mysqli = new mysqli("127.0.0.1", "user", "password", "database", 3306);

echo
$mysqli->host_info . "\n";

L'exemple ci-dessus va afficher :

Localhost via UNIX socket
127.0.0.1 via TCP/IP

ParamÚtres par défaut d'une connexion

Suivant la fonction de connexion utilisĂ©e, des paramĂštres peuvent ĂȘtre omis. Si un paramĂštre n'est pas fourni, alors l'extension tentera d'utiliser les valeurs par dĂ©faut dĂ©finies dans le fichier de configuration de PHP.

Exemple #2 ParamÚtres par défaut

mysqli.default_host=192.168.2.27
mysqli.default_user=root
mysqli.default_pw=""
mysqli.default_port=3306
mysqli.default_socket=/tmp/mysql.sock

Ces valeurs de paramÚtres sont alors passées à la bibliothÚque cliente utilisée par l'extension. Si la bibliothÚque cliente détecte un paramÚtre vide ou non défini, alors elle utilisera les valeurs par défaut internes à la bibliothÚque.

Valeurs par défaut internes à la bibliothÚque pour la connexion

Si la valeur de l'hÎte n'est pas définie ou est vide, alors la bibliothÚque cliente utilisera par défaut une connexion de type socket Unix sur localhost. Si le socket n'est pas défini ou vide, et qu'une connexion de type socket Unix est demandée, alors une connexion au socket par défaut /tmp/mysql.sock sera tentée.

Sous les systÚmes Windows, le nom d'hÎte . est interprété par la bibliothÚque cliente comme une tentative d'ouvrir un tube nommé Windows pour la connexion. Dans ce cas, le paramÚtre socket est interprété comme un tube nommé. S'il n'est pas fourni ou vide, alors le socket (tube nommé) vaudra par défaut \\.\pipe\MySQL.

Si ni un socket de domaine Unix, ni un tube nommé Windows n'est fourni, une connexion de base sera établie et si la valeur du port n'est pas définie, la bibliothÚque utilisera le port 3306.

La bibliothĂšque mysqlnd et la bibliothĂšque cliente MySQL (libmysqlclient) implĂ©mentent la mĂȘme logique pour dĂ©terminer les valeurs par dĂ©faut.

Options de connexion

Des options de connexion sont disponibles pour, par exemple, dĂ©finir des commandes d'initialisation Ă  exĂ©cuter lors de la connexion, ou pour demander l'utilisation d'un jeu de caractĂšres particulier. Les options de connexion doivent ĂȘtre dĂ©finies avant la connexion au rĂ©seau.

Pour dĂ©finir une option de connexion, l'opĂ©ration de connexion doit ĂȘtre effectuĂ©e en 3 Ă©tapes : crĂ©ation d'un gestionnaire de connexion avec mysqli_init() ou mysqli::__construct(), dĂ©finition des options demandĂ©es en utilisant mysqli::options(), et connexion au rĂ©seau avec mysqli::real_connect().

File d'attente de connexion

L'extension mysqli supporte les connexions persistantes aux bases de donnĂ©es, qui sont des connexions spĂ©ciales. Par dĂ©faut, chaque connexion Ă  une base de donnĂ©es ouverte par un script est soit explicitement close par l'utilisateur durant l'exĂ©cution, ou soit libĂ©rĂ©e automatiquement Ă  la fin du script. Ce n'est pas le cas d'une connexion persistante. En effet, elle sera placĂ©e dans une file d'attente pour une rĂ©-utilisation future, si une connexion au mĂȘme serveur, utilisant le mĂȘme nom d'utilisateur, le mĂȘme mot de passe, le mĂȘme socket, le mĂȘme port, ainsi que la mĂȘme base de donnĂ©es est ouverte. Cette rĂ©-utilisation permet d'allĂ©ger la charge indue par les connexions.

Chaque processus PHP utilise sa propre file d'attente de connexions mysqli. Suivant le modĂšle de dĂ©ploiement du serveur web, un processus PHP peut servir une ou plusieurs requĂȘtes. Toutefois, une connexion mise en file d'attente peut ĂȘtre utilisĂ©e par un ou plusieurs scripts par la suite.

Les connexions persistantes

Si une connexion persistante pour une combinaison d'hĂŽte, de nom d'utilisateur, de mot de passe, de socket, de port et de base de donnĂ©es inutilisĂ©e ne peut ĂȘtre trouvĂ©e dans la file d'attente de connexion, alors mysqli ouvrira une nouvelle connexion. L'utilisation des connexions persistantes peut ĂȘtre activĂ©e ou dĂ©sactivĂ©e en utilisant la directive PHP mysqli.allow_persistent. Le nombre total de connexions ouvertes par un script peut ĂȘtre limitĂ© avec la directive mysqli.max_links. Le nombre maximal de connexions persistantes par processus PHP peut ĂȘtre restreint avec la directive mysqli.max_persistent. Veuillez noter que le serveur web peut engendrer plusieurs processus PHP.

Une plainte courante contre les connexions persistantes est que leur statut n'est pas rĂ©initialisĂ© avant la rĂ©-utilisation. Par exemple, les transactions ouvertes et non terminĂ©es ne sont pas automatiquement annulĂ©es. Mais aussi, les modifications autorisĂ©es survenant entre le moment oĂč la connexion est mise en file d'attente et sa rĂ©-utilisation ne seront pas prises en compte. Ce comportement peut ĂȘtre vu comme un effet de bord non dĂ©sirĂ©. Au contraire, le nom persistent peut ĂȘtre compris comme une promesse sur le fait que le statut persiste rĂ©ellement.

L'extension mysqli supporte deux interprĂ©tations d'une connexion persistante : statut persistant, et un statut rĂ©initialisĂ© avant rĂ©-utilisation. Par dĂ©faut, il sera rĂ©initialisĂ©. Avant qu'une connexion persistante ne soit rĂ©utilisĂ©e, l'extension mysqli appelle implicitement la fonction mysqli::change_user() pour rĂ©initialiser le statut. La connexion persistante apparaĂźt Ă  l'utilisateur comme si elle venait juste d'ĂȘtre ouverte. Aucune trace d'une utilisation prĂ©cĂ©dente ne sera visible.

La fonction mysqli::change_user() est une opération couteuse. Pour de meilleures performances, les utilisateurs peuvent vouloir re-compiler l'extension avec le drapeau de compilation MYSQLI_NO_CHANGE_USER_ON_PCONNECT.

Ainsi, il sera laissé à l'utilisateur le choix entre un comportement sécurisé et une performance optimisée. Les deux ont comme but l'optimisation. Pour une utilisation plus simple, le comportement sécurisé a été placé par défaut au détriment d'une performance maximale.

Voir aussi

add a note

User Contributed Notes 2 notes

up
0
sdfjsdfjsd at gmail dot com ¶
18 days ago
<?php
// Database credentials
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";

// 1. Create database connection
$conn = new mysqli($servername, $username, $password, $dbname);

// 2. Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully.<br><br>";

// Recommendation: Set character set to UTF-8 (for proper special character rendering)
$conn->set_charset("utf8mb4");

// ==========================================
// EXAMPLE 1: Inserting data into the database (INSERT)
// ==========================================
// Assuming you have a 'users' table with 'first_name', 'last_name', and 'email' columns
$sql_insert = "INSERT INTO users (first_name, last_name, email) 
               VALUES ('John', 'Doe', 'john.doe@example.com')";

if ($conn->query($sql_insert) === TRUE) {
    // Get the ID of the last inserted row
    $last_id = $conn->insert_id;
    echo "✅ New record created successfully. The ID of the new user is: " . $last_id . "<br><br>";
} else {
    echo "❌ Error inserting data: " . $conn->error . "<br><br>";
}

echo "<hr>";

// ==========================================
// EXAMPLE 2: Reading data from the database (SELECT)
// ==========================================
$sql_select = "SELECT id, first_name, last_name FROM users";
$result = $conn->query($sql_select);

// Check if the query returned any rows
if ($result->num_rows > 0) {
    echo "<strong>User List:</strong><br>";
    // Loop through the results row by row using a while loop
    while($row = $result->fetch_assoc()) {
        echo "ID: " . $row["id"] . " | Name: " . $row["first_name"] . " " . $row["last_name"] . "<br>";
    }
} else {
    echo "No records found in the database.";
}

// 3. Close the connection
// It is good practice to close the connection at the end of the script
$conn->close();
?>
up
0
gemik850 at gmail dot com ¶
18 days ago
<?php
// Database credentials
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";

// 1. Create database connection
$conn = mysqli_connect($servername, $username, $password, $dbname);

// 2. Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully.<br><br>";

// Recommendation: Set character set to UTF-8 (for proper special character rendering)
mysqli_set_charset($conn, "utf8mb4");

// ==========================================
// EXAMPLE 1: Inserting data into the database (INSERT)
// ==========================================
// Assuming you have a 'users' table with 'first_name', 'last_name', and 'email' columns
$sql_insert = "INSERT INTO users (first_name, last_name, email) 
               VALUES ('John', 'Doe', 'john.doe@example.com')";

if (mysqli_query($conn, $sql_insert)) {
    // Get the ID of the last inserted row
    $last_id = mysqli_insert_id($conn);
    echo "✅ New record created successfully. The ID of the new user is: " . $last_id . "<br><br>";
} else {
    echo "❌ Error inserting data: " . mysqli_error($conn) . "<br><br>";
}

echo "<hr>";

// ==========================================
// EXAMPLE 2: Reading data from the database (SELECT)
// ==========================================
$sql_select = "SELECT id, first_name, last_name FROM users";
$result = mysqli_query($conn, $sql_select);

// Check if the query returned any rows
if (mysqli_num_rows($result) > 0) {
    echo "<strong>User List:</strong><br>";
    // Loop through the results row by row using a while loop
    while($row = mysqli_fetch_assoc($result)) {
        echo "ID: " . $row["id"] . " | Name: " . $row["first_name"] . " " . $row["last_name"] . "<br>";
    }
} else {
    echo "No records found in the database.";
}

// 3. Close the connection
// It is good practice to close the connection at the end of the script
mysqli_close($conn);
?>