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