Uwaga: Konwersja z mysql_ do mysqli_
może nie być optymalna. Rozważ PDO
jeśli jesteś przygotowany do konwersji całego kodu na OOP
.
Może być kusząca próba zastąpienia wszystkich wystąpień mysql_ z mysqli_ i módlcie się, żeby to działało. Byłbyś blisko, ale nie do końca na miejscu.
Łączenie z bazą danych:
Na szczęście mysqli_connect
działa wystarczająco blisko, aby mysql_query że możesz po prostu zamienić ich nazwy funkcji.
mysql_:
$con = mysql_connect($host, $username, $password);
mysqli_:
$con = mysqli_connect($host, $username, $password);
Wybieranie bazy danych
Teraz, z większością innych funkcji w mysqli_ bibliotekę, musisz przekazać mysqli_select_db połączenie z bazą danych jako pierwsze parametr. Większość mysqli_ funkcje wymagają najpierw obiektu połączenia.
W przypadku tej funkcji możesz po prostu zmienić kolejność argumentów, które przekazujesz do funkcji. Jeśli wcześniej nie przekazałeś mu obiektu połączenia, musisz teraz dodać go jako pierwszy parametr.
mysql_:
mysql_select_db($dbname, $con);
mysqli_:
mysqli_select_db($con, $dbname);
Jako bonus możesz również przekazać nazwę bazy danych jako czwarty parametr do mysqli_connect - ominięcie konieczności wywoływania mysqli_select_db .
$con = mysqli_connect($host, $username, $password, $dbname);
Oczyść dane wejściowe użytkownika
Korzystanie z mysqli_real_escape_string jest bardzo podobny do mysql_real_escape_string . Wystarczy przekazać obiekt połączenia jako pierwszy parametr.
mysql_:
$value1 = mysql_real_escape_string($input_string);
mysqli_:
$value1 = mysqli_real_escape_string($con, $input_string);
Bardzo ważne:przygotowywanie i uruchamianie zapytania
Jednym z powodów mysql_ funkcje były przestarzałe, na początku była ich niezdolność do obsługi przygotowanych instrukcji. Jeśli po prostu przekonwertujesz kod do mysqli_ bez podjęcia tego ważnego kroku, jesteś narażony na niektóre z największych słabości mysql_ Funkcje.
Warto przeczytać te artykuły na temat przygotowanych zestawień i ich korzyści:
Wikipedia – Przygotowane oświadczenia
PHP.net - Przygotowane oświadczenia MySQLi
Uwaga:podczas korzystania z przygotowanych instrukcji najlepiej jest jawnie wymienić każdą kolumnę, do której próbujesz wykonać zapytanie, zamiast używać * notacja do zapytania wszystkich kolumn. W ten sposób możesz mieć pewność, że uwzględniłeś wszystkie kolumny w wywołaniu 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);
}
Wyświetlanie błędów
Wyświetlanie błędów działa trochę inaczej z mysqli_ . mysqli_error
wymaga obiektu połączenia jako pierwszego parametru. Ale co, jeśli połączenie się nie powiedzie? mysqli_ wprowadza mały zestaw funkcji, które nie wymagają obiektu połączenia:mysqli_connect_*
funkcje.
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);
}
}