Remarque : Conversion depuis mysql_
à mysqli_
peut ne pas être optimal. Considérez PDO
si vous êtes prêt à convertir tout votre code en OOP
.
Il peut être tentant d'essayer de remplacer toutes les instances de mysql_
avec mysqli_
et priez pour que ça marche. Vous seriez proche mais pas tout à fait sur le point.
Connexion à la base de données :
Heureusement, mysqli_connect
fonctionne assez étroitement pour mysql_query
que vous pouvez simplement échanger leurs noms de fonction.
mysql_ :
$con = mysql_connect($host, $username, $password);
mysqli_ :
$con = mysqli_connect($host, $username, $password);
Sélectionner une base de données
Maintenant, avec la plupart des autres fonctions dans le mysqli_
bibliothèque, vous devrez passer mysqli_select_db
la connexion à la base de données comme première paramètre. La plupart des mysqli_
les fonctions nécessitent d'abord l'objet de connexion.
Pour cette fonction, vous pouvez simplement changer l'ordre des arguments que vous transmettez à la fonction. Si vous ne lui avez pas transmis d'objet de connexion auparavant, vous devez l'ajouter en tant que premier paramètre maintenant.
mysql_ :
mysql_select_db($dbname, $con);
mysqli_ :
mysqli_select_db($con, $dbname);
En bonus, vous pouvez également passer le nom de la base de données comme quatrième paramètre à mysqli_connect
- contournant le besoin d'appeler mysqli_select_db
.
$con = mysqli_connect($host, $username, $password, $dbname);
Nettoyer les entrées de l'utilisateur
Utilisation de mysqli_real_escape_string
est très similaire à mysql_real_escape_string
. Il vous suffit de passer l'objet de connexion comme premier paramètre.
mysql_ :
$value1 = mysql_real_escape_string($input_string);
mysqli_ :
$value1 = mysqli_real_escape_string($con, $input_string);
Très important :Préparation et exécution d'une requête
Une raison pour laquelle mysql_
Les fonctions étaient obsolètes pour commencer était leur incapacité à gérer les instructions préparées. Si vous convertissez simplement votre code en mysqli_
sans franchir cette étape importante, vous êtes sujet à certaines des plus grandes faiblesses de mysql_
les fonctions.
Cela vaut la peine de lire ces articles sur les déclarations préparées et leurs avantages :
Wikipedia - Déclarations préparées
PHP.net - Instructions préparées MySQLi
Remarque :Lorsque vous utilisez des instructions préparées, il est préférable de répertorier explicitement chaque colonne que vous tentez d'interroger, plutôt que d'utiliser le *
notation pour interroger toutes les colonnes. De cette façon, vous pouvez vous assurer que vous avez pris en compte toutes les colonnes dans votre appel à mysqli_stmt_bind_result
.
mysql_ :
$query = 'SELECT * FROM table1 WHERE table1.col1=' . $value1 . '';
$result = mysql_query($query, $con);
while($row = mysql_fetch_assoc*$result)
{
$col1 = $row['col1'];
$col2 = $row['col2'];
echo $col1 . ' ' . $col2 . '<br />';
}
mysqli_ :
$query = 'SELECT col1,col2 FROM table1 WHERE table1.col1=?';
if ($stmt = mysqli_prepare($link, $query)) {
/* pass parameters to query */
mysqli_stmt_bind_param($stmt, "s", $value1);
/* run the query on the database */
mysqli_stmt_execute($stmt);
/* assign variable for each column to store results in */
mysqli_stmt_bind_result($stmt, $col1, $col2);
/* fetch values */
while (mysqli_stmt_fetch($stmt)) {
/*
on each fetch, the values for each column
in the results are automatically stored in
the variables we assigned using
"mysqli_stmt_bind_result"
*/
echo $col1 . ' ' . $col2 . '<br />';
}
/* close statement */
mysqli_stmt_close($stmt);
}
Afficher les erreurs
L'affichage des erreurs fonctionne un peu différemment avec mysqli_
. mysqli_error
requiert l'objet de connexion comme premier paramètre. Mais que se passe-t-il si la connexion échoue ? mysqli_
introduit un petit ensemble de fonctions qui ne nécessitent pas l'objet de connexion :le mysqli_connect_*
fonctions.
mysql_ :
if (!$con) {
die('Could not connect: ' . mysql_error());
}
if (!$result) {
die('SQL Error: ' . mysql_error());
}
mysqli_ :
/* check connection error*/
if (mysqli_connect_errno()) {
die( 'Could not connect: ' . mysqli_connect_error() );
}
/* check query error */
if ($stmt = mysqli_prepare($link, $query)) {
// ... execute query
if (mysqli_stmt_error($stmt)) {
echo 'SQL Error: ' . mysqli_stmt_error($stmt);
}
}