PHP 简单写个install.php
这次顺便做了一个
install.php
才发现难度其实并不大,还是文件写入操作而已,安装其实主要操作的还是数据库里的内容,先来看看文件里怎么写:(还是用的Codeigiter,对于使用其他框架或者手写而言,仅思路可参考,用了挺多CI自带的helper
或者是library
的)
1 $content = "<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\n";
2 $content .= '$active_group'. "= 'default';\n";
3 $content .= '$active_record'." = TRUE;\n";
4 $content .= '$db'."['default']['hostname'] = '".$this->input->post('hostname')."';\n";
5 $content .= '$db'."['default']['username'] = '".$this->input->post('rootname')."';\n";
6 $content .= '$db'."['default']['password'] = '".$this->input->post('pass')."';\n";
7 $content .= '$db'."['default']['database'] = '".$this->input->post('book')."';\n";
8 $content .= '$db'."['default']['dbdriver'] = 'mysql';\n";
9 $content .= '$db'."['default']['dbprefix'] = '';\n";
10 $content .= '$db'."['default']['pconnect'] = TRUE;\n";
11 $content .= '$db'."['default']['db_debug'] = TRUE;\n";
12 $content .= '$db'."['default']['cache_on'] = FALSE;\n";
13 $content .= '$db'."['default']['cachedir'] = '';\n";
14 $content .= '$db'."['default']['char_set'] = 'utf8';\n";
15 $content .= '$db'."['default']['dbcollat'] = 'utf8_general_ci';\n";
16 $content .= '$db'."['default']['swap_pre'] = '';\n";
17 $content .= '$db'."['default']['autoinit'] = TRUE;\n";
18 $content .= '$db'."['default']['stricton'] = FALSE;";
19
在文件里用\n
来换行,因为里面包括了PHP的代码,这导致了我们只能用双引号避免冲突(否则的话就得用\
了,感觉工作量更大),针对$db
,直接显示必须要用单引号,于是就出现了这个。
写入文件之后,接着我们需要做的是执行一系列安装操作,也就是CREATE TABLE
,以及创建一个新用户用于登陆,在model
里,我这么写:
1 function install() {
2 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_category'")) == 0)
3 $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)");
4 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_college'")) == 0)
5 $this->db->query("CREATE TABLE pr_college(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL UNIQUE)");
6 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_level'")) == 0)
7 $this->db->query("CREATE TABLE pr_level(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, level INT NOT NULL, name VARCHAR(20) NOT NULL)");
8 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_rates'")) == 0)
9 $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)");
10 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_users'")) == 0)
11 $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 )");
12 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_works'")) == 0)
13 $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)");
14 $query1 = $this->db->get_where('pr_level',array('level' => 1, 'name' => '普通用户'));
15 $query2 = $this->db->get_where('pr_level',array('level' => 5, 'name' => '管理员'));
16 $query3 = $this->db->get_where('pr_level',array('level' => 99, 'name' => '超级管理员'));
17 if ($query1->num_rows() == 0)
18 $this->db->query("INSERT INTO pr_level(level, name) VALUES (1, '普通用户')");
19 if ($query2->num_rows() == 0)
20 $this->db->query("INSERT INTO pr_level(level, name) VALUES (5, '管理员')");
21 if ($query3->num_rows() == 0)
22 $this->db->query("INSERT INTO pr_level(level, name) VALUES (99, '超级管理员')");
23
24 $this->username = $this->input->post('username');
25 $this->password = $this->input->post('password');
26 $this->level = 99;
27
28 $query4 = $this->db->get_where('pr_users',array('username' => $this->input->post('username')));
29 if ($query4->num_rows() == 0) {
30 $this->db->insert('pr_users', $this);
31 return TRUE;
32 } else {
33 return FALSE;
34 }
35 }
36
其实这么写查询量很大效率又低,不过这有效的避免了上一次安装被打断之后重新安装遇到的麻烦,检测是否已经创建了某个表,是否已经有新用户了之类的。
1mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_category'"))
2
这句可以查询数据库中是否存在这个表。
执行完如果顺利的话,将install.php
改个名字:
1 rename('application/controllers/install.php', 'application/controllers/install.lock');
2
在其他文件里加入检测install.php
是否存在,如果存在的话就跳转到install.php
,这样就做好了简单的安装流程了(必须放在model
前,否则会提示没有数据库而不会跳转)。
1 if (file_exists('application/controllers/install.php'))
2 redirect('install');
3
至于什么是否存在表之类的,因为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:
1class Install_model extends CI_Model {
2
3 function __construct() {
4 parent::__construct();
5 $this->load->database();
6 $this->load->dbforge();
7 }
8
9 function install() {
10 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_category'")) == 0)
11 $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)");
12 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_college'")) == 0)
13 $this->db->query("CREATE TABLE pr_college(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL UNIQUE)");
14 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_level'")) == 0)
15 $this->db->query("CREATE TABLE pr_level(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, level INT NOT NULL, name VARCHAR(20) NOT NULL)");
16 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_rates'")) == 0)
17 $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)");
18 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_users'")) == 0)
19 $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 )");
20 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_works'")) == 0)
21 $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)");
22 $query1 = $this->db->get_where('pr_level',array('level' => 1, 'name' => '普通用户'));
23 $query2 = $this->db->get_where('pr_level',array('level' => 5, 'name' => '管理员'));
24 $query3 = $this->db->get_where('pr_level',array('level' => 99, 'name' => '超级管理员'));
25 if ($query1->num_rows() == 0)
26 $this->db->query("INSERT INTO pr_level(level, name) VALUES (1, '普通用户')");
27 if ($query2->num_rows() == 0)
28 $this->db->query("INSERT INTO pr_level(level, name) VALUES (5, '管理员')");
29 if ($query3->num_rows() == 0)
30 $this->db->query("INSERT INTO pr_level(level, name) VALUES (99, '超级管理员')");
31
32 $this->username = $this->input->post('username');
33 $this->password = $this->input->post('password');
34 $this->level = 99;
35
36 $query4 = $this->db->get_where('pr_users',array('username' => $this->input->post('username')));
37 if ($query4->num_rows() == 0) {
38 $this->db->insert('pr_users', $this);
39 return TRUE;
40 } else {
41 return FALSE;
42 }
43 }
44}
45
View:
1<!DOCTYPE html>
2<html lang="Zh-CN">
3<html>
4<head>
5 <meta charset="utf-8"/>
6 <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
7 <link rel="stylesheet" href="<?php echo base_url() . 'css/bootstrap.css' ?>">
8 <link rel="stylesheet" href="<?php echo base_url() . 'css/login.css' ?>">
9 <link rel="icon" type="image/x-icon" href="<?php echo base_url() . 'favicon.ico' ?>"/>
10 <script src="<?php echo base_url() . 'js/jquery-1.9.0.js' ?>"></script>
11 <script src="<?php echo base_url() . 'js/bootstrap.js' ?>"></script>
12 <title><?php echo $title; ?> - SMU Poster</title>
13</head>
14
15<body>
16<div class="container">
17 <div class="row">
18 <div class="col-sm-4 col-sm-offset-4">
19 <div <?php $err = validation_errors(); echo !(empty($error) && empty($err)) ? 'class="alert alert-danger text-center"' : '' ?>><?php echo validation_errors(); ?>
20 <?php echo $error ?></div>
21 <?php echo form_open('install', array('class'=>'form-horizontal','role'=>'form')); ?>
22 <div class="col-sm-sm-4 col-sm-offset-4"><h2>安装向导</h2></div>
23 <div class="form-group">
24 <div class="col-sm-9 col-sm-offset-2">
25 <div class="input-group">
26 <span class="input-group-addon"><span class="glyphicon glyphicon-cloud"></span></span>
27 <input type="text" class="form-control" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="一般为localhost" id="hostname" name="hostname" placeholder="主机名" value="localhost"/>
28 </div>
29 </div>
30 </div>
31 <div class="form-group">
32 <div class="col-sm-9 col-sm-offset-2">
33 <div class="input-group">
34 <span class="input-group-addon"><span class="glyphicon glyphicon-book"></span></span>
35 <input type="text" class="form-control" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="数据库名如poster,请自行创建" id="book" name="book" placeholder="数据库名"/>
36 </div>
37 </div>
38 </div>
39 <div class="form-group">
40 <div class="col-sm-9 col-sm-offset-2">
41 <div class="input-group">
42 <span class="input-group-addon"><span class="glyphicon glyphicon-user"></span></span>
43 <input type="text" class="form-control" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="连接数据库的账号" id="rootname" name="rootname" placeholder="数据库账号"/>
44 </div>
45 </div>
46 </div>
47 <div class="form-group">
48 <div class="col-sm-9 col-sm-offset-2">
49 <div class="input-group">
50 <span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span>
51 <input type="password" class="form-control" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="连接数据库的密码" id="pass" name="pass" placeholder="数据库密码"/>
52 </div>
53 </div>
54 </div>
55 <div class="form-group">
56 <div class="col-sm-9 col-sm-offset-2">
57 <div class="input-group">
58 <span class="input-group-addon"><span class="glyphicon glyphicon-user"></span></span>
59 <input type="text" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="注册一个后台超级管理员账号" class="form-control" id="username" name="username" placeholder="后台登录账号"/>
60 </div>
61 </div>
62 </div>
63 <div class="form-group">
64 <div class="col-sm-9 col-sm-offset-2">
65 <div class="input-group">
66 <span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span>
67 <input type="password" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="后台超级管理员密码" class="form-control" id="password" name="password" placeholder="后台登陆密码"/>
68 </div>
69 </div>
70 </div>
71 <div class="form-group">
72 <div class="col-sm-offset-3 col-sm-9">
73 <button type="submit" class="btn btn-default">开始安装</button>
74 </div>
75 </div>
76 </form>
77 </div>
78 </div>
79</div>
80<div id="footer">
81 <div class="container">
82 <p class="text-center copyright text-muted">Designed By <a href="http://mstc.shmtu.edu.cn/">微软技术俱乐部</a></p>
83 </div>
84</div>
85</body>
86</html>
87
评论 (0)