资讯专栏INFORMATION COLUMN

PHP-Phalcon框架中的数据库操作

xiaotianyi / 2346人阅读

摘要:本文描述了框架中数据库操作方法,主要讨论框架的组件中的操作方法。属性方法在框架中支持属性的扩展查询,在上例中,可以把条件语句改为同时省略查询条件结果不变。

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


1. 连接数据库

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

use PhalconDbAdapterPdoMysql 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 = "PhalconDbAdapterPdo" . $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模型类,需要注意的是模型类必须继承PhalconMVCModel类,并且采用与数据库表名一致的驼峰命名法。因此建立如下的Customer类:

class Customer extends PhalconMvcModel
{
    //采用默认的对应规则会自动映射数据库表的字段,可以不写
    /**
     *
     * @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("用户不存在");
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30321.html

相关文章

  • SSM框架网站后台搭建(一)

    摘要:传统的代码中,在类中调用其他对象,都是自己出来一个对象,然后调用,这样代码的耦合度就比较高。日志对象和主程序的耦合度降到最低,即使更改日志对象的操作,主程序不受影响。 SSM框架网站后台搭建(一) 1.所用技术简单介绍 1.SSM中的S:Spring Spring在百度词条上的解释是: Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向...

    ZweiZhao 评论0 收藏0
  • CQRS框架(nodejs的DDD开发落地框架)初识感想

    摘要:中的事件的一个,我暂且理解为一个中的和这两个属性已经在框架中直接挂载在了对象上,归功于曾老师。 CQRS是啥?DDD又是啥? 这两个概念其实没什么神秘的,当然此文章中的这两个概念以曾老师的课程为准(关于CQRS和DDD的标准概念,google上已经很多了,不再赘述。) DDD(Domain Driven Design),领域驱动设计开发。 DDD和OOP有什么同吗?其实就我个人经验来说...

    zhoutk 评论0 收藏0
  • SSM框架运行机制

    摘要:框架搭建首先下载相应的包,对于包有两种方式使用创建依赖从而导入所需的包。总结主要进行页面的请求接受与响应。组件包括前端控制器,处理器映射器,处理器适配器,视图解析器,处理器,视图。 我之前的文章介绍了如何搭建SSH框架以及如何利用这一框架来进行web应用开发,最近我又接触了SSM框架即Spring+SpringMVC+Mybatis三大框架的整合,而且目前该框架就SSH框架而言使用的较...

    winterdawn 评论0 收藏0
  • 以静制动的TensorFlow Fold动态计算图介绍

    摘要:近日它们交锋的战场就是动态计算图,谁能在这场战争中取得优势,谁就把握住了未来用户的流向。所以动态框架对虚拟计算图的构建速度有较高的要求。动态计算图问题之一的多结构输入问题的高效计 随着深度学习的发展,深度学习框架之间竞争也日益激烈,新老框架纷纷各显神通,想要在广大DeepLearner的服务器上占据一席之地。近日它们交锋的战场就是动态计算图,谁能在这场战争中取得优势,谁就把握住了未来用户的流...

    waltr 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<