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