2013-05-14 1 views
10

У меня есть следующий код:CREATE TABLE IF NOT EXISTS терпит неудачу с таблицей уже существует

$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; 
} 

который выводит ...

Table creation failed: (1050) Table ' dsl_ams . ПОЛЬЗОВАТЕЛИ ' already exists

То, что я не понимаю is: is not IF NOT EXISTS Предполагается отменить выполнение SQL-запроса, если эта таблица уже существует? Другими словами, если таблица существует, не следует ли ей выйти из этого оператора if, а не вообще ничего эха, а не пытаться выполнить запрос?

Просто пытайтесь найти лучший способ «создать таблицу, если она не существует», не выведя ничего для пользователя.

+0

'$ queryCreateUsersTable! = $ QueryCreateTable', я бы включил уведомления, чтобы увидеть такие ошибки. – Wrikken

+0

"включить уведомления"? что вы имеете в виду? и да, полный дерп с моей стороны. –

+1

Настройка error_reporting на правильный уровень ('error_reporting (E_ALL | E_STRICT);' то, что я буду использовать во время разработки) & 'ini_set ('display_errors', 1);' в вашей среде разработки 'ini_set ('log_errors' 1); 'на вашей производственной коробке (нет необходимости отображать ошибки для конечных пользователей) – Wrikken

ответ

15

Попробуйте

$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); 
} 

Это проверяет, чтобы увидеть, если что-либо в таблице, и если она возвращает NULL вы не имеете таблицу.

Также не существует BOOLEAN типа данных в mysql, вы должны INT и просто установите его на 1 или 0 при вставке в таблицу. Вам также не нужны одинарные кавычки во всем, только когда вы вставляете данные в запрос.

Как это ...

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

Надеется, что это помогает.

+0

Я бы использовал 'SHOW TABLES LIKE 'USERS''. Помните, что это чувствительно к регистру. – billynoah

4

Чтобы не выводить ничего, проверьте таблицу на своем php, прежде чем пытаться создать таблицу. Например,

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

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

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

С наилучшими пожеланиями,

+0

Что будет, если таблица создана, но еще нет записей? –

0

Как насчет того, чтобы вы указали только ошибку, если номер ошибки не равен 1050?

if(!$dbConnection->query($queryCreateUsersTable)){ 
    if($dbConnection->errno != 1050){ 
    echo "Table creation failed: (" . $dbConnection->errno . ") " . $dbConnection->error; 
    } 
} 
Смежные вопросы