Bemærk: Konvertering fra mysql_
til mysqli_
er måske ikke optimalt. Overvej BOB
hvis du er parat til at konvertere al din kode til OOP
.
Det kan være fristende at prøve at erstatte alle forekomster af mysql_
med mysqli_
og bed om at det virker. Du ville være tæt på, men ikke helt på punkt.
Opretter forbindelse til databasen:
Heldigvis mysqli_connect
arbejder tæt nok til mysql_query
at du bare kan bytte deres funktionsnavne ud.
mysql_:
$con = mysql_connect($host, $username, $password);
mysqli_:
$con = mysqli_connect($host, $username, $password);
Valg af en database
Nu med de fleste af de andre funktioner i mysqli_
bibliotek, skal du sende mysqli_select_db
databaseforbindelsen som dens første parameter. Det meste af mysqli_
funktioner kræver forbindelsesobjektet først.
For denne funktion kan du bare skifte rækkefølgen af de argumenter, du sender til funktionen. Hvis du ikke har givet det et forbindelsesobjekt før, skal du tilføje det som den første parameter nu.
mysql_:
mysql_select_db($dbname, $con);
mysqli_:
mysqli_select_db($con, $dbname);
Som en bonus kan du også videregive databasenavnet som den fjerde parameter til mysqli_connect
- omgå behovet for at kalde mysqli_select_db
.
$con = mysqli_connect($host, $username, $password, $dbname);
Desinficer brugerinput
Brug af mysqli_real_escape_string
er meget lig mysql_real_escape_string
. Du skal blot sende forbindelsesobjektet som den første parameter.
mysql_:
$value1 = mysql_real_escape_string($input_string);
mysqli_:
$value1 = mysqli_real_escape_string($con, $input_string);
Meget vigtigt:Forberedelse og kørsel af en forespørgsel
En grund til mysql_
funktioner blev forældet til at begynde med var deres manglende evne til at håndtere forberedte udsagn. Hvis du blot konverterer din kode til mysqli_
uden at tage dette vigtige skridt, er du underlagt nogle af de største svagheder ved mysql_
funktioner.
Det er værd at læse disse artikler om udarbejdede udsagn og deres fordele:
Wikipedia - Forberedte erklæringer
PHP.net - MySQLi Prepared Statements
Bemærk:Når du bruger forberedte sætninger, er det bedst at angive hver kolonne, du forsøger at forespørge på, i stedet for at bruge *
notation for at forespørge alle kolonner. På denne måde kan du sikre dig, at du har taget højde for alle kolonnerne i dit opkald til 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);
}
Viser fejl
Visning af fejl fungerer lidt anderledes med mysqli_
. mysqli_error
kræver forbindelsesobjektet som dets første parameter. Men hvad hvis forbindelsen mislykkedes? mysqli_
introducerer et lille sæt funktioner, der ikke kræver forbindelsesobjektet: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);
}
}