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

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

#官网介绍
Application      默认应用目录(可以设置)
├─Common         公共模块(不能直接访问)
├─Home           前台模块
├─Admin          后台模块
├─...            其他更多模块
├─Runtime        默认运行时目录(可以设置)

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


目录结构

在Home/Contoller下此时有IndexController类,正是我们刚才看到的欢迎页。
稍微改下,试试

<?php
#相当于当前包目录在Home\Controller
namespace Home\Controller;
#表示引用Think\Controller类
use Think\Controller;
#IndexController继承了Controller
class IndexController extends Controller
{
    public function index()
    {
        echo 'hello,world!';
    }
}

再此点击页面


成功了

具体项目规范可以参考http://document.thinkphp.cn/manual_3_2.html#read_config
,我们讲下我们实际的使用

第一步、配置数据库
Home/conf下有个config.php是默认当前模块的配置文件,

<?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配置了,下面我们代码连一下,测试下基本功能

<?php

namespace Home\Controller;

use Think\Controller;

class IndexController extends Controller
{
    public function index()
    {
        echo 'hello,world!';
        echo "<br/>";
        $mysqlurl = C('DB_HOST');
        $user=M("users");
        echo $user;
    }
}

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


image.png

我们查了下,是因为php的pdo_mysql扩展没有安装扩展包,继续度娘,
网上大多会有从什么地址下载安装包,去安装,但我试过发现,这种方法不靠谱,很容易出现版本不兼容问题。pdo_mysql扩展包安装总结安法如下:
先代码中用phpinfo()查看信息

<?php

namespace Home\Controller;

use Think\Controller;

class IndexController extends Controller
{
    public function index()
    {
        phpinfo();
        echo "<br/>";
        $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查询

<?php

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 "第一种方法查询<br/>";
        $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 "<br/>";
        //第二种方法
        echo "第二种方法查询<br/>";
        $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程序员来说,真是羡慕嫉妒恨啊!!!!

目录:php学习路-- Thinkphp开发入门指南简介

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容