Lưu ý: Chuyển đổi từ mysql_
tới mysqli_
có thể không tối ưu. Xem xét PDO
nếu bạn chuẩn bị chuyển đổi tất cả mã của mình thành OOP
.
Có thể rất hấp dẫn khi cố gắng thay thế tất cả các phiên bản của mysql_
với mysqli_
và cầu nguyện nó hoạt động. Bạn sẽ gần gũi nhưng không hoàn toàn đúng.
Kết nối với cơ sở dữ liệu:
May mắn thay, mysqli_connect
hoạt động đủ chặt chẽ để mysql_query
mà bạn có thể hoán đổi tên chức năng của chúng.
mysql_:
$con = mysql_connect($host, $username, $password);
mysqli_:
$con = mysqli_connect($host, $username, $password);
Chọn cơ sở dữ liệu
Bây giờ, với hầu hết các chức năng khác trong mysqli_
thư viện, bạn sẽ cần chuyển mysqli_select_db
kết nối cơ sở dữ liệu là đầu tiên của nó tham số. Hầu hết mysqli_
các chức năng yêu cầu đối tượng kết nối trước.
Đối với hàm này, bạn chỉ có thể chuyển thứ tự của các đối số mà bạn truyền cho hàm. Nếu trước đây bạn không chuyển nó một đối tượng kết nối, thì bạn phải thêm nó làm tham số đầu tiên ngay bây giờ.
mysql_:
mysql_select_db($dbname, $con);
mysqli_:
mysqli_select_db($con, $dbname);
Như một phần thưởng, bạn cũng có thể chuyển tên cơ sở dữ liệu làm tham số thứ tư cho mysqli_connect
- bỏ qua nhu cầu gọi mysqli_select_db
.
$con = mysqli_connect($host, $username, $password, $dbname);
Vệ sinh thông tin nhập của người dùng
Sử dụng mysqli_real_escape_string
rất giống với mysql_real_escape_string
. Bạn chỉ cần truyền đối tượng kết nối làm tham số đầu tiên.
mysql_:
$value1 = mysql_real_escape_string($input_string);
mysqli_:
$value1 = mysqli_real_escape_string($con, $input_string);
Rất quan trọng:Chuẩn bị và Chạy Truy vấn
Một lý do khiến mysql_
ban đầu các hàm không được dùng nữa là do chúng không có khả năng xử lý các câu lệnh đã chuẩn bị. Nếu bạn chỉ chuyển đổi mã của mình thành mysqli_
nếu không thực hiện bước quan trọng này, bạn phải đối mặt với một số điểm yếu lớn nhất của mysql_
chức năng.
Bạn nên đọc các bài viết này về các tuyên bố đã chuẩn bị trước và lợi ích của chúng:
PHP.net - Câu lệnh chuẩn bị trước của MySQL
Lưu ý:Khi sử dụng các câu lệnh đã chuẩn bị, tốt nhất nên liệt kê rõ ràng từng cột mà bạn đang cố gắng truy vấn, thay vì sử dụng *
ký hiệu để truy vấn tất cả các cột. Bằng cách này, bạn có thể đảm bảo rằng bạn đã tính đến tất cả các cột trong lệnh gọi đến 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);
}
Hiển thị lỗi
Hiển thị lỗi hoạt động hơi khác với mysqli_
. mysqli_error
yêu cầu đối tượng kết nối làm tham số đầu tiên của nó. Nhưng nếu kết nối không thành công thì sao? mysqli_
giới thiệu một tập hợp nhỏ các hàm không yêu cầu đối tượng kết nối: mysqli_connect_*
các chức năng.
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);
}
}