我开始使用codeigniter 2.1.0编写一个简单的Model类.我现在想要它做的就是创建并删除它代表的MySQL表.这是代码:
<?php
class Users_model extends CI_Model {
public function createTable(){
if( $this->db->table_exists('users') == FALSE ){
$query = "CREATE TABLE users(
id SERIAL PRIMARY KEY,
email VARCHAR(52) NOT NULL check(email <> ''),
UNIQUE (email)
)ENGINE = InnoDB;";
$this->db->query($query);
}
}
public function deleteTable(){
if( $this->db->table_exists('users') ){
$query = "DROP TABLE users;";
$this->db->query($query);
} else {
echo "users not found <br />";
$tables = $this->db->list_tables();
foreach ($tables as $table)
{
echo $table."<br />";
}
}
}
}
?>
这是我在主类中执行的代码:
$this->load->model('users_model');
$this->users_model->deleteTable();
$this->users_model->createTable();
第一轮很好,花花公子.创建表就好了.但是,当我再次运行它时,我得到了输出:
users not found
users
经过进一步检查,我意识到table_exists()永远不会返回TRUE. var_dump($this-> db-> table_exists(‘users’));返回bool(false).
所以,我做错什么了吗?这很简单,从documentation复制粘贴.Google不返回任何相关内容,作为C程序员,我的心态始终是“如果有错误,那就是你的错误.(Richard Stallman永远不会错)”.但是,由于斯托曼先生与此无关,所以有可能.
TL; DR
为什么上面的代码中的table_exists(‘users’)永远不会返回TRUE,即使list_tables()确实返回了’users’;
解决方法:
尝试使用var_dump()代替echo.布尔值不适用于echo.
var_dump( $this->db->table_exists('users') );
table_exists的source code看起来像这样:
function table_exists($table_name)
{
return ( ! in_array($this->_protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables())) ? FALSE : TRUE;
}
来自评论的更新
如果您查看_protect_identifiers,则会将数据库名称添加到表名称中.但是应该有一个. db.table之间.也许您的数据库配置搞砸了?