2013-05-14 14 views
10

Mam następujący kod:CREATE TABLE IF NOT EXISTS nie z tabeli już istnieje

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

które wyjścia ...

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

Co ja nie rozumiem to: czy nie ma być anulowane wykonanie kwerendy SQL, jeśli ta tabela już istnieje? Innymi słowy, jeśli tabela istnieje, to czy nie powinna ona wychodzić z tej instrukcji if i nie wywoływać niczego w ogóle, a nie próbować wykonać zapytania?

Po prostu próbuję znaleźć najlepszy sposób, aby "utworzyć tabelę, jeśli nie istnieje", bez wysyłania niczego do użytkownika.

+0

'$ queryCreateUsersTable! = $ QueryCreateTable', Włączenie powiadomień, aby zobaczyć tego rodzaju błędy. – Wrikken

+0

"włącz powiadomienia"? co masz na myśli? i tak, totalna wywrotka z mojej strony. –

+1

Ustawienie error_reporting na prawidłowy poziom ('error_reporting (E_ALL | E_STRICT);' jest tym, czego użyłbym podczas tworzenia) & 'ini_set ('display_errors', 1);' w twoim środowisku programistycznym, 'ini_set ('log_errors', 1); 'na twoim polu produkcyjnym (nie ma potrzeby wyświetlania błędów użytkownikom końcowym) – Wrikken

Odpowiedz

15

Spróbuj

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

ten sprawdza, czy wszystko jest w tabeli i jeśli zwróci NULL nie masz stolik.

Również nie ma typu danych BOOLEAN w mysql, powinieneś INT i po prostu ustawić go na 1 lub 0 podczas wstawiania do tabeli. Nie potrzebujesz też pojedynczych cudzysłowów dookoła wszystkiego, tylko gdy wpisujesz dane do zapytania.

tak ...

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

Nadzieja to pomaga.

+0

Ja sam użyłbym "POKAŻ TABLICE JAK" UŻYTKOWNICY ". Pamiętaj, że rozróżniana jest wielkość liter. – billynoah

4

Aby uniknąć wysyłania czegokolwiek, przetestuj tabelę w swoim php przed próbą utworzenia tabeli. Na przykład,

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

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

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

Najlepsze życzenia,

+0

Co się stanie, jeśli tabela zostanie utworzona, ale nie ma jeszcze żadnych rekordów? –

0

Co powiesz na pokazanie błędu tylko wtedy, gdy numer błędu nie jest 1050?

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