【问题标题】:Codeigniter 3 migrate sqlCodeigniter 3 迁移 sql
【发布时间】:2015-12-11 11:23:00
【问题描述】:

我为我的应用程序使用 Codeigniter 3 框架,并使用迁移库。我写了一个对象,它创建一个'user_type'表,并插入三行。

代码如下:

private $tableName = 'user_type';

public function up() {
    $sql = "CREATE TABLE `$this->tableName` (
                `id` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , 
                `name` CHAR(120) NOT NULL
            ) ENGINE = InnoDB;";

    $sql .= "INSERT INTO `$this->tableName` (`id`, `name`) VALUES
                (1, 'user'), (2, 'provider'), (3, 'admin');";

    $this->db->query($sql);
}

如果我想使用迁移,它会丢弃一条带有以下文本的错误消息: 发生数据库错误

错误号:1064

您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 'INSERT INTO user_type (id, name) 附近的值 (1, '用户'), (2, 'provider')' 在第 4 行

创建表user_type (id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT 主键,name CHAR(120) NOT NULL ) ENGINE = InnoDB;INSERT INTO user_type (id, name) 值 (1, '用户'), (2, '提供者'), (3, '管理员');

文件名: C:/xampp/htdocs/rentacar/application/migrations/20151211113200_usertype_table_data.php

行号:18

有趣的是,如果我回显 $sql 变量,并在 phpmyadmin 中运行它,它运行良好。

【问题讨论】:

标签: php mysql codeigniter migration


【解决方案1】:

您不能一次执行多个 sql 语句。
拆分语句并执行每个语句,如下所示。

private $tableName = 'user_type';

public function up() {
    // First
    $sql = "CREATE TABLE `$this->tableName` (
                `id` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , 
                `name` CHAR(120) NOT NULL
            ) ENGINE = InnoDB;";
    $this->db->query($sql);

    // Second
    $sql = "INSERT INTO `$this->tableName` (`id`, `name`) VALUES
                (1, 'user'), (2, 'provider'), (3, 'admin');";
    $this->db->query($sql);
}

【讨论】:

    【解决方案2】:

    使用dbfore创建表,

    $this->load->dbforge();
    $tableName = 'user_type';
    
    $this->dbforge->add_field(array(
        'id' => array(
            'type' => 'TINYINT UNSIGNED NOT NULL'
        ),
        'name' => array(
            'type' => 'VARCHAR',
            'constraint' => '120',
        )
    ));
    
    $this->dbforge->create_table($tableName);
    
    $sql = "INSERT INTO `$tableName` (`id`, `name`) VALUES
            (1, 'user'), (2, 'provider'), (3, 'admin');";
    
    $this->db->query($sql);
    

    了解dbforge

    编辑
    在这种情况下,请尝试像这样中断您的查询

    $tableName = "user_type";
    $sql = "";
    $sql = "CREATE TABLE `$tableName` (
            `id` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , 
            `name` CHAR(120) NOT NULL
        ) ENGINE = InnoDB;";
    echo $this->db->query($sql);
    $sql = "  INSERT INTO `$tableName` (`id`, `name`) VALUES
            (1, 'user'), (2, 'provider'), (3, 'admin')";
    
    echo $this->db->query($sql);
    

    【讨论】:

    • 我不想用dbforge,因为纯sql比较快,而且我要尽量写轻量级的程序
    • 但是我们使用dbforge在codeigniter中创建表。
    • 如果你在认真争论 5 位小数的性能差异,比较纯 sql 和 dbforge 为什么首先要使用框架?听说纯 PHP 比 CodeIgniter 快!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 2012-02-27
    • 2015-04-02
    相关资源
    最近更新 更多