СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ ОНА НЕ СУЩЕСТВУЕТ, не удается, поскольку таблица уже существует


У меня есть следующий код:

$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

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

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

Author: Jesse, 2013-05-15

3 answers

Попробуйте это

$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, у вас нет таблицы.

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

Вот так...

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

Надеюсь, это поможет.

 17
Author: Josh Balcitis, 2013-05-15 00:19:20

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

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

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

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

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

 5
Author: Eduardo Vieira, 2013-05-15 00:14:34

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

if(!$dbConnection->query($queryCreateUsersTable)){
  if($dbConnection->errno != 1050){
    echo "Table creation failed: (" . $dbConnection->errno . ") " . $dbConnection->error;
  }
}
 0
Author: Aminah Nuraini, 2016-11-02 14:28:46