2013-05-14 9 views
10

मैं निम्नलिखित कोड है:CREATE TABLE नहीं मौजूद है, तो तालिका के साथ विफल रहता है पहले से मौजूद है

$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 क्वेरी के निष्पादन को रद्द करना नहीं है यदि वह तालिका पहले से मौजूद है? दूसरे शब्दों में, यदि तालिका मौजूद है, तो क्या यह बाहर निकलना नहीं चाहिए कि अगर कथन और कुछ भी गूंज न करें, और क्वेरी निष्पादित करने का प्रयास न करें?

उपयोगकर्ता को कुछ भी आउटपुट किए बिना "तालिका बनायें यदि यह अस्तित्व में नहीं है" का सबसे अच्छा तरीका खोजने का प्रयास कर रहा है।

+0

'$ queryCreateUsersTable! = $ QueryCreateTable', मैं इस तरह की त्रुटियों को देखने के लिए नोटिस सक्षम करता हूं। – Wrikken

+0

"नोटिस सक्षम करें"? आपका मतलब क्या है? और हाँ, मेरे हिस्से पर कुल derp। –

+1

सेटिंग सही स्तर तक error_reporting |; & 'ini_set ('display_errors', 1) (' error_reporting (E_ALL E_STRICT) 'मैं क्या विकासशील के दौरान उपयोग होता है);' अपने विकास के वातावरण पर, '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 आप एक तालिका नहीं है।

इसके अलावा 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)"; 

आशा इस मदद करता है।

+0

मैं 'शोर्स टैब' जैसे 'शोर्स' का उपयोग करता हूं। ध्यान रखें यह मामला संवेदनशील है। – 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; 
    } 
} 
संबंधित मुद्दे