sql >> Databasteknik >  >> RDS >> Mysql

Hur konverterar jag ett skript med mysql_-funktioner till att använda mysqli_-funktioner?

Obs! Konverterar från mysql_ till mysqli_ kanske inte är optimalt. Överväg PDO om du är beredd att konvertera all din kod till OOP .

Det kan vara frestande att försöka ersätta alla instanser av mysql_ med mysqli_ och be att det fungerar. Du skulle vara nära men inte riktigt på punkt.

Ansluter till databasen:

Lyckligtvis, mysqli_connect fungerar tillräckligt nära för att mysql_query att du bara kan byta ut deras funktionsnamn.

mysql_:

$con = mysql_connect($host, $username, $password);

mysqli_:

$con = mysqli_connect($host, $username, $password);

Välja en databas

Nu, med de flesta andra funktioner i mysqli_ biblioteket måste du skicka mysqli_select_db databasanslutningen som dess första parameter. De flesta av mysqli_ funktioner kräver anslutningsobjektet först.

För den här funktionen kan du bara byta ordning på argumenten du skickar till funktionen. Om du inte skickade det ett anslutningsobjekt tidigare måste du lägga till det som första parameter nu.

mysql_:

mysql_select_db($dbname, $con);

mysqli_:

mysqli_select_db($con, $dbname);

Som en bonus kan du även skicka databasnamnet som den fjärde parametern till mysqli_connect - kringgå behovet av att anropa mysqli_select_db .

$con = mysqli_connect($host, $username, $password, $dbname);

Sanera användarinmatning

Använder mysqli_real_escape_string är mycket lik mysql_real_escape_string . Du behöver bara skicka anslutningsobjektet som den första parametern.

mysql_:

$value1 = mysql_real_escape_string($input_string);

mysqli_:

$value1 = mysqli_real_escape_string($con, $input_string);

Mycket viktigt:Förbereda och köra en fråga

En anledning till mysql_ funktioner föråldrades till att börja med var deras oförmåga att hantera förberedda uttalanden. Om du bara konverterar din kod till mysqli_ utan att ta detta viktiga steg är du utsatt för några av de största svagheterna i mysql_ funktioner.

Det är värt att läsa dessa artiklar om förberedda uttalanden och deras fördelar:

Wikipedia - Förberedda uttalanden

PHP.net - MySQLi Prepared Statements

Obs! När du använder förberedda satser är det bäst att explicit lista varje kolumn du försöker fråga, istället för att använda * notation för att fråga alla kolumner. På så sätt kan du säkerställa att du har tagit hänsyn till alla kolumner i ditt anrop till 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);
}

Visar fel

Att visa fel fungerar lite annorlunda med mysqli_ . mysqli_error kräver anslutningsobjektet som dess första parameter. Men vad händer om anslutningen misslyckades? mysqli_ introducerar en liten uppsättning funktioner som inte kräver anslutningsobjektet:mysqli_connect_* funktioner.

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


  1. DATEDIFF() eller BETWEEN för datumintervall i SQL-frågor

  2. Oracle.DataAccess.dll kan inte hittas även om det finns

  3. åtkomst nekad för användare @ 'localhost' till databasen ''

  4. laravel databasanslutning returnerar odefinierat indexfel