MySQL kiểm tra nếu một bảng tồn tại mà không ném ngoại lệ


123

Cách tốt nhất để kiểm tra xem một bảng có tồn tại trong MySQL (tốt nhất là thông qua PDO trong PHP) mà không đưa ra một ngoại lệ. Tôi không cảm thấy muốn phân tích kết quả của "HIỂN THỊ BẢNG THÍCH" et cetera. Phải có một số loại truy vấn boolean?

Câu trả lời:


199

Tôi không biết cú pháp PDO cho nó, nhưng điều này có vẻ khá đơn giản:

$result = mysql_query("SHOW TABLES LIKE 'myTable'");
$tableExists = mysql_num_rows($result) > 0;

cảm ơn, hoàn toàn quên rằng SHOW TABLES THÍCH chỉ có thể được giới hạn trong một bảng chính xác
bấm vào

53
PDO: $ tableExists = $ db-> truy vấn ("HIỂN THỊ BẢNG THÍCH 'myTable'") -> rowCount ()> 0;
Phản ứng

4
mysqli: if ($ db-> truy vấn ("HIỂN THỊ BẢNG THÍCH 'myTable'") -> num_rows == 0) {// tạo bảng}
zPuls3

1
@MathewFoscarini, rowCount () có thể không đáng tin cậy trong trường hợp này, xem tài liệu PHP .
datan.io

4
Không còn hỗ trợ cho các mysql_*chức năng, chúng không còn chính thức , không còn được duy trì và sẽ bị xóa trong tương lai. Bạn nên cập nhật mã của mình với PDO hoặc MySQLi để đảm bảo chức năng của dự án trong tương lai.
TRiG

39

Nếu bạn đang sử dụng MySQL 5.0 trở lên, bạn có thể thử:

SELECT COUNT(*)
FROM information_schema.tables 
WHERE table_schema = '[database name]' 
AND table_name = '[table name]';

Bất kỳ kết quả chỉ ra bảng tồn tại.

Từ: http://www.electrictoolbox.com/check-if-mysql-table-exists/


có thể tôi đang thiếu một cái gì đó, nhưng tại sao bạn lại sử dụng phương pháp này trên SHOW TABLES?
nickf

1
@nickf Đó là một phần của tiêu chuẩn ansi, vì vậy nó có thể di động giữa các rdbms khác nhau.
troelskn

@nickf: Nó cũng hoạt động trên các cơ sở dữ liệu khác ngoài MySQL. Điều này bao gồm PostgreSQL và SQL Server theo như tôi có thể nói.
Powerlord

tự hỏi liệu đây có phải là một khai thác bảo mật hay không, bạn có thể truy vấn thông tin từ cơ sở dữ liệu mà bạn không kết nối với ...
Talvi Watia

3
Không có rủi ro bảo mật - Truy vấn cơ sở dữ liệu information_schema sẽ chỉ hiển thị các bảng mà người dùng được kết nối có đặc quyền.
Warren Rumak

8

Sử dụng mysqli tôi đã tạo ra chức năng sau đây. Giả sử bạn có một ví dụ mysqli gọi là $ con.

function table_exist($table){
    global $con;
    $table = $con->real_escape_string($table);
    $sql = "show tables like '".$table."'";
    $res = $con->query($sql);
    return ($res->num_rows > 0);
}

Hy vọng nó giúp.

Cảnh báo: khi được @jcaron kiểm tra, chức năng này có thể dễ bị tấn công bởi các biểu đồ vuông, vì vậy hãy đảm bảo $tablevar của bạn sạch sẽ hoặc thậm chí sử dụng các truy vấn được tham số hóa tốt hơn.


Chỉ khi bạn để ai đó điền vào bảng $ var, không phải mọi var trong statment sql đều nguy hiểm, chỉ khi bạn lấy dữ liệu từ các nguồn không đáng tin cậy. Tất nhiên bạn chịu trách nhiệm về cách bạn sử dụng chức năng và thực hiện việc lọc. không cần phải đánh giá thấp câu trả lời này
Falk

Nếu bạn xuất bản mã như thế này, một người nào đó sẽ kết thúc việc sử dụng nó ở một nơi mà dữ liệu chưa được kiểm tra chính xác và sẽ kết thúc bằng việc tiêm SQL. Chỉ cần sử dụng các yêu cầu được tham số hóa, và bạn sẽ tránh được bất kỳ vấn đề nào, cho dù dữ liệu đã được kiểm tra hay chưa. Không có lý do gì để không làm như vậy ở đây, đó chỉ là thực hành tồi.
jcaron

Làm thế nào về việc thêm một real_escape_opes?
Falk

Sử dụng các truy vấn tham số và tránh những câu chuyện kinh dị.
jcaron

4

Điều này được đăng đơn giản nếu bất cứ ai đến tìm câu hỏi này. Mặc dù nó đã được trả lời một chút. Một số câu trả lời làm cho nó phức tạp hơn mức cần thiết.

Đối với mysql * Tôi đã sử dụng:

if (mysqli_num_rows(
    mysqli_query(
                    $con,"SHOW TABLES LIKE '" . $table . "'")
                ) > 0
        or die ("No table set")
    ){

Trong PDO tôi đã sử dụng:

if ($con->query(
                   "SHOW TABLES LIKE '" . $table . "'"
               )->rowCount() > 0
        or die("No table set")
   ){

Với điều này tôi chỉ cần đẩy các điều kiện khác vào hoặc. Và đối với nhu cầu của tôi, tôi chỉ cần chết. Mặc dù bạn có thể thiết lập hoặc để những thứ khác. Một số có thể thích if / other if / other. Đó là sau đó để loại bỏ hoặc sau đó cung cấp if / other if / other.


3

Đây là giải pháp của tôi mà tôi thích khi sử dụng các thủ tục được lưu trữ. Chức năng mysql tùy chỉnh để kiểm tra bảng tồn tại trong cơ sở dữ liệu hiện tại.

delimiter $$

CREATE FUNCTION TABLE_EXISTS(_table_name VARCHAR(45))
RETURNS BOOLEAN
DETERMINISTIC READS SQL DATA
BEGIN
    DECLARE _exists  TINYINT(1) DEFAULT 0;

    SELECT COUNT(*) INTO _exists
    FROM information_schema.tables 
    WHERE table_schema =  DATABASE()
    AND table_name =  _table_name;

    RETURN _exists;

END$$

SELECT TABLE_EXISTS('you_table_name') as _exists

2

Vì "Hiển thị bảng" có thể chậm trên các cơ sở dữ liệu lớn hơn, tôi khuyên bạn nên sử dụng "MÔ TẢ" và kiểm tra xem bạn có nhận được đúng / sai không

$tableExists = mysqli_query("DESCRIBE `myTable`");

Từ những gì tôi đọc được nếu 'HIỂN THỊ' trở nên kém hiệu quả thì 'information_schema' được ưu tiên hơn 'MÔ TẢ'.
Esoterica

-1
$q = "SHOW TABLES";
$res = mysql_query($q, $con);
if ($res)
while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) )
{
    foreach( $row as $key => $value )
    {
        if ( $value = BTABLE )  // BTABLE IS A DEFINED NAME OF TABLE
            echo "exist";
        else
            echo "not exist";
    }
}

2
Vui lòng thêm nhận xét chính xác cho mã để cung cấp chất lượng câu trả lời tốt nhất. Đơn giản chỉ cần dán một số mã không nói nhiều đến tác giả của câu hỏi.
Jakub Matczak

5
Điều này thực sự khủng khiếp. Vậy nếu có 50.000 bảng, bạn sẽ tải tất cả các bảng, lặp qua từng bảng để tìm xem có đúng bảng không?
Rohit Chopra

-1

Khung Zend

public function verifyTablesExists($tablesName)
    {
        $db = $this->getDefaultAdapter();
        $config_db = $db->getConfig();

        $sql = "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{$config_db['dbname']}'  AND table_name = '{$tablesName}'";

        $result = $db->fetchRow($sql);
        return $result;

    }


-9

Tại sao bạn làm cho nó rất khó hiểu?

function table_exist($table){ 
    $pTableExist = mysql_query("show tables like '".$table."'");
    if ($rTableExist = mysql_fetch_array($pTableExist)) {
        return "Yes";
    }else{
        return "No";
    }
} 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.