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

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

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

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


php学习路(五)-- Tp项目结构链接数据库_第1张图片
目录结构

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

再此点击页面


成功了

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

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

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

";
        $mysqlurl = C('DB_HOST');
        $user=M("users");
        echo $user;
    }
}

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


php学习路(五)-- Tp项目结构链接数据库_第2张图片
image.png

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

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


php学习路(五)-- Tp项目结构链接数据库_第3张图片
image.png

此时已经有了对myql的支持,表示扩展安装成功了。再去看页面,也没有那个错误了。

下面我们进行sql查询

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']="凯[email protected]";
        $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程序员来说,真是羡慕嫉妒恨啊!!!!

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

你可能感兴趣的:(php学习路(五)-- Tp项目结构链接数据库)