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