Забележка: Преобразуване от mysql_
към mysqli_
може да не е оптимално. Помислете за PDO
ако сте готови да конвертирате целия си код в OOP
.
Може да бъде изкушаващо да се опитате да замените всички екземпляри на mysql_
с mysqli_
и се моли да работи. Ще бъдеш близо, но не съвсем на място.
Свързване с базата данни:
За щастие, mysqli_connect
работи достатъчно тясно за mysql_query
че можете просто да смените имената на техните функции.
mysql_:
$con = mysql_connect($host, $username, $password);
mysqli_:
$con = mysqli_connect($host, $username, $password);
Избор на база данни
Сега, с повечето други функции в mysqli_
библиотека, ще трябва да предадете mysqli_select_db
връзката с базата данни като нейпърва параметър. Повечето от mysqli_
функции изискват първо обекта на свързване.
За тази функция можете просто да превключите реда на аргументите, които предавате на функцията. Ако не сте му предавали обект за връзка преди, трябва да го добавите като първи параметър сега.
mysql_:
mysql_select_db($dbname, $con);
mysqli_:
mysqli_select_db($con, $dbname);
Като бонус можете също да подадете името на базата данни като четвърти параметър на mysqli_connect
- заобикаляне на необходимостта от извикване на mysqli_select_db
.
$con = mysqli_connect($host, $username, $password, $dbname);
Почистете въведеното от потребителя
Използване на mysqli_real_escape_string
е много подобен на mysql_real_escape_string
. Просто трябва да предадете обекта на връзката като първи параметър.
mysql_:
$value1 = mysql_real_escape_string($input_string);
mysqli_:
$value1 = mysqli_real_escape_string($con, $input_string);
Много важно:Подготовка и изпълнение на заявка
Една от причините mysql_
функциите бяха отхвърлени в началото с неспособността им да обработват подготвени изявления. Ако просто конвертирате кода си в mysqli_
без да предприемете тази важна стъпка, вие сте обект на някои от най-големите слабости на mysql_
функции.
Струва си да прочетете тези статии за подготвените изявления и техните предимства:
Уикипедия – Подготвени изявления
PHP.net - MySQLi подготвени изявления
Забележка:Когато използвате подготвени изрази, най-добре е изрично да посочите всяка колона, която се опитвате да направите заявка, вместо да използвате *
нотация за запитване на всички колони. По този начин можете да сте сигурни, че сте отчитали всички колони във вашето обаждане до 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);
}
Показване на грешки
Показването на грешки работи малко по-различно с mysqli_
. mysqli_error
изисква обекта на връзката като свой първи параметър. Но какво ще стане, ако връзката се провали? mysqli_
въвежда малък набор от функции, които не изискват обекта за връзка:mysqli_connect_*
функции.
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);
}
}