2013-05-14 10 views
10

Tôi có đoạn mã sau:CREATE TABLE IF NOT EXISTS không thành công với bảng đã tồn tại

$db_host = 'localhost'; 
$db_port = '3306'; 
$db_username = 'root'; 
$db_password = 'root'; 
$db_primaryDatabase = 'dsl_ams'; 

// Connect to the database, using the predefined database variables in /assets/repository/mysql.php 
$dbConnection = new mysqli($db_host, $db_username, $db_password, $db_primaryDatabase); 

// If there are errors (if the no# of errors is > 1), print out the error and cancel loading the page via exit(); 
if (mysqli_connect_errno()) { 
    printf("Could not connect to MySQL databse: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$queryCreateUsersTable = "CREATE TABLE IF NOT EXISTS `USERS` (
    `ID` int(11) unsigned NOT NULL auto_increment, 
    `EMAIL` varchar(255) NOT NULL default '', 
    `PASSWORD` varchar(255) NOT NULL default '', 
    `PERMISSION_LEVEL` tinyint(1) unsigned NOT NULL default '1', 
    `APPLICATION_COMPLETED` boolean NOT NULL default '0', 
    `APPLICATION_IN_PROGRESS` boolean NOT NULL default '0', 
    PRIMARY KEY (`ID`) 
)"; 

if(!$dbConnection->query($queryCreateUsersTable)){ 
    echo "Table creation failed: (" . $dbConnection->errno . ") " . $dbConnection->error; 
} 

Những kết quả đầu ra ...

Table creation failed: (1050) Table ' dsl_ams . NGƯỜI DÙNG ' already exists

Những gì tôi không hiểu là: không phải là IF NOT EXISTS phải hủy bỏ việc thực hiện truy vấn SQL nếu bảng đó đã tồn tại chưa? Nói cách khác, nếu bảng tồn tại, nó có nên thoát khỏi câu lệnh if và không echo bất cứ điều gì, và không cố gắng thực hiện truy vấn?

Chỉ cố gắng tìm cách tốt nhất để "tạo bảng nếu nó không tồn tại" mà không cần xuất bất kỳ thứ gì cho người dùng.

+0

'$ queryCreateUsersTable! = $ QueryCreateTable', tôi cho phép thông báo thấy loại lỗi đó. – Wrikken

+0

"bật thông báo"? Ý anh là gì? và yeah, tổng số derp về phía tôi. –

+1

Thiết lập error_reporting đến mức chính xác ('error_reporting (E_ALL | E_STRICT);' là những gì tôi muốn sử dụng trong quá trình phát triển) & 'ini_set ('display_errors', 1);' trên môi trường phát triển của bạn, 'ini_set ('log_errors', 1); 'trên hộp sản xuất của bạn (không cần hiển thị lỗi cho người dùng cuối) – Wrikken

Trả lời

15

Hãy thử điều này

$query = "SELECT ID FROM USERS"; 
$result = mysqli_query($dbConnection, $query); 

if(empty($result)) { 
       $query = "CREATE TABLE USERS (
          ID int(11) AUTO_INCREMENT, 
          EMAIL varchar(255) NOT NULL, 
          PASSWORD varchar(255) NOT NULL, 
          PERMISSION_LEVEL int, 
          APPLICATION_COMPLETED int, 
          APPLICATION_IN_PROGRESS int, 
          PRIMARY KEY (ID) 
         )"; 
       $result = mysqli_query($dbConnection, $query); 
} 

này sẽ kiểm tra xem nếu bất cứ điều gì là trong bảng và nếu nó trả NULL bạn không có một bảng.

Ngoài ra không có BOOLEAN kiểu dữ liệu trong mysql, bạn nên INT và chỉ đặt thành 1 hoặc 0 khi chèn vào bảng. Bạn cũng không cần dấu nháy đơn xung quanh mọi thứ, chỉ khi bạn đang mã hóa dữ liệu vào truy vấn.

Như thế này ...

$query = "INSERT INTO USERS (EMAIL, PASSWORD, PERMISSION_LEVEL, APPLICATION_COMPLETED, APPLICATION_IN_PROGRESS) VALUES ('[email protected]', 'fjsdfbsjkbgs', 0, 0, 0)"; 

Hope this helps.

+0

Tôi muốn sử dụng 'SHOW TABLES LIKE 'USERS''. Ghi nhớ đây là trường hợp nhạy cảm. – billynoah

4

Để tránh xuất hiện bất kỳ thứ gì, hãy kiểm tra bảng trong php của bạn trước khi thử tạo bảng. Ví dụ,

$querycheck='SELECT 1 FROM `USERS`'; 

$query_result=$dbConnection->query($querycheck); 

if ($query_result !== FALSE) 
{ 
// table exists 
} else 
{ 
// table does not exist, create here. 
} 

Best wishes,

+0

Còn nếu bảng được tạo nhưng chưa có bất kỳ bản ghi nào? –

0

Làm thế nào về bạn chỉ hiển thị lỗi nếu số lỗi không phải là 1050?

if(!$dbConnection->query($queryCreateUsersTable)){ 
    if($dbConnection->errno != 1050){ 
    echo "Table creation failed: (" . $dbConnection->errno . ") " . $dbConnection->error; 
    } 
}