topolis/database-connector

SQL数据库连接器。包括绑定或参数、类型映射、调试和性能分析

0.1.0 2016-11-11 10:22 UTC

This package is not auto-updated.

Last update: 2024-09-23 11:58:10 UTC


README

支持参数绑定、转义和映射的SQL数据库连接器。同时也提供调试和性能分析的接口。

  • 支持MySQL、MySQLi、PostgreSQL(更多将在以后出现)
  • 安全且类型安全的输入参数转义和绑定
  • 可选:通过类型映射强制执行绑定参数的规则
  • 将特定于数据库类型的方法封装到通用方法中
  • UTF-8意识连接编码
  • 简化的选择方法
  • 易于扩展到其他数据库类型
  • 调试和性能分析信息(当与Topolis/Logger一起使用时)

此类不包含以下功能:

  • 数据抽象层
  • 查询语言抽象(计划实现一个类似于Zend_Db_Select的查询构建器,但目前尚不可用)
  • 缓存

此页面显示了基本用法和绑定机制。如需更多信息,请参阅IConnector接口的代码文档。所有数据库连接器都将实现此接口。

配置

配置是通过在请求新连接时传递给ConnectorFactory的参数数组来完成的。

  • type 数据库类型。必须与此库中Connectors文件夹内的文件夹名称相同。
  • host 数据库主机名
  • user 登录数据库的用户名
  • password 登录数据库的密码
  • database 要连接的数据库的名称
  • debug (可选)当设置为true时,生成包含执行SQL语句的通知。在实时服务器上切勿启用。SQL语句可能包含敏感数据。
  • profile (可选)如果存在Topolis/Logger实例,则生成日志条目,其中包含调用次数、时间和内存消耗信息。
  • encoding (可选)数据库连接的连接编码。默认为"utf8"。

实例化

通过通用工厂类ConnectorFactory请求数据库连接器。然后,此类从相应的连接器工厂请求特定类型的连接器。

$config = array("type" => "MySQLi", // Case sensitive
                "host" => "localhost"
                "user" => "dbname",
                "password" => "12345678"
                "database" => "mydata");

$Connector = ConnectorFactory->getConnector($config);

SQL查询

要执行查询,您需要提供一个包含SQL语句的字符串,其中仅包含静态值或绑定占位符,以及一个包含所有占位符值的数组。然后,连接器将使用此数组中的正确转义、类型转换和引用值替换所有占位符。

占位符以冒号开头,后跟占位符名称。

支持的绑定类型

  • null 逻辑null值
  • array 所有元素将被相应地转换,并将列表作为逗号分隔值返回(例如,用于"WHERE column IN (:myarray)"
  • integer 不以零开头的任何数字且不包含小数
  • decimal 不以零开头的任何数字且包含小数
  • boolean 布尔true或false值
  • datetime DateTime对象
  • string 一个普通字符串

注意 占位符被str_replace替换。这意味着如果您有两个占位符":street"和":streetnumber",第一个替换可能也会击中":streetnumber",留下类似于"'123'number"的东西,这会破坏您的SQL。可以通过使用唯一的占位符名称或在占位符数组中在":street"之前放置":streetnumber"来避免这种情况。

$query = "SELECT * FROM table WHERE id = :id and date > :date";
$param = array("id" => 123, "date" => "2001-01-31");
$result = $Connector->query($query, $param);

while($row = $connector->fetch($result))
    var_dump($row);

简单选择

该连接器还可以将选择查询的结果作为一个已检索的多维数组提供。第一维是行号(或指定为索引列的情况下)和第二维是常规的行。

第三个参数可选项指定了用作第一维的列。如果没有指定,则所有行都将获得一个数字索引。

$query = "SELECT * FROM table WHERE id = :id and date > :date";
$param = array("id" => 123, "date" => "2001-01-31");
$table = $Connector->select($query, $param, "id");

var_dump($table);

注意 如果您使用不返回结果集的查询,此函数将生成错误。

使用 LastId 插入

如果您将行插入到一个具有自增索引列的表中,您可以通过以下方式获取此 ID

$query = "INSERT INTO table (col1, col2) VALUES (:col1, :col2)";
$param = array("col1" => "Hello", "col2" => "World");
$result = $Connector->query($query, $param);
$lastid = $Connector->lastId($result);

使用 Mapper 强制参数

连接器有一个可选的 Mapper 类,可用于指定用于绑定所有给定参数的规则。在查询期间使用的 $map 数组必须遵循此格式

$map = array( string    "name" => 
           array ( string   "type",       // type to validate ( one of boolean, integer, double, string )
                   bool     "mandatory",  // (Optional) either true or false
                   mixed    "default"     // (Optional) default value if none given and not mandatory
           )
       )
$query = "UPDATE guest SET name = :name WHERE id = :id";

$param = array("name" => $name, "id" => $id);

$map = array();
$map["id"]   = array ("type" => "integer", "mandatory" => true );
$map["name"] = array ("type" => "string",  "mandatory" => false, "default" => "Anonymous" );

$result = $Connector->query($query, $param, $map);