2016-05-15 80 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