PHP 简单写个install.php
这次顺便做了一个install.php
才发现难度其实并不大,还是文件写入操作而已,安装其实主要操作的还是数据库里的内容,先来看看文件里怎么写:(还是用的Codeigiter,对于使用其他框架或者手写而言,仅思路可参考,用了挺多CI自带的helper
或者是library
的)
$content = "<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\n";
$content .= '$active_group'. "= 'default';\n";
$content .= '$active_record'." = TRUE;\n";
$content .= '$db'."['default']['hostname'] = '".$this->input->post('hostname')."';\n";
$content .= '$db'."['default']['username'] = '".$this->input->post('rootname')."';\n";
$content .= '$db'."['default']['password'] = '".$this->input->post('pass')."';\n";
$content .= '$db'."['default']['database'] = '".$this->input->post('book')."';\n";
$content .= '$db'."['default']['dbdriver'] = 'mysql';\n";
$content .= '$db'."['default']['dbprefix'] = '';\n";
$content .= '$db'."['default']['pconnect'] = TRUE;\n";
$content .= '$db'."['default']['db_debug'] = TRUE;\n";
$content .= '$db'."['default']['cache_on'] = FALSE;\n";
$content .= '$db'."['default']['cachedir'] = '';\n";
$content .= '$db'."['default']['char_set'] = 'utf8';\n";
$content .= '$db'."['default']['dbcollat'] = 'utf8_general_ci';\n";
$content .= '$db'."['default']['swap_pre'] = '';\n";
$content .= '$db'."['default']['autoinit'] = TRUE;\n";
$content .= '$db'."['default']['stricton'] = FALSE;";
在文件里用\n
来换行,因为里面包括了PHP的代码,这导致了我们只能用双引号避免冲突(否则的话就得用\
了,感觉工作量更大),针对$db
,直接显示必须要用单引号,于是就出现了这个。
写入文件之后,接着我们需要做的是执行一系列安装操作,也就是CREATE TABLE
,以及创建一个新用户用于登陆,在model
里,我这么写:
function install() {
if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_category'")) == 0)
$this->db->query("CREATE TABLE pr_category(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, category VARCHAR(100) NOT NULL UNIQUE, deadline INT NOT NULL)");
if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_college'")) == 0)
$this->db->query("CREATE TABLE pr_college(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL UNIQUE)");
if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_level'")) == 0)
$this->db->query("CREATE TABLE pr_level(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, level INT NOT NULL, name VARCHAR(20) NOT NULL)");
if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_rates'")) == 0)
$this->db->query("CREATE TABLE pr_rates(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, pid INT NOT NULL, ip VARCHAR(40) NOT NULL, category INT NOT NULL)");
if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_users'")) == 0)
$this->db->query("CREATE TABLE pr_users(uid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, username VARCHAR(45) NOT NULL UNIQUE, password VARCHAR(50) NOT NULL, level INT NOT NULL )");
if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_works'")) == 0)
$this->db->query("CREATE TABLE pr_works(pid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, content TEXT, realname VARCHAR(20) NOT NULL, studentnum VARCHAR(20) NOT NULL, college INT NOT NULL, filename TEXT NOT NULL, category INT NOT NULL)");
$query1 = $this->db->get_where('pr_level',array('level' => 1, 'name' => '普通用户'));
$query2 = $this->db->get_where('pr_level',array('level' => 5, 'name' => '管理员'));
$query3 = $this->db->get_where('pr_level',array('level' => 99, 'name' => '超级管理员'));
if ($query1->num_rows() == 0)
$this->db->query("INSERT INTO pr_level(level, name) VALUES (1, '普通用户')");
if ($query2->num_rows() == 0)
$this->db->query("INSERT INTO pr_level(level, name) VALUES (5, '管理员')");
if ($query3->num_rows() == 0)
$this->db->query("INSERT INTO pr_level(level, name) VALUES (99, '超级管理员')");
$this->username = $this->input->post('username');
$this->password = $this->input->post('password');
$this->level = 99;
$query4 = $this->db->get_where('pr_users',array('username' => $this->input->post('username')));
if ($query4->num_rows() == 0) {
$this->db->insert('pr_users', $this);
return TRUE;
} else {
return FALSE;
}
}
其实这么写查询量很大效率又低,不过这有效的避免了上一次安装被打断之后重新安装遇到的麻烦,检测是否已经创建了某个表,是否已经有新用户了之类的。
mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_category'"))
这句可以查询数据库中是否存在这个表。
执行完如果顺利的话,将install.php
改个名字:
rename('application/controllers/install.php', 'application/controllers/install.lock');
在其他文件里加入检测install.php
是否存在,如果存在的话就跳转到install.php
,这样就做好了简单的安装流程了(必须放在model
前,否则会提示没有数据库而不会跳转)。
if (file_exists('application/controllers/install.php'))
redirect('install');
至于什么是否存在表之类的,因为CI会check而且优先级也高于我们自己写的错误提示,所以这里就不加了。
完整源码(MVC):
Controller:
<?php
class Install extends CI_Controller {
function __construct() {
parent::__construct();
$this->load->helper('url');
$this->load->helper('file');
}
function index() {
$data['title'] = '安装向导';
$this->load->helper('form');
$this->load->library('form_validation');
$this->form_validation->set_rules('hostname', '主机名', 'trim|required|xss_clean');
$this->form_validation->set_rules('rootname', '数据库用户名', 'trim|required|xss_clean');
$this->form_validation->set_rules('username', '用户名', 'trim|required|xss_clean');
$this->form_validation->set_rules('password', '密码', 'trim|required|xss_clean|md5');
$data['error'] = '';
if ($this->form_validation->run() == FALSE) {
$this->load->view('install', $data);
} else {
$config['hostname'] = $this->input->post('hostname');
$config['username'] = $this->input->post('rootname');
$config['password'] = $this->input->post('pass');
$config['database'] = $this->input->post('book');
$config['dbdriver'] = 'mysql';
$config['dbprefix'] = '';
$config['pconnect'] = TRUE;
$config['db_debug'] = TRUE;
$config['cache_on'] = FALSE;
$config['cachedir'] = '';
$config['char_set'] = 'utf8';
$config['dbcollat'] = 'utf8_general_ci';
$config['swap_pre'] = '';
$config['autoinit'] = TRUE;
$config['stricton'] = FALSE;
if ($this->load->database($config, TRUE)) {
$content = "<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\n";
$content .= '$active_group'. "= 'default';\n";
$content .= '$active_record'." = TRUE;\n";
$content .= '$db'."['default']['hostname'] = '".$this->input->post('hostname')."';\n";
$content .= '$db'."['default']['username'] = '".$this->input->post('rootname')."';\n";
$content .= '$db'."['default']['password'] = '".$this->input->post('pass')."';\n";
$content .= '$db'."['default']['database'] = '".$this->input->post('book')."';\n";
$content .= '$db'."['default']['dbdriver'] = 'mysql';\n";
$content .= '$db'."['default']['dbprefix'] = '';\n";
$content .= '$db'."['default']['pconnect'] = TRUE;\n";
$content .= '$db'."['default']['db_debug'] = TRUE;\n";
$content .= '$db'."['default']['cache_on'] = FALSE;\n";
$content .= '$db'."['default']['cachedir'] = '';\n";
$content .= '$db'."['default']['char_set'] = 'utf8';\n";
$content .= '$db'."['default']['dbcollat'] = 'utf8_general_ci';\n";
$content .= '$db'."['default']['swap_pre'] = '';\n";
$content .= '$db'."['default']['autoinit'] = TRUE;\n";
$content .= '$db'."['default']['stricton'] = FALSE;";
if (write_file('application/config/database.php', $content)) {
$this->load->model('install_model');
if ($this->install_model->install()) {
rename('application/controllers/install.php', 'application/controllers/install.lock');
$this->load->library('session');
if (!empty($this->session->userdata['login'])) {
$this->session->sess_destroy(); // destroy the session
}
redirect('poster_admin/login', 'refresh');
} else {
$data['error'] = '超级管理员用户名已存在';
$this->load->view('install', $data);
}
} else {
$data['error'] = '安装失败,无法写入文件';
$this->load->view('install', $data);
}
}
}
}
}
?>
Model:
class Install_model extends CI_Model {
function __construct() {
parent::__construct();
$this->load->database();
$this->load->dbforge();
}
function install() {
if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_category'")) == 0)
$this->db->query("CREATE TABLE pr_category(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, category VARCHAR(100) NOT NULL UNIQUE, deadline INT NOT NULL)");
if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_college'")) == 0)
$this->db->query("CREATE TABLE pr_college(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL UNIQUE)");
if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_level'")) == 0)
$this->db->query("CREATE TABLE pr_level(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, level INT NOT NULL, name VARCHAR(20) NOT NULL)");
if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_rates'")) == 0)
$this->db->query("CREATE TABLE pr_rates(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, pid INT NOT NULL, ip VARCHAR(40) NOT NULL, category INT NOT NULL)");
if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_users'")) == 0)
$this->db->query("CREATE TABLE pr_users(uid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, username VARCHAR(45) NOT NULL UNIQUE, password VARCHAR(50) NOT NULL, level INT NOT NULL )");
if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_works'")) == 0)
$this->db->query("CREATE TABLE pr_works(pid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, content TEXT, realname VARCHAR(20) NOT NULL, studentnum VARCHAR(20) NOT NULL, college INT NOT NULL, filename TEXT NOT NULL, category INT NOT NULL)");
$query1 = $this->db->get_where('pr_level',array('level' => 1, 'name' => '普通用户'));
$query2 = $this->db->get_where('pr_level',array('level' => 5, 'name' => '管理员'));
$query3 = $this->db->get_where('pr_level',array('level' => 99, 'name' => '超级管理员'));
if ($query1->num_rows() == 0)
$this->db->query("INSERT INTO pr_level(level, name) VALUES (1, '普通用户')");
if ($query2->num_rows() == 0)
$this->db->query("INSERT INTO pr_level(level, name) VALUES (5, '管理员')");
if ($query3->num_rows() == 0)
$this->db->query("INSERT INTO pr_level(level, name) VALUES (99, '超级管理员')");
$this->username = $this->input->post('username');
$this->password = $this->input->post('password');
$this->level = 99;
$query4 = $this->db->get_where('pr_users',array('username' => $this->input->post('username')));
if ($query4->num_rows() == 0) {
$this->db->insert('pr_users', $this);
return TRUE;
} else {
return FALSE;
}
}
}
View:
<!DOCTYPE html>
<html lang="Zh-CN">
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link rel="stylesheet" href="<?php echo base_url() . 'css/bootstrap.css' ?>">
<link rel="stylesheet" href="<?php echo base_url() . 'css/login.css' ?>">
<link rel="icon" type="image/x-icon" href="<?php echo base_url() . 'favicon.ico' ?>"/>
<script src="<?php echo base_url() . 'js/jquery-1.9.0.js' ?>"></script>
<script src="<?php echo base_url() . 'js/bootstrap.js' ?>"></script>
<title><?php echo $title; ?> - SMU Poster</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-sm-4 col-sm-offset-4">
<div <?php $err = validation_errors(); echo !(empty($error) && empty($err)) ? 'class="alert alert-danger text-center"' : '' ?>><?php echo validation_errors(); ?>
<?php echo $error ?></div>
<?php echo form_open('install', array('class'=>'form-horizontal','role'=>'form')); ?>
<div class="col-sm-sm-4 col-sm-offset-4"><h2>安装向导</h2></div>
<div class="form-group">
<div class="col-sm-9 col-sm-offset-2">
<div class="input-group">
<span class="input-group-addon"><span class="glyphicon glyphicon-cloud"></span></span>
<input type="text" class="form-control" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="一般为localhost" id="hostname" name="hostname" placeholder="主机名" value="localhost"/>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-9 col-sm-offset-2">
<div class="input-group">
<span class="input-group-addon"><span class="glyphicon glyphicon-book"></span></span>
<input type="text" class="form-control" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="数据库名如poster,请自行创建" id="book" name="book" placeholder="数据库名"/>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-9 col-sm-offset-2">
<div class="input-group">
<span class="input-group-addon"><span class="glyphicon glyphicon-user"></span></span>
<input type="text" class="form-control" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="连接数据库的账号" id="rootname" name="rootname" placeholder="数据库账号"/>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-9 col-sm-offset-2">
<div class="input-group">
<span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span>
<input type="password" class="form-control" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="连接数据库的密码" id="pass" name="pass" placeholder="数据库密码"/>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-9 col-sm-offset-2">
<div class="input-group">
<span class="input-group-addon"><span class="glyphicon glyphicon-user"></span></span>
<input type="text" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="注册一个后台超级管理员账号" class="form-control" id="username" name="username" placeholder="后台登录账号"/>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-9 col-sm-offset-2">
<div class="input-group">
<span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span>
<input type="password" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="后台超级管理员密码" class="form-control" id="password" name="password" placeholder="后台登陆密码"/>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-9">
<button type="submit" class="btn btn-default">开始安装</button>
</div>
</div>
</form>
</div>
</div>
</div>
<div id="footer">
<div class="container">
<p class="text-center copyright text-muted">Designed By <a href="http://mstc.shmtu.edu.cn/">微软技术俱乐部</a></p>
</div>
</div>
</body>
</html>
植入部分
如果您觉得文章不错,可以通过赞助支持我。
如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。