2016-05-15 79 views
-1

我用下面的要點作出OOP嘗試創建數據庫連接:PHP數據庫表的創建失敗

https://gist.github.com/jonashansen229/4534794

它似乎工作至今。

但是,創建數據庫表的時候會失敗。

編輯:

最近的意見和建議後,我更新了我的代碼:

require_once 'Database.php'; // the gist 4534794 

class DatabaseSchema { 

    public function createStudents() { 
    $db = Database::getInstance(); 
    $mysqli = $db->getConnection(); 
    $create_students = 'CREATE TABLE IF NOT EXISTS students (
     id INT(6) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
     firstname VARCHAR(40) NOT NULL, 
     lastname VARCHAR(40) NOT NULL, 
     university VARCHAR(50) 
    )'; 
    $result = $mysqli->query($create_students); 
    } 

    public function createPassedExams() { 
    $db = Database::getInstance(); 
    $mysqli = $db->getConnection(); 
    $create_passed_exams = 'CREATE TABLE IF NOT EXISTS passed_exams (
     id INT(6) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
     name VARCHAR(40) NOT NULL, 
     student_id INT(6), 
     FOREIGN KEY (student_id) REFERENCES students(id) ON DELETE CASCADE 
    )'; 
    $result = $mysqli->query($create_passed_exams); 
    } 

} 

$db_student = new DatabaseSchema(); 

$db_student->createStudents(); 
$db_student->createPassedExams(); 

當我在mysql控制檯的外觀,僅創建表的學生。 表爲什麼表失傳?

+0

$ db_student = new DatabaseSchema()最後缺少';'。 –

+0

哦,男孩,謝謝@Arsh,完全被忽視。 – StandardNerd

+0

不客氣。 –

回答

1

students表中的列idINT(6) UNSIGNED但對passed_examsstudent_id列是簽署INT(6)。因此,FOREIGN KEY (student_id) REFERENCES students(id) ON DELETE CASCADE子句將失敗,並顯示「錯誤代碼:1215.無法添加外鍵約束」。

我建議你實現一些錯誤處理,以便你會看到這個錯誤消息,而不是盲目地繼續執行代碼。

+0

謝謝馬特!我將添加錯誤處理。 – StandardNerd

5

您創建了字符串來檢查$query_students = 'SELECT ID FROM STUDENTS'; 但您從未真正運行過此操作。然後檢查字符串是否爲空,它永遠不會在代碼中爲空。 你應該做的是使用MySQL的CREATE ... IF NOT EXISTS語法,而不是你在這裏做的。

第一個例子顯示語法https://dev.mysql.com/doc/refman/5.5/en/create-table.html

+0

完全同意你的看法。因爲字符串有一個文本,它永遠不會是空的,並且他正在檢查它是否爲空或者是否爲空,然後運行查詢。 –

+0

好的調用也可以引用'CREATE ... IF NOT EXISTS'。 – Martin

+0

真棒,謝謝! – StandardNerd