php项目 数据库 报告,php学习路(五)-- Tp项目结构链接数据库

本文详细介绍了如何在ThinkPHP项目中配置数据库,包括MySQL连接、配置文件编写、pdo_mysql扩展安装和基本SQL操作。作者还探讨了M函数的使用,以及数据库操作的最佳实践,如关联查询和分组查询。
摘要由CSDN通过智能技术生成

上一步中,我们终于访问到php的页面,环境总算搭建告一段落,下面进行项目代码阶段。首先看看我们访问项目页面后,项目目录的变化

#官网介绍

Application 默认应用目录(可以设置)

├─Common 公共模块(不能直接访问)

├─Home 前台模块

├─Admin 后台模块

├─... 其他更多模块

├─Runtime 默认运行时目录(可以设置)

Application本来是空目录,此时,会自动生成如上的目录。我们看看实际的

2ec1490b61df?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

目录结构

在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!';

}

}

再此点击页面

2ec1490b61df?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

成功了

第一步、配置数据库

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;

}

}

悲哀的是,我们报错了。。。

2ec1490b61df?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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是没有的!!!这是安装好后的信息

2ec1490b61df?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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()的方法查看

2ec1490b61df?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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);

}

}

页面展示

2ec1490b61df?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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程序员来说,真是羡慕嫉妒恨啊!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值