Helpex - Trao đổi & giúp đỡ Đăng nhập
39

Tôi cần trợ giúp để kiểm tra xem một hàng có tồn tại trong cơ sở dữ liệu hay không. Trong trường hợp của tôi, hàng đó chứa địa chỉ email. Tôi nhận được kết quả:

email no longer exists publisher@example.com

Đây là mã tôi hiện đang sử dụng:

if (count($_POST)) {
    $email = $dbl->real_escape_string(trim(strip_tags($_POST['email'])));

    $query = "SELECT `email` FROM `tblUser` WHERE `email` = '$email'";
    $result = mysqli_query($dbl, $query);
    if (is_resource($result) && mysqli_num_rows($result) == 1) {
        $row = mysqli_fetch_assoc($result);
        echo $email . " email exists " .  $row["email"] . "\n";
    } else {
        echo "email no longer exists" . $email . "\n";
    }
}

Có cách nào tốt hơn để kiểm tra xem một hàng có tồn tại trong MySQL không (trong trường hợp của tôi, hãy kiểm tra xem email có tồn tại trong MySQL hay không)?

39 hữu ích 4 bình luận 110k xem chia sẻ
68

Sau đây là các phương pháp đã thử, đã thử nghiệm và đã được chứng minh để kiểm tra xem hàng có tồn tại hay không.

(Một số trong số đó tôi sử dụng bản thân hoặc đã sử dụng trong quá khứ).

Chỉnh sửa: Tôi đã mắc lỗi cú pháp trước đây trong đó tôi đã sử dụng mysqli_query()hai lần. Vui lòng tham khảo (các) bản sửa đổi.

I E:

if (!mysqli_query($con,$query))mà lẽ ra chỉ cần đọc là if (!$query).

  • Tôi xin lỗi vì đã bỏ qua sai lầm đó.

Lưu ý bên: Cả hai '".$var."''$var'làm điều tương tự. Bạn có thể sử dụng một trong hai, cả hai đều là cú pháp hợp lệ.

Đây là hai truy vấn đã chỉnh sửa:

$query = mysqli_query($con, "SELECT * FROM emails WHERE email='".$email."'");

    if (!$query)
    {
        die('Error: ' . mysqli_error($con));
    }

if(mysqli_num_rows($query) > 0){

    echo "email already exists";

}else{

    // do something

}

và trong trường hợp của bạn:

$query = mysqli_query($dbl, "SELECT * FROM `tblUser` WHERE email='".$email."'");

    if (!$query)
    {
        die('Error: ' . mysqli_error($dbl));
    }

if(mysqli_num_rows($query) > 0){

    echo "email already exists";

}else{

    // do something

}

Bạn cũng có thể sử dụng mysqli_với một phương pháp câu lệnh chuẩn bị :

$query = "SELECT `email` FROM `tblUser` WHERE email=?";

if ($stmt = $dbl->prepare($query)){

        $stmt->bind_param("s", $email);

        if($stmt->execute()){
            $stmt->store_result();

            $email_check= "";         
            $stmt->bind_result($email_check);
            $stmt->fetch();

            if ($stmt->num_rows == 1){

            echo "That Email already exists.";
            exit;

            }
        }
    }

Hoặc phương pháp PDO với câu lệnh đã chuẩn bị :

<?php
$email = $_POST['email'];

$mysql_hostname = 'xxx';
$mysql_username = 'xxx';
$mysql_password = 'xxx';
$mysql_dbname = 'xxx';

try {
$conn= new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password); 
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
     exit( $e->getMessage() );
}

// assuming a named submit button
if(isset($_POST['submit']))
    {

        try {
            $stmt = $conn->prepare('SELECT `email` FROM `tblUser` WHERE email = ?');
            $stmt->bindParam(1, $_POST['email']); 
            $stmt->execute();
            while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {

            }
        }
        catch(PDOException $e) {
            echo 'ERROR: ' . $e->getMessage();
        }

    if($stmt->rowCount() > 0){
        echo "The record exists!";
    } else {
        echo "The record is non-existant.";
    }


    }
?>
  • Tốt nhất nên sử dụng các câu lệnh chuẩn bị để giúp bảo vệ chống lại việc chèn SQL.

NB:

Khi xử lý biểu mẫu và mảng POST như được sử dụng / nêu ở trên, hãy đảm bảo rằng mảng POST chứa các giá trị, phương thức POST được sử dụng cho biểu mẫu và khớp các thuộc tính được đặt tên cho các đầu vào.

  • FYI: Các biểu mẫu được mặc định thành phương thức GET nếu không được hướng dẫn rõ ràng.

Lưu ý: <input type = "text" name = "var">- $_POST['var']phù hợp. $_POST['Var']không có trận đấu.

  • Mảng POST phân biệt chữ hoa chữ thường.

Tham khảo ý kiến:

Lỗi khi kiểm tra tham chiếu:

Xin lưu ý rằng các API MySQL không trộn lẫn với nhau, trong trường hợp bạn có thể đang truy cập phần Hỏi & Đáp này và bạn đang sử dụng mysql_để kết nối với (và truy vấn với).

  • Bạn phải sử dụng cùng một từ kết nối đến truy vấn.

Tham khảo những điều sau về điều này:

Nếu bạn đang sử dụng mysql_API và không có lựa chọn nào để làm việc với nó, hãy tham khảo phần Hỏi và Đáp sau trên Stack:

Các mysql_*hàm không được dùng nữa và sẽ bị xóa khỏi các bản phát hành PHP trong tương lai.

  • Đã đến lúc bước sang thế kỷ 21.

Bạn cũng có thể thêm ràng buộc DUY NHẤT vào (a) hàng.

Người giới thiệu:

68 hữu ích 5 bình luận chia sẻ
7

Bạn phải thực hiện truy vấn của mình và thêm một trích dẫn duy nhất vào email $ trong truy vấn vì nó là một chuỗi và xóa is_resource($query)truy vấn $ là một chuỗi, kết quả $ sẽ là tài nguyên

$query = "SELECT `email` FROM `tblUser` WHERE `email` = '$email'";
$result = mysqli_query($link,$query); //$link is the connection

if(mysqli_num_rows($result) > 0 ){....}

CẬP NHẬT

Căn cứ vào bản chỉnh sửa của bạn chỉ cần thay đổi:

if(is_resource($query) && mysqli_num_rows($query) > 0 ){
        $query = mysqli_fetch_assoc($query);
        echo $email . " email exists " .  $query["email"] . "\n";

Bởi

if(is_resource($result) && mysqli_num_rows($result) == 1 ){
        $row = mysqli_fetch_assoc($result);
         echo $email . " email exists " .  $row["email"] . "\n";

và bạn sẽ ổn thôi

CẬP NHẬT 2

Một cách tốt hơn nên có Thủ tục lưu trữ thực thi SQL sau đây chuyển Email dưới dạng Tham số

SELECT IF( EXISTS (
                  SELECT *
                  FROM `Table`
                  WHERE `email` = @Email)
          , 1, 0) as `Exist`

và lấy giá trị trong php

Pseudocodigo:

 $query = Call MYSQL_SP($EMAIL);
 $result = mysqli_query($conn,$query);
 $row = mysqli_fetch_array($result)
 $exist = ($row['Exist']==1)? 'the email exist' : 'the email doesnt exist';
7 hữu ích 5 bình luận chia sẻ
3

Sau khi xác thực và trước khi CHÈN, hãy kiểm tra xem tên người dùng đã tồn tại hay chưa bằng cách sử dụng mysqli (thủ tục). Những công việc này:

//check if username already exists
       include 'phpscript/connect.php'; //connect to your database

       $sql = "SELECT username FROM users WHERE username = '$username'";
       $result = $conn->query($sql);

       if($result->num_rows > 0) {
           $usernameErr =  "username already taken"; //takes'em back to form
       } else { // go on to INSERT new record
3 hữu ích 1 bình luận chia sẻ
3

Có nhiều cách để kiểm tra xem một giá trị có tồn tại trong cơ sở dữ liệu hay không. Hãy để tôi chứng minh cách điều này có thể được thực hiện đúng với PDO và mysqli.

PDO

PDO là tùy chọn đơn giản hơn. Để tìm hiểu xem một giá trị có tồn tại trong cơ sở dữ liệu hay không, bạn có thể sử dụng câu lệnh đã chuẩn bị và fetchColumn(). Không cần tìm nạp bất kỳ dữ liệu nào vì vậy chúng tôi sẽ chỉ tìm nạp 1nếu giá trị tồn tại.

<?php

// Connection code. 
$options = [
    \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_EMULATE_PREPARES   => false,
];
$pdo = new \PDO('mysql:host=localhost;port=3306;dbname=test;charset=utf8mb4', 'testuser', 'password', $options);

// Prepared statement
$stmt = $pdo->prepare('SELECT 1 FROM tblUser WHERE email=?');
$stmt->execute([$_POST['email']]);
$exists = $stmt->fetchColumn(); // either 1 or null

if ($exists) {
    echo 'Email exists in the database.';
} else {
    // email doesn't exist yet
}

Để biết thêm các ví dụ, hãy xem: Làm thế nào để kiểm tra xem email có tồn tại trong cơ sở dữ liệu hay không?

MySQLi

Như mọi khi, mysqli cồng kềnh hơn và hạn chế hơn một chút, nhưng chúng ta có thể làm theo một cách tiếp cận tương tự với câu lệnh đã chuẩn bị.

<?php

// Connection code
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new \mysqli('localhost', 'testuser', 'password', 'test');
$mysqli->set_charset('utf8mb4');

// Prepared statement
$stmt = $mysqli->prepare('SELECT 1 FROM tblUser WHERE email=?');
$stmt->bind_param('s', $_POST['email']);
$stmt->execute();
$exists = (bool) $stmt->get_result()->fetch_row(); // Get the first row from result and cast to boolean

if ($exists) {
    echo 'Email exists in the database.';
} else {
    // email doesn't exist yet
}

Thay vì truyền hàng kết quả (thậm chí có thể không tồn tại) thành boolean, bạn cũng có thể tìm nạp COUNT(1)và đọc mục đầu tiên từ hàng đầu tiên bằng cách sử dụngfetch_row()[0]

Để biết thêm ví dụ, hãy xem: Cách kiểm tra xem một giá trị có tồn tại trong cơ sở dữ liệu hay không bằng cách sử dụng các câu lệnh được chuẩn bị sẵn mysqli

Nhận xét nhỏ

  • Nếu ai đó gợi ý bạn sử dụng mysqli_num_rows(), đừng nghe họ. Đây là một cách tiếp cận rất tồi và có thể dẫn đến các vấn đề về hiệu suất nếu sử dụng sai.
  • Không sử dụng real_escape_string(). Điều này không có nghĩa là được sử dụng như một biện pháp bảo vệ chống lại SQL injection. Nếu bạn sử dụng các câu lệnh đã chuẩn bị một cách chính xác, bạn không cần phải lo lắng về bất kỳ sự thoát nào.
  • Nếu bạn muốn kiểm tra xem một hàng có tồn tại trong cơ sở dữ liệu hay không trước khi bạn cố gắng chèn một hàng mới, thì tốt hơn là không nên sử dụng phương pháp này. Tốt hơn là tạo một khóa duy nhất trong cơ sở dữ liệu và để nó đưa ra một ngoại lệ nếu tồn tại một giá trị trùng lặp.
3 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ php mysql mysqli pdo , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading