上一步中,我们终于访问到php的页面,环境总算搭建告一段落,下面进行项目代码阶段。首先看看我们访问项目页面后,项目目录的变化
#官网介绍
Application 默认应用目录(可以设置)
├─Common 公共模块(不能直接访问)
├─Home 前台模块
├─Admin 后台模块
├─... 其他更多模块
├─Runtime 默认运行时目录(可以设置)
Application本来是空目录,此时,会自动生成如上的目录。我们看看实际的
目录结构
在Home/Contoller下此时有IndexController类,正是我们刚才看到的欢迎页。
稍微改下,试试
#相当于当前包目录在Home\Controller
namespace Home\Controller;
#表示引用Think\Controller类
use Think\Controller;
#IndexController继承了Controller
class IndexController extends Controller
{
public function index()
{
echo 'hello,world!';
}
}
再此点击页面
成功了
第一步、配置数据库
Home/conf下有个config.php是默认当前模块的配置文件,
return array(
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => '192.168.2.104', // 服务器地址,因为数据和服务部署到一个虚拟机,直接写ip
'DB_NAME' => 'demotp', // 数据库名
'DB_USER' => 'root', // 用户名
'DB_PWD' => '123456', // 密码
'DB_PORT' => 3306, // 端口
'DB_CHARSET'=> 'utf8', // 字符集
'DB_DEBUG' => true, // 数据库调试模式 开启后可以记录SQL日志 3.2.3新增
);
下面展示下我们测试的数据库结构
--用户表
CREATE TABLE `demotp`.users (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL,
`mail` varchar(32) DEFAULT NULL,
`sex` int(11) DEFAULT NULL,
`level` int(11) DEFAULT NULL,
`p_id` int(11) DEFAULT NULL,
`CREATE_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`deploy_name` varchar(64) DEFAULT NULL,
`status` varchar(16) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
--密码表
CREATE TABLE
`demotp`.password
(
id BIGINT(20) NOT NULL AUTO_INCREMENT primary key,
--对应用户id
user_id BIGINT(20) NOT null,
pass VARCHAR(64),
pass_type VARCHAR(16),
index(user_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8
--初始化测试数据
INSERT INTO users (id, name, mail, sex, level, p_id, CREATE_TIME, update_time, deploy_name, status) VALUES (1, 'nina', 'nina@111', 0, 2, 1, '2019-01-01 08:15:56', '2019-01-01 08:25:56', '管理员', 'ACTIVE');
INSERT INTO users (id, name, mail, sex, level, p_id, CREATE_TIME, update_time, deploy_name, status) VALUES (2, 'kai.yang', 'kai.yang@163.com', 1, 1, 0, '2019-01-01 08:25:56', '2019-01-01 08:25:56', '凯爷', 'FROZEEN');
INSERT INTO password (id, user_id, pass, pass_type) VALUES (1, 2, '654321', 'LOGIN');
INSERT INTO password (id, user_id, pass, pass_type) VALUES (2, 1, '123455', 'LOGIN');
如上的配置就是我们php将要测试的mysql配置了,下面我们代码连一下,测试下基本功能
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller
{
public function index()
{
echo 'hello,world!';
echo "
";
$mysqlurl = C('DB_HOST');
$user=M("users");
echo $user;
}
}
悲哀的是,我们报错了。。。
image.png
我们查了下,是因为php的pdo_mysql扩展没有安装扩展包,继续度娘,
网上大多会有从什么地址下载安装包,去安装,但我试过发现,这种方法不靠谱,很容易出现版本不兼容问题。pdo_mysql扩展包安装总结安法如下:
先代码中用phpinfo()查看信息
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller
{
public function index()
{
phpinfo();
echo "
";
$user=M("users");
echo $user;
}
}
此时页面刷新,展示,当时这个mysql是没有的!!!这是安装好后的信息
image.png
如果没有mysql则说明,pdo_mysql的确没安装好
#首先虚拟机上输入命令
[root@10 extensions]# php --ini
# 此时我查看到
Loaded Configuration File: (none)
Scan for additional .ini files in: (none)
Additional .ini files parsed: (none)
# Loaded Configuration File: (none)这行信息显示了php.ini 的配置文件位置,如果为none,表示并没有加载到此文件,因为这个错,我找了好久
#此时我又查到我php启动时配置了--with-config-file-path=/usr/local/php/etc参数,表示我对应配置文件应该放到这个目录下,所以我找的我们的php.ini文件拷贝到这个目录下,在执行php --ini,此时Loaded Configuration File: /usr/local/php/etc/php.ini有值了
Configuration File (php.ini) Path: /usr/local/php/etc
Loaded Configuration File: /usr/local/php/etc/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed: (none)
#上边又说了最好不要从网上下mysql扩展包,所以我找的php安装包中的扩张包
[root@10 lib]# find / -name pdo_mysql
/mnt/php-7.2.12/ext/pdo_mysql
/mnt/php-7.2.12/travis/ext/pdo_mysql
#我找到好几个,然后选择/mnt/php-7.2.12/ext/pdo_mysql进行编译,
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-mysql=mysqlnd
make && make install
#此时就会在类似/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718这个目录下生成.so文件(在日志上有记录,如果没注意,可以find / -name pdo_mysql.so查看),
[root@10 no-debug-non-zts-20170718]# ls
mongodb.so mysql.so opcache.a opcache.so pdo.so
#这是默认生成扩张.so的目录,我是把他们都是拷贝到了/usr/lib64/php/module目录下,然后编辑php.ini
vi php.ini
#这里有个技巧是因为配置文件太长,不好找,最好先输入:set number显示行数,方便查找,找到后,我指定如下配置
883 extension_dir="/usr/lib64/php/modules/"
915 extension=pdo_mysql
#extension_dir指定.so文件目录,extension添加pdo_mysql扩展(linux不用加后缀,和其他;后到默认保持一致即可),
#然后我们重启php-fpm
service php-fpm restart
此时再用上边页面打印phpinfo()的方法查看
image.png
此时已经有了对myql的支持,表示扩展安装成功了。再去看页面,也没有那个错误了。
下面我们进行sql查询
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller
{
public function index()
{
$user=M("users");
$data=$user->select();
print_r($data);
}
}
页面展示
image.png
这就表示我们查询成功了,我们用的当然是入门的简单用法,M函数自动加载统一模块下的config.php文件里的数据库配置,然后找到表users,进行查询。下面我们说下M的一些用法
手动指定数据库使用
例如,在项目配置文件中配置了:
'DB_CONFIG'=>'mysql://user_a:1234@localhost:3306/thinkphp';
则可以使用:
`$User = M('User','think_','DB_CONFIG');`
新增数据
$user=M("users");
$newData['mail']="凯1@sss.com";
$newData['sex']="1";
$newData['name']="季1";
$newData['level']="0";
$user->add($newData);
删除数据+where条件
$user = M("users");
$user->where("id=3")->delete();
查询+where条件
$user = M("users");
$name="kai";
$date1=$user->where("name like '$name%'")->select();
print_r($date1);
复杂条件,参考对比语法
eq 等于
neq 不等于
gt 大于
egt 大于等于
lt 小于
elt 小于等于
like LIKE
between BETWEEN
notnull IS NUT NULL
null IS NULL
对应代码应用
#第一种方法
echo "第一种方法查询
";
$user = M("users");
$name="kai";
$endTime=date('Y-m-d H:m:s',time());
$startTime="2018-12-01 00:00:00";
$where=array();
$where['name']=array('like','%kai%');
$where['CREATE_TIME']=array('elt',$endTime);
$where['CREATE_TIME']=array('egt',$startTime);
$date1=$user->where($where)->select();
print_r($date1);
echo "
";
//第二种方法
echo "第二种方法查询
";
$user2=M("");
$query_id=1;
$sql="select u.name,p.pass from users u left join password p on u.id=p.user_id where u.id=$query_id";
$res=$user2->query($sql);
$user2->execute($sql);
print_r($res);
显然第一种其实,我们是实现了个"$where"变量的map数据进行存储查询条件,
对于较复杂的变量我们可以用如上的类似于eq这种写法进行数组模式存储,作为条件。简单的可以直接用“=”存储数值,如
$where['name']="kai.yang"
而第二种方法是直接简单sql拼接的方式,但这种显然存在sql注入的风险,谨慎使用,那第一种怎么实现一些关联查询,分组查询呢?
当然,其中涉及时间格式的转换,需要大家注意下
time() 获取当前时间
date('Y-m-d H:m:s',time()); 可以将时间转成规定的2018-12-01 00:00:00格式字符串
。。。。。
关联分组查询
分组
$model=M("users");
#分组count函数
$result=$model->field('count(name) num,name')->group('name')->select();
print_r($result);
关联
$model=M("users u");
$map=array();
$map["CREATE_TIME"]=array('egt',$startTime);
$map["CREATE_TIME"]=array('elt',$endTime);
$result=$model->field("u.name,p.pass")->join("left join password p on u.id=p.user_id")
->where($map)->limit(2)->select();
$this->printArray($result);
如上join函数拼接关联表,M函数中可以加上别名,limit函数可以加上行数限制,是不是很简单,很方便!!
总结,thinkphp对于数据库操作的函数支持很多,如
order,limit,group,join。。。等等,基本上你所用到的sql语法都能找到对应语法,方便你使用。对于我这中正宗java程序员来说,真是羡慕嫉妒恨啊!!!!