F3-fatfree小型php框架教程(六)数据库篇

既然是讲数据库的,那首先自然是连接数据库了。

这里举两个例子,mysql数据库:

$db=new DB\SQL(
    ‘mysql:host=localhost;port=3306;dbname=mysqldb‘,
    ‘admin‘,
    ‘p455w0rD‘);

sqlite数据库:

$db=new DB\SQL(‘sqlite:/absolute/path/to/your/database.sqlite‘));

数据库查询

很简单的,fatfree的数据库是不用配置的,很多东西都是内置的,当你需要改再去改就行,我们首先学习查询,就一步:

$f3->set(‘result‘,$db->exec(‘SELECT brandName FROM wherever‘));

这样就行了,select 和 from是数据库语言,我们这就把数据库中符合条件的变量放到了result数组里面了。

然后我们用之前学的repeat调用试试看:

<repeat group="{{ @result }}" value="{{ @item }}">
    <span>{{ @item.brandName  }}</span></repeat>

最后再echo一下就可以了。注意一下,这里其实是个二维数组,结构大概是result ->  brandName  -> value。可以用之前学过的嵌入repeat,但是这里既然brandName只有一个,那么就用 .  符号就可以解决问题了。

深造:

如果要执行一组命令怎么办?两种方法:

$db->exec(
    array(
        ‘DELETE FROM diet WHERE food="cola"‘,
        ‘INSERT INTO diet (food) VALUES ("carrot")‘,
        ‘SELECT * FROM diet‘
    ));

还有

$db->begin();$db->exec(‘DELETE FROM diet WHERE food="cola"‘);$db->exec(‘INSERT INTO diet (food) VALUES ("carrot")‘);$db->exec(‘SELECT * FROM diet‘);$db->commit();

当然,如果指令出错的话,调用就会回卷,我们可以通过调用:

echo $db->log();

来查看指令的调用状况。

数据库安全:

为了方式用户恶意修改数据库,我们应该用下面这个方法代替上面的代码:

$db->exec(
    array(
        ‘DELETE FROM diet WHERE food=:name‘,
        ‘INSERT INTO diet (food) VALUES (?)‘,
        ‘SELECT * FROM diet‘
    ),
    array(
        array(‘:name‘=>‘cola‘),
        array(1=>‘carrot‘),
        NULL
    ));

数据库的增删查改:

首先数据库文件的大概形式是这样的:

CREATE TABLE users (
    userID VARCHAR(30),
    password VARCHAR(30),
    visits INT,
    PRIMARY KEY(userID)
);

好,首先我们一步一步来,连接数据库

$db=new DB\SQL(
    ‘mysql:host=localhost;port=3306;dbname=mysqldb‘,
    ‘admin‘,
    ‘wh4t3v3r‘);

然后

$user=new DB\SQL\Mapper($db,‘users‘);$user->load(array(‘userID=?‘,‘tarzan‘));

上面的这个$user是我们建立的一个‘users’属性的结构对象(也就是上面那个数据库文件的形式),里面是空的。

第二行就是把userID = tarzan 的给读出来的,附属的信息都一起读出来了。

数据库的插入修改

继续上面的那个例子,如果我要修改这个类里面的访问量visits怎么办呢?

$user->visits++;$user->save();

这样就可以了。

如果要增加一个新的记录呢:

$user=new DB\SQL\Mapper($db,‘users‘);// or $user=new DB\Mongo\Mapper($db,‘users‘);// or $user=new DB\Jig\Mapper($db,‘users‘);$user->userID=‘jane‘;$user->password=md5(‘secret‘);$user->visits=0;$user->save();

有没有发现我们一直都在用save函数,因为如果不save的话这里修改的值就会在脚本运行结束的时候恢复回去的。

fatfree框架是很自动的,如果这里增加的userID是已经存在的用户,这里的增加就会自动变成修改操作,毕竟我们文件里最重要的那句

PRIMARY KEY(userID)

不是白白加上去的,这句话既是监控key值的作用(知道到底是插入还是修改操作)又是映射变量的作用。

当然,还有一点要注意的,如果你要连续修改(插入)需要reset一下:

$user->reset();$user->userID=‘cheetah‘;$user->password=md5(‘unknown‘);$user->save();

原理说一下,因为如果是进行了操作的话,映射类里面就会包含这个最新的操作,我们这个save就是把映射类里面的操作commit到数据库里面,但是如果你要继续下一个操作就要重新clear一下映射类,所以我们需要reset一下。养成良好习惯就是每当操作前reset一下,操作后save一下。

删除用户

$user=new DB\SQL\Mapper($db,‘users‘);$user->load(array(‘userID=? AND password=?‘,‘cheetah‘,‘ch1mp‘));$user->erase();

很简单,首先load该用户,然后erase就行了。用?是为了保护数据库不被看到。

POST变量与数据库传递

POST跟GET一样是全局变量,都是被set过的,可以近似地看作一个tmp,不过POST是不对用户公开的,所以常用语数据库。

从POST读取到新变量user里面:

$f3->set(‘user‘,new DB\SQL\Mapper($db,‘users‘));$f3->get(‘user‘)->copyFrom(‘POST‘);$f3->get(‘user‘)->save();

把user里面的东西给POST:

$f3->set(‘user‘,new DB\SQL\Mapper($db,‘users‘));$f3->get(‘user‘)->load(array(‘userID=?‘,‘jane‘));$f3->get(‘user‘)->copyTo(‘POST‘);

这里就是读取了jane的相关信息给了post。别忘了在php里面调用post是$_post,在fatfree里面就只要@POST就行。

继续,这里读取了jane的相关信息后,可以通过@POST.userID来调用信息。

例子:

<input type="text" name="userID" value="{{ @POST.userID }}">

这里的input类型是text文本输入,输入的信息存储到userID变量里,而后面那个value则是会在空格里显示的默认数据,就像我们登陆qq那样记录上一次登陆的用户名,用的就是上面这种方法。

条件筛选

$user=new DB\SQL\Mapper($db,‘users‘);$user->load(‘visits>3‘);// Rewritten as a parameterized query$user->load(array(‘visits>?‘,3));// For MongoDB users:// $user=new DB\Mongo\Mapper($db,‘users‘);// $user->load(array(‘visits‘=>array(‘$gt‘=>3)));// If you prefer Jig:// $user=new DB\Jig\Mapper($db,‘users‘);// $user->load(‘@visits>?‘,3);// Display the userID of the first record that matches the criteriaecho $user->userID;// Go to the next record that matches the same criteria$user->skip(); // Same as $user->skip(1);// Back to the first record$user->skip(-1);// Move three records forward$user->skip(3);

例子就说明得很清楚了,首先筛选出visits > 3 的user 然后再skip,其实skip就相当于是next,你要跳几步就skip几个,如果要回跳就skip(-1)。

可以用dry()函数来检验是否越界,如果在第一个skip(-1)或者在最后一个next,那么dry()都会返回一个true来表示已经越界了。

当然load函数还有一个特别的读取形式,类似于重载过一样:

$user->load(
    array(‘visits>?‘,3),
    array(
        ‘order‘=>‘userID DESC‘
        ‘offset‘=>5,
        ‘limit‘=>3
    ));

这句话的意思就相当于数据库语言里的:

SELECT * FROM users
WHERE visits>3
ORDER BY userID DESC
LIMIT 3 OFFSET 5;

还有个更简单的写法:

$page=$user->paginate(2,5,array(‘visits>?‘,3));

那个2跟5就是从第2个开始数5个

虚领域

首先给个表单:

CREATE TABLE products (
    productID VARCHAR(30),
    description VARCHAR(255),
    supplierID VARCHAR(30),
    unitprice DECIMAL(10,2),
    quantity INT,
    PRIMARY KEY(productID)
);

所谓的虚领域就是自己设定规则,举个例子:

$item=new DB\SQL\Mapper($db,‘products‘);$item->totalprice=‘unitprice*quantity‘;$item->load(array(‘productID=:pid‘,‘:pid‘=>‘apple‘));echo $item->totalprice;

这里设定的totalprice就是虚领域,默认等于unitprice * quantity 这个虚领域设定了之后其实就相当于里面的一个元素了,可以直接通过 -》 来调用。接着读取productID等于apple的元素然后返回这个虚领域也就是他们两个的乘积。

当然了,除了读取单个元素之外虚领域还可以在宏观上一些操作,例如取最大的数量:

$item->mostNumber=‘MAX(quantity)‘;$item->load();echo $item->mostNumber;

注意这里的load没有涉及任何变量,表示直接在全局里面load,然后就可以输出最大数字的元素了。

当然了,有时候你无法用一些现有的函数来表达你想要的东西,我们就可以通过数据库的语言来自己设立筛选条件:

$item->supplierName=
    ‘SELECT name FROM suppliers ‘.
    ‘WHERE products.supplierID=suppliers.supplierID‘;$item->load();echo $item->supplierName;

这里自己设定了筛选条件,就是把同名的找出来(一般如果有多个就默认第一个)

数据库查找

数据库查找要用到find函数:

$frequentUsers=$user->find(array(‘visits>?‘,3),array(‘order‘=>‘userID‘));

要注意,load跟find是完全不一样的,看名字就知道用途了,load是找出所有符合要求的然后我要对它进行操作或者运算,而find函数只要find到了就完事了,就只要看结果,不操作。而且还有一点不同,find因为工作是查找,所以会把找到的东西存起来,存到一个定义好的数组里面(后面会说)。也就是说哪些用于操作的skip,虚领域什么的都不能通过find实现。

我们来看看find函数的定义:

find(
    $criteria,
    array(
        ‘group‘=>‘foo‘,
        ‘order‘=>‘foo,bar‘,
        ‘limit‘=>5,
        ‘offset‘=>0
    ));

第一个是基本条件,作为第一步筛选,然后下面的都是额外筛选的条件,放在一个数组里面。

$place=new DB\SQL\Mapper($db,‘places‘);$list=$place->find(‘state="New York"‘);foreach ($list as $obj)
    echo $obj->city.‘, ‘.$obj->country;

这里假设定义好了一个城市的表,然后这里吧state = NEW York 的所有符合条件的映射都存到list数组里面了,然后下面通过foreach来调用查看结果。

接着上面的定义,如果我们不要筛选条件,要整个表搬走,可以用上cast()

$array=$place->cast();echo $array[‘city‘].‘, ‘.$array[‘country‘];

还有一个特别好用的函数count:

if (!$user->count(array(‘visits>?‘,10)))
    echo ‘We need a better ad campaign!‘;

这里是如果连一个访问量大于10的用户都没有,那我们就确实需要投广告了。。。

还有可以通过select来做一些比find更复杂的筛选,看看select的定义:

select(
    ‘foo, bar, MIN(baz) AS lowest‘,
    ‘foo > ?‘,
    array(
        ‘group‘=>‘foo, bar‘,
        ‘order‘=>‘baz ASC‘,
        ‘limit‘=>5,
        ‘offset‘=>3
    ));
时间: 2024-08-01 20:15:42

F3-fatfree小型php框架教程(六)数据库篇的相关文章

Laravel教程 六:表单 Forms

Laravel教程 六:表单 Forms 此文章为原创文章,未经同意,禁止转载. Form laravel 5.2 之后请使用 laravelcollective/html 替换 illuminate/html. 出现问题先看评论. 在开始之前,我们把界面先美化一点点先: 首先到https://github.com/JellyBool/blog-css-js得到静态文件,然后分别修改下面三个文件: 1. app.blade.php 2. articles/index.blade.php 3. a

一个简单的NetCore项目:1 - 搭建框架,生成数据库

1- 启动项目 安装.NETCORE SDK,教程在网上可以搜索的到,这里就不讲述了.简单粗暴的方式就是安装最新的VS2015. 2-搭建框架 2.1 打开VS新建一个项目,在弹出的新建项目对话框中,选中NET CORE选项,右边出现的选项就是.NET CORE的所有可建项目了.然后和创建传统.NET项目一样的创建项目就行了. PS:不理解的可以参考 园子里面翻译小组的文章 2.2 开始编写领域实体对象.这里是先实现一个简单的权限管理.所以现在GR.Core 类库中创建一个domain文件夹,然

HTML/CSS基础教程 六

表单 包含表单元素的区域, 表单元素是允许用户在表单中(文本框, 下拉列表, 单选框, 复选框等)输入信息的元素, 使用<form>标签定义. 文本域与密码域 <form> Username: <input type="text" name="firstname"> <br /> Password: <input type="password" name="lastname"

WIX 安装部署教程(六) 为你收集的七个知识点

前段时间整理5篇WIX(Windows Installer XML)的安装教程,但还不够完善,这里继续整理了七个知识点分享给大家.WIX最新版本3.8,点击下载 WIX安装部署(一)同MSBuild自动生成打包文件 WIX安装部署(二)自定义安装界面和行为 WIX安装部署(三)自定义安装界面和行为 WIX安装部署(四)添加安装文件及快捷方式 WIX安装部署(五)Bootstrap 捆绑安装 1.设置路径变量 有的时候路径过长,文件又比较多,重复粘贴一个地址总是不舒服,而且要改起来也很麻烦,那这个

Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis

https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=63 https://www.zhihu.com/question/29444491/answer/146457757 1. Java - Struts框架教程Struts 是Apache软件基金会(ASF)赞助的一个开源项目.通过采用JavaServlet/JSP技术,实现了基于Java EEWeb

Quartz 框架 教程(中文版)2.2.x

Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架 Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介 Quartz 框架 教程(中文版)2.2.x 之第三课 更多关于Jobs和JobDetails Quartz 框架 教程(中文版)2.2.x 之第四课 更多关于Triggers Quartz 框架 教程(中文版)2.2.x 之第五课 SimpleTrigger Quartz 框架 教程(中文版)2.2.x

python Django Wbe框架教程

python  Django Wbe框架教程 一.简介 Django 中提供了开发网站经常用到的模块,常见的代码都为你写好了,通过减少重复的代码,Django 使你能够专注于 web 应用上有 趣的关键性的东西.为了达到这个目标,Django 提供了通用Web开发模式的高度抽象,提供了频繁进行的编程作业的快速解决方法,以及为“如何解决问题”提供了清晰明了的约定.Django的理念是DRY(Don't Repeat Yourself)来鼓励快速开发! 让我们一览 Django 全貌 urls.py

打造android ORM框架opendroid(七)——数据库升级方案

在上一篇博客<打造android ORM框架opendroid(六)--级联查询>我们讲了OpenDroid最后一块功能查询的实现原理.今天我们将进行OpenDroid一个重头戏,也是本系列博客的最后一篇--数据库升级方案. 说道数据库升级,我可是很头疼的, 为什么呢? 因为以前的项目中,根本没有考虑数据库升级方案的问题,就直接drop table了,这样导致的结果就是"以前的数据都消失了".额... 凭空消失确实不是很少的一件事,如果数据不重要还行,重要数据呢? 说消失就

Flask实例教程六

Flask-SQLALchemy 是一个给你的应用添加 SQLALchemy 支持的 Flask 扩展.SQLALchemy 是Python语言的SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行,提供能兼容众多数据库(如 SQLite.MySQL.Postgres.Oracle.MS-SQL.SQLServer 和 Firebird)的企业级持久性模型. 一.为你的Flask应用加载Flask-SqlAlchemy扩展 from flask import Flask from fl