Một truy vấn có thể không thành công vì nhiều lý do khác nhau, trong trường hợp đó, cả mysql_ * và tiện ích mở rộng mysqli sẽ trả về false
từ các hàm / phương thức truy vấn tương ứng của chúng. Bạn cần kiểm tra tình trạng lỗi đó và xử lý nó cho phù hợp.
LƯU Ý Các hàm mysql_ không được dùng nữa và đã bị loại bỏ trong phiên bản php 7.
Kiểm tra $result
trước khi chuyển nó tới mysql_fetch_array
. Bạn sẽ thấy rằng nó false
bởi vì truy vấn không thành công. Xem mysql_query
tài liệu cho các giá trị trả lại có thể có và đề xuất về cách đối phó với chúng.
$username = mysql_real_escape_string($_POST['username']);
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
if($result === FALSE) {
die(mysql_error()); // TODO: better error handling
}
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
tiện ích mở rộng mysqli
phong cách thủ tục :
$username = mysqli_real_escape_string($mysqli, $_POST['username']);
$result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'");
// mysqli_query returns false if something went wrong with the query
if($result === FALSE) {
yourErrorHandler(mysqli_error($mysqli));
}
else {
// as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
foreach( $result as $row ) {
...
oo-style :
$username = $mysqli->escape_string($_POST['username']);
$result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'");
if($result === FALSE) {
yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else {
// as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
foreach( $result as $row ) {
...
sử dụng một tuyên bố đã chuẩn bị:
$stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?');
if ( !$stmt ) {
yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else if ( !$stmt->bind_param('s', $_POST['username']) ) {
yourErrorHandler($stmt->error); // or $stmt->error_list
}
else if ( !$stmt->execute() ) {
yourErrorHandler($stmt->error); // or $stmt->error_list
}
else {
$result = $stmt->get_result();
// as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
foreach( $result as $row ) {
...
Những ví dụ này chỉ minh họa cái gì nên được thực hiện (xử lý lỗi), chứ không phải làm như thế nào. Mã sản xuất không được sử dụng or die
khi xuất ra HTML, nếu không nó sẽ (ít nhất) tạo ra HTML không hợp lệ. Ngoài ra, thông báo lỗi cơ sở dữ liệu sẽ không được hiển thị cho người dùng không phải quản trị viên vì nó tiết lộ quá nhiều thông tin
.