PHP-Phalcon框架中的数据库操作
本文描述了PHP-Phalcon框架中数据库操作方法,主要讨论Phalcon框架的Model组件中的操作方法。更详细的Model介绍请参考:官方文档
1. 连接数据库
在Phalcon框架中,通过在DI中注入db参数来实现数据库的连接和配置,基本的配置方法如下:
use Phalcon\Db\Adapter\Pdo\Mysql as DbAdapter;
$di->set('db', function () {
return new DbAdapter(array(
"host" => "localhost",
"username" => "root",
"password" => "",
"dbname" => "test"
));
});
通过在$di中设置'db'的连接属性,包括host,username,password,dbname等属性来获取数据库参数,配置好db之后就可以利用Phalcon中的ORM框架了。
另一种通过配置文件的方法如下:
1.首先需要将数据信息写入配置文件,在Phalcon中支持ini, php, json等三种配置文件形式,以下为ini形式的配置文件。
[database]
adapter = Mysql
host = localhost
username = root
password =
dbname = test
2.利用配置文件将数据库信息写入DI
$di->set('db', function () use ($config) {
$config = $config->get('database')->toArray();
$dbClass = 'Phalcon\Db\Adapter\Pdo\\' . $config['adapter'];
unset($config['adapter']);
return new $dbClass($config);
});
2. 建立数据库表
在MySQL中建立数据库表,如下所示:
CREATE TABLE `customer` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`password` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
以上语句建立了一个customer表,包括主键id,以及username和password两个字段。
3. 创建模型
根据上述数据库表,创建Customer.php模型类,需要注意的是模型类必须继承Phalcon\MVC\Model类,并且采用与数据库表名一致的驼峰命名法。因此建立如下的Customer类:
class Customer extends \Phalcon\Mvc\Model
{
//采用默认的对应规则会自动映射数据库表的字段,可以不写
/**
*
* @var integer
*/
public $id;
/**
*
* @var string
*/
public $username;
/**
*
* @var string
*/
public $password;
/**
* Returns table name mapped in the model.
*
* @return string
*/
public function getSource()
{
return 'customer';
}
}
其实只要满足了对应的命名规则,模型类中的属性是不需要定义的,这里定义的目的是方便开发过程中查看,并且可以提高性能;此外,如果没有采用数据库表名对应的类名进行命名的话,就需要在初始化函数中通过setSource方法进行配置,配置代码:
public function initialize()
{
$this->setSource("tablename");
}
从这里可以看出,在现代的Web开发框架中,都遵循约定大于配置(CoC)的基本原则。只要遵循约定,就可以很方便的进行Web开发。
4. 数据库操作
在Phalcon中操作数据库提供了基本的ORM映射方式以及更加复杂的PHQL方式。ORM映射方式支持不写SQL语句直接操作数据库,基本上已经提供了绝大多数使用场景的支持;另一种更为高级的PHQL方式,支持编写Phalcon化的SQL语句来操作数据库。这里不编写SQL语句,直接使用ORM映射本身提供的一切功能。
4.1 添加数据
如果我想添加一条数据,最基本的方式演示如下:
- 新建一个控制器DatabaseController
- 在控制器中添加InsertAction
- 在InsertAction中写入下列代码:
public function insertAction()
{
$customer = new Customer();
$customer->username = 'liyi';
$customer->password = '123456';
$ret = $customer->save();
if($ret){
print_r('插入成功');
} else {
print_r('插入失败');
}
}
4.2 查询数据
1.find方法
Phalcon中提供了静态方法find,采用find方法可以返回表中符合条件的所有数据:
public function findAction()
{
$customers = Customer::find();
$result = [];
foreach ($customers as $customer) {
$result[] = [
'username' => $customer->username,
'password' => $customer->password,
];
}
$this->response->setContentType('application/json', 'UTF-8');
return $this->response->setJsonContent($result);
}
调用类的静态方法find()会返回包含有customer数据表内容的结果集,对于结果集的处理通常采用foreach进行遍历,如代码所示,对遍历的每一个对象调取属性值,然后赋值给关联数组。
2.findFirst方法
Phalcon中的findFirst方法与find方法的使用方式几乎无异,其区别在于findFirst方法的返回结果为单值,不需要通过foreach遍历获取每个值,在下面的代码中演示了查询数据库表中username字段值等于'liyi'的记录。
public function findfirstAction()
{
$customer = Customer::findFirst("username = 'liyi'");
$result = [
'username' => $customer->username,
'password' => $customer->password,
];
$this->response->setContentType('application/json', 'UTF-8');
return $this->response->setJsonContent($result);
}
3.findBy<属性>方法
在Phalcon框架中支持findBy<属性>的扩展查询,在上例中,可以把条件语句改为findFirstByUsername,同时省略查询条件,结果不变。
$customer = Customer::findFirstByUsername('kirineko');
4.参数化查询语句
如果需要查询的内容较多,或者是从防止SQL注入的安全角度来考虑,应当使用参数化的查询语句。比如如果需要从数据库中查找username=(@用户输入的值)并且password=(@用户输入的值)的用户,那么就应当使用参数化查询。
下面模拟用户登录的过程,用户输入用户名和密码,然后系统在数据库中进行查找,如果找到则返回欢迎页,如果没有找到,就提示错误信息。
public function loginAction()
{
$username = $this->request->getPost('username');
$password = $this->request->getPost('password');
$conditons = 'username = :username: and password = :password:';
$parameters = [
'username' => $username,
'password' => $password,
];
$ret = Customer::findFirst(
[
$conditons,
'bind' => $parameters,
]);
if($ret){
print_r('login success');
} else {
print_r('login failed');
}
}
4.3 更新数据
更新数据的方法通常是先查询数据,如果能查到数据就对数据进行赋值,然后save即可。现在要更新用户名为kirineko的密码为用户指定的密码,代码如下:
public function updateAction()
{
$password = $this->request->getPost('password');
$newpassword = $this->request->getPost('newpassword');
$conditons = 'username = :username: and password = :password:';
$parameters = [
'username' => 'kirineko',
'password' => $password,
];
$customer = Customer::findFirst([
$conditons,
'bind' => $parameters,
]);
if($customer){
$customer->password = $newpassword;
$customer->save();
print_r('更新成功');
} else {
print_r('用户名不存在或密码错误');
}
}
4.4 删除数据
Phalcon的提供了delete命令用于删除,现要删除用户名为liyi的数据,代码如下:
public function deleteAction()
{
$customer = Customer::findFirstByUsername('liyi');
if($customer){
$res = $customer->delete();
if($res) {
print_r('删除成功');
} else {
print_r('删除失败');
}
} else {
print_r('用户不存在');
}
}
PHP-Phalcon框架中的数据库操作的更多相关文章
- 混合框架中Oracle数据库的还原处理操作
在较早期的随笔<Oracle如何实现创建数据库.备份数据库及数据导出导入的一条龙操作>粗略介绍了Oracle数据库的备份还原操作,本文想从开发框架的基础上介绍Oracle数据库的脚本或者还 ...
- Laravel框架中的数据库CURD操作、连贯操作、链式操作的用法
Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...
- 八:SpringBoot-集成JPA持久层框架,简化数据库操作
SpringBoot-集成JPA持久层框架,简化数据库操作 1.JPA框架简介 1.1 JPA与Hibernate的关系: 2.SpringBoot整合JPA Spring Data JPA概述: S ...
- android中的数据库操作(转)
android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库 an ...
- android中的数据库操作(SQLite)
android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库 an ...
- CI中的数据库操作以及AR连贯操作
要使用CI中的数据库操作,首先我们应该在CI的 application/config/databass.php 文件中配置数据库信息,通常就是配置主机名,用户名,密码,数据库名,表前缀(dbprefi ...
- Android中SQLite数据库操作(1)——使用SQL语句操作SQLite数据库
下面是最原始的方法,用SQL语句操作数据库.后面的"Android中SQLite数据库操作(2)--SQLiteOpenHelper类"将介绍一种常用的android封装操作SQL ...
- Python框架学习之Flask中的数据库操作
数据库操作在web开发中扮演着一个很重要的角色,网站中很多重要的信息都需要保存到数据库中.如用户名.密码等等其他信息.Django框架是一个基于MVT思想的框架,也就是说他本身就已经封装了Model类 ...
- iOS 中SQLite数据库操作
在iOS中实现SQLite数据库的操作:1.导入框架(libsqlite3.0.tbd) 2.导入头文件<sqlite3.h> 3.实现数据的增删改查 实现简单 SQLite数据库操作 的 ...
随机推荐
- VC6.0编译boost
今天学习了下VC6.0下boost的编译,只是对regex进行了编译,据说全部编译需要2个多小时,在此记录下学习过程中遇到的问题以便今后查看. 最开始直接从网上(www.boost.org)下载了当前 ...
- 弹性布局-flex
浅谈display:flex display:flex 意思是弹性布局 首先flex的出现是为了解决哪些问题呢? 一.页面行排列布局 像此图左右两个div一排显示 可以用浮动的布局方式 html部 ...
- 实验九--裸机LCD
一.环境 系统:ubuntu12.04 开发板:jz2440 编译器:gcc 二.说明 有空补上 三.代码 Makefile: CC = arm-linux-gcc LD = arm-linux-ld ...
- C#简单的加密类
1.加密 public class EncryptHepler { // 验值 static string saltValue = "XXXX"; // 密码值 static st ...
- jQuery 滑动方法slideDown向下滑动元素
通过 jQuery可以在元素上创建滑动效果,jQuery slideDown() 方法用于向下滑动元素. jQuery 滑动方法 通过 jQuery,您可以在元素上创建滑动效果. jQuery 拥有以 ...
- COALESCE在SQL拼接中的大用途
SQL拼接可以使得代码比较灵活,不会那么死板,对于维护也比较方便. 下面是简单的SQL拼接,同时也包含了隐式游标的概念吧,可以遍历表中的每一个字段 -------------------------- ...
- oracle 存储过程编辑 卡死
一.可用SYS登录, 二.查锁session_ID查找存储过程OPERATIONDATA_IMP被哪些session锁住而无法编译select * FROM dba_ddl_locks where n ...
- Mysql 实例分析连接
表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a20050113 4 ...
- WPF TextBox 的 EventTrigger & 重写控件
遇到一个需求,在textbox获得焦点的时候,调用一个外部的软键盘. 这可以用两个不同的方法来达到目的. 1.EventTrigger 首先定义一个Style <Style x:Key=&quo ...
- 【原创】CHROME 最小字体限制为12PX的终极解决方案
CHROME 最小字体限制为12PX的终极解决方案 本文由五月雨恋提供,转载请注明出处. 相信不少做网站的用户会有这样一个问题,Chrome 默认最小字体是12px(最新版英文也有此问题),这个是 C ...