Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment convertir un script utilisant les fonctions mysql_ pour utiliser les fonctions mysqli_ ?

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);
    }
}