本文描述了PHP-Phalcon框架中数据库操作方法,主要讨论Phalcon框架的Model组件中的操作方法。更详细的Model介绍请参考:官方文档


1. 连接数据库

在Phalcon框架中,通过在DI中注入db参数来实现数据库的连接和配置,基本的配置方法如下:

  1. use Phalcon\Db\Adapter\Pdo\Mysql as DbAdapter;
  2. $di->set('db', function () {
  3. return new DbAdapter(array(
  4. "host" => "localhost",
  5. "username" => "root",
  6. "password" => "",
  7. "dbname" => "test"
  8. ));
  9. });

通过在$di中设置'db'的连接属性,包括host,username,password,dbname等属性来获取数据库参数,配置好db之后就可以利用Phalcon中的ORM框架了。

另一种通过配置文件的方法如下:

1.首先需要将数据信息写入配置文件,在Phalcon中支持ini, php, json等三种配置文件形式,以下为ini形式的配置文件。

  1. [database]
  2. adapter = Mysql
  3. host = localhost
  4. username = root
  5. password =
  6. dbname = test

2.利用配置文件将数据库信息写入DI

  1. $di->set('db', function () use ($config) {
  2. $config = $config->get('database')->toArray();
  3. $dbClass = 'Phalcon\Db\Adapter\Pdo\\' . $config['adapter'];
  4. unset($config['adapter']);
  5. return new $dbClass($config);
  6. });

2. 建立数据库表

在MySQL中建立数据库表,如下所示:

  1. CREATE TABLE `customer` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `username` varchar(255) DEFAULT NULL,
  4. `password` varchar(32) DEFAULT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

以上语句建立了一个customer表,包括主键id,以及username和password两个字段。

3. 创建模型

根据上述数据库表,创建Customer.php模型类,需要注意的是模型类必须继承Phalcon\MVC\Model类,并且采用与数据库表名一致的驼峰命名法。因此建立如下的Customer类:

  1. class Customer extends \Phalcon\Mvc\Model
  2. {
  3. //采用默认的对应规则会自动映射数据库表的字段,可以不写
  4. /**
  5. *
  6. * @var integer
  7. */
  8. public $id;
  9. /**
  10. *
  11. * @var string
  12. */
  13. public $username;
  14. /**
  15. *
  16. * @var string
  17. */
  18. public $password;
  19. /**
  20. * Returns table name mapped in the model.
  21. *
  22. * @return string
  23. */
  24. public function getSource()
  25. {
  26. return 'customer';
  27. }
  28. }

其实只要满足了对应的命名规则,模型类中的属性是不需要定义的,这里定义的目的是方便开发过程中查看,并且可以提高性能;此外,如果没有采用数据库表名对应的类名进行命名的话,就需要在初始化函数中通过setSource方法进行配置,配置代码:

  1. public function initialize()
  2. {
  3. $this->setSource("tablename");
  4. }

从这里可以看出,在现代的Web开发框架中,都遵循约定大于配置(CoC)的基本原则。只要遵循约定,就可以很方便的进行Web开发。

4. 数据库操作

在Phalcon中操作数据库提供了基本的ORM映射方式以及更加复杂的PHQL方式。ORM映射方式支持不写SQL语句直接操作数据库,基本上已经提供了绝大多数使用场景的支持;另一种更为高级的PHQL方式,支持编写Phalcon化的SQL语句来操作数据库。这里不编写SQL语句,直接使用ORM映射本身提供的一切功能。


4.1 添加数据


如果我想添加一条数据,最基本的方式演示如下:

  1. 新建一个控制器DatabaseController
  2. 在控制器中添加InsertAction
  3. 在InsertAction中写入下列代码:
  1. public function insertAction()
  2. {
  3. $customer = new Customer();
  4. $customer->username = 'liyi';
  5. $customer->password = '123456';
  6. $ret = $customer->save();
  7. if($ret){
  8. print_r('插入成功');
  9. } else {
  10. print_r('插入失败');
  11. }
  12. }

4.2 查询数据


1.find方法

Phalcon中提供了静态方法find,采用find方法可以返回表中符合条件的所有数据:

  1. public function findAction()
  2. {
  3. $customers = Customer::find();
  4. $result = [];
  5. foreach ($customers as $customer) {
  6. $result[] = [
  7. 'username' => $customer->username,
  8. 'password' => $customer->password,
  9. ];
  10. }
  11. $this->response->setContentType('application/json', 'UTF-8');
  12. return $this->response->setJsonContent($result);
  13. }

调用类的静态方法find()会返回包含有customer数据表内容的结果集,对于结果集的处理通常采用foreach进行遍历,如代码所示,对遍历的每一个对象调取属性值,然后赋值给关联数组。

2.findFirst方法

Phalcon中的findFirst方法与find方法的使用方式几乎无异,其区别在于findFirst方法的返回结果为单值,不需要通过foreach遍历获取每个值,在下面的代码中演示了查询数据库表中username字段值等于'liyi'的记录。

  1. public function findfirstAction()
  2. {
  3. $customer = Customer::findFirst("username = 'liyi'");
  4. $result = [
  5. 'username' => $customer->username,
  6. 'password' => $customer->password,
  7. ];
  8. $this->response->setContentType('application/json', 'UTF-8');
  9. return $this->response->setJsonContent($result);
  10. }

3.findBy<属性>方法

在Phalcon框架中支持findBy<属性>的扩展查询,在上例中,可以把条件语句改为findFirstByUsername,同时省略查询条件,结果不变。

  1. $customer = Customer::findFirstByUsername('kirineko');

4.参数化查询语句

如果需要查询的内容较多,或者是从防止SQL注入的安全角度来考虑,应当使用参数化的查询语句。比如如果需要从数据库中查找username=(@用户输入的值)并且password=(@用户输入的值)的用户,那么就应当使用参数化查询。

下面模拟用户登录的过程,用户输入用户名和密码,然后系统在数据库中进行查找,如果找到则返回欢迎页,如果没有找到,就提示错误信息。

  1. public function loginAction()
  2. {
  3. $username = $this->request->getPost('username');
  4. $password = $this->request->getPost('password');
  5. $conditons = 'username = :username: and password = :password:';
  6. $parameters = [
  7. 'username' => $username,
  8. 'password' => $password,
  9. ];
  10. $ret = Customer::findFirst(
  11. [
  12. $conditons,
  13. 'bind' => $parameters,
  14. ]);
  15. if($ret){
  16. print_r('login success');
  17. } else {
  18. print_r('login failed');
  19. }
  20. }

4.3 更新数据


更新数据的方法通常是先查询数据,如果能查到数据就对数据进行赋值,然后save即可。现在要更新用户名为kirineko的密码为用户指定的密码,代码如下:

  1. public function updateAction()
  2. {
  3. $password = $this->request->getPost('password');
  4. $newpassword = $this->request->getPost('newpassword');
  5. $conditons = 'username = :username: and password = :password:';
  6. $parameters = [
  7. 'username' => 'kirineko',
  8. 'password' => $password,
  9. ];
  10. $customer = Customer::findFirst([
  11. $conditons,
  12. 'bind' => $parameters,
  13. ]);
  14. if($customer){
  15. $customer->password = $newpassword;
  16. $customer->save();
  17. print_r('更新成功');
  18. } else {
  19. print_r('用户名不存在或密码错误');
  20. }
  21. }

4.4 删除数据


Phalcon的提供了delete命令用于删除,现要删除用户名为liyi的数据,代码如下:

  1. public function deleteAction()
  2. {
  3. $customer = Customer::findFirstByUsername('liyi');
  4. if($customer){
  5. $res = $customer->delete();
  6. if($res) {
  7. print_r('删除成功');
  8. } else {
  9. print_r('删除失败');
  10. }
  11. } else {
  12. print_r('用户不存在');
  13. }
  14. }

PHP-Phalcon框架中的数据库操作的更多相关文章

  1. 混合框架中Oracle数据库的还原处理操作

    在较早期的随笔<Oracle如何实现创建数据库.备份数据库及数据导出导入的一条龙操作>粗略介绍了Oracle数据库的备份还原操作,本文想从开发框架的基础上介绍Oracle数据库的脚本或者还 ...

  2. Laravel框架中的数据库CURD操作、连贯操作、链式操作的用法

    Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...

  3. 八:SpringBoot-集成JPA持久层框架,简化数据库操作

    SpringBoot-集成JPA持久层框架,简化数据库操作 1.JPA框架简介 1.1 JPA与Hibernate的关系: 2.SpringBoot整合JPA Spring Data JPA概述: S ...

  4. android中的数据库操作(转)

    android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   an ...

  5. android中的数据库操作(SQLite)

    android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   an ...

  6. CI中的数据库操作以及AR连贯操作

    要使用CI中的数据库操作,首先我们应该在CI的 application/config/databass.php 文件中配置数据库信息,通常就是配置主机名,用户名,密码,数据库名,表前缀(dbprefi ...

  7. Android中SQLite数据库操作(1)——使用SQL语句操作SQLite数据库

    下面是最原始的方法,用SQL语句操作数据库.后面的"Android中SQLite数据库操作(2)--SQLiteOpenHelper类"将介绍一种常用的android封装操作SQL ...

  8. Python框架学习之Flask中的数据库操作

    数据库操作在web开发中扮演着一个很重要的角色,网站中很多重要的信息都需要保存到数据库中.如用户名.密码等等其他信息.Django框架是一个基于MVT思想的框架,也就是说他本身就已经封装了Model类 ...

  9. iOS 中SQLite数据库操作

    在iOS中实现SQLite数据库的操作:1.导入框架(libsqlite3.0.tbd) 2.导入头文件<sqlite3.h> 3.实现数据的增删改查 实现简单 SQLite数据库操作 的 ...

随机推荐

  1. Windows Phone 中查找可视化树中的某个类型的元素

    private void StackPanel_Tap(object sender, TappedRoutedEventArgs e) { //获取到的对象是ListBoxItem ListBoxIt ...

  2. 【风马一族_Android】Android 前端内容

    Android 前端内容 4.1 View 类概述 4.1.1 关于 View //类型说明 view(视图)指的是用户界面组件的基本构建基块.一个视图占据屏幕上的矩形区域,负责绘图和事件处理.视图是 ...

  3. 《Apache服务用户身份验证管理》RHEL6.3

    1.安装apache软件包 Yum install httpd 2.启动apache服务 /etc/init.d/httpd restart 3.创建一个目录,内编辑一个index.html文件 4. ...

  4. Java 多线程的基本概念

    一.线程介绍 多线程同时运行时,单CPU系统实际上是分给每个线程固定的时间片,用这种方式使得线程“看起来像是并行的”.在多CPU系统中,每个CPU可以单独运行一个线程,实现真正意义上的并行,但是如果线 ...

  5. WPF 绑定五(本身就是数据源)

    xaml: <Window x:Class="WpfApplication1.Window5" xmlns="http://schemas.microsoft.co ...

  6. C#中gridView常用属性和技巧介绍

    .隐藏最上面的GroupPanel gridView1.OptionsView.ShowGroupPanel=false; .得到当前选定记录某字段的值 sValue=Table.Rows[gridV ...

  7. Spark菜鸟学习营Day6 分布式代码运行调试

    Spark菜鸟学习营Day6 分布式代码运行调试 作为代码调试,一般会分成两个部分 语法调试,也就是确定能够运行 结果调试,也就是确定程序逻辑的正确 其实这个都离不开运行,所以我们说一下如何让开发的S ...

  8. IDEA操作GIT说明

    公司的代码库从TFS升级到了GIT,我们的自动化测试代码就需要迁移到git上.操作如下: 1.安装GIT 安装完成后,在IDEA中配置git安装路径   2.在本地磁盘新建一个空目录,例如:D:\Wo ...

  9. 世界级Oracle专家Jonathan Lewis:我很为DBA们的未来担心(图灵访谈)

    部分节选 图灵社区:如果您的子女对计算机科学感兴趣,你会让他们选什么具体的方向呢? JL:我的孩子对计算机科学一点都不感兴趣,甚至对科学都没什么兴趣.他们主修的都是艺术.如果要我给其他的人建议的话,我 ...

  10. js 前加分号和感叹号是什么意思?

    ;!function(){}();  ;!有什么用? 从语法上来开,Javascript中分号表示语句结束,在开头加上,可能是为了压缩的时候和别的方法分割一下,表示一个新的语句开始.所以,如果在一个单 ...