web-dev-qa-db-fra.com

CREATE TABLE IF NOT EXISTS échoue avec une table déjà existante

J'ai le code suivant:

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

Quelles sorties ...

Table creation failed: (1050) Table 'dsl_ams.USERS' already exists

Ce que je ne comprends pas, c'est que IF NOT EXISTS n'est pas censé annuler l'exécution de la requête SQL si cette table existe déjà? En d'autres termes, si la table existe, ne devrait-elle pas quitter cette instruction if et ne rien répercuter, et ne pas tenter d'exécuter la requête?

J'essaie juste de trouver le meilleur moyen de "créer une table si elle n'existe pas" sans transmettre quoi que ce soit à l'utilisateur.

15
Samuel Stiles

Essaye ça

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

Cela vérifie si quelque chose se trouve dans la table et si elle renvoie NULL, vous n'avez pas de table.

De plus, il n'y a pas de type de données BOOLEAN dans mysql, vous devriez donc INT et le définir à 1 ou 0 lors de l'insertion dans la table. De plus, vous n'avez pas besoin de guillemets simples autour de tout, juste au moment de coder en dur des données dans la requête.

Comme ça...

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

J'espère que cela t'aides.

17
Josh Balcitis

Pour éviter de générer quoi que ce soit, testez la table dans votre php avant d'essayer de la créer. Par exemple,

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

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

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

Meilleurs vœux,

5
Eduardo Vieira

Que diriez-vous d'afficher l'erreur si le numéro d'erreur n'est pas 1050?

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