单个类中的PHP和PDO的数据库访问对象包装器
PdoOne 。它是与SQL Server(2008 R2或更高),MySQL(5.7或更高)和Oracle(12.1或更高)兼容的PHP PDO库的简单包装器。
该图书馆试图尽可能快地工作。大多数操作都是简单的字符串/数组管理,并在PDO库的裸机中工作,但它还允许使用扩展EFTEC/ PdoOne ORM创建ORM。
转
$ stmt = $ pdo -> prepare ( " SELECT * FROM myTable WHERE name = ? " );
$ stmt -> bindParam ( 1 , $ _POST [ ' name ' ], PDO :: PARAM_STR );
$ stmt -> execute ();
$ result = $ stmt -> get_result ();
$ products =[];
while ( $ row = $ result -> fetch_assoc ()) {
$ product []= $ row ;
}
$ stmt -> close ();进入这个
$ products = $ PdoOne
-> select ( " * " )
-> from ( " myTable " )
-> where ( " name = ? " ,[ $ _POST [ ' name ' ]])
-> toList ();或使用ORM(使用EFTEC/ PdoOne ORM库)
ProductRepo // this class was generated with echo $ PdoOne ()->generateCodeClass(['Product']); or using the cli.
:: where ( " name = ? " ,[ $ _POST [ ' name ' ]])
:: toList ();目录
- 单个类中的PHP和PDO的数据库访问对象包装器
- 目录
- 例子
- 安装
- 安装(使用作曲家)
- (手动)安装
- 如何创建连接?
- OCI
- 如何运行SQL命令?
- 1。运行原始查询
- 2。运行本机PDO语句
- 3.使用查询构建器运行
- 4。使用ORM运行
- 5。以不同的模式运行查询
- 如何使用日期值?
- 如何运行交易?
- 自定义查询
- tableexist($ tableName)
- StatValue($ tableName,$ columnname)
- 列Ttable($ tableName)
- ExourneKeyTable($ tableName)
- createtable($ tableName,$ definity,$ priendarkey = null,$ extair ='',$ extairoutside ='')
- tablesorted($ maxloop = 5,$ returnproblems = false,$ debugtrace = false)
- 可验证的Eftable($ pdoinstance,$ tablename,$ deftable,$ deftablekey)
- 外键
- 查询构建器(DQL)
- 选择($列)
- 计数($ sql,$ arg ='*')
- min($ sql,$ arg ='*')
- max($ sql,$ arg ='*')
- sum($ sql,$ arg ='*')
- avg($ sql,$ arg ='*')
- 独特($ diminter ='独特')
- 来自($表)
- where($ where,[$ arrayParameters = array()))
- 其中()无参数。
- 其中()带有由索引数组定义的参数。
- 其中()使用关联数组
- 其中()使用关联数组并命名参数
- where()的示例
- 订单($订单)
- 小组($组)
- 具有($ ake,[$ arrayParameters])
- chain
- rungen($ returnarray = true)
- tolist($ pdomode)
- TopStatement($ PDOMODE)
- fetchloop($ callable,$ pdomode) * tometa() * tolistimple() * tolistKeyValue() * toresult() * firstScalar($ colname = null) * first() * first() * last() * sqlgen() * sqlgen()
- 查询构建器(DML)
- 插入($表,$架构,[$ values])
- insertObject($ table,[$ declarativearray],$ excludeColumn = [])
- 更新($$表,$架构,$ values,[$ schemawhere],[$ valueswhere])
- delete([$ table],[$ schemawhere],[$ valueswhere])
- 缓存
- 如何配置它?
- 使用APCU的示例
- 顺序
- 创建序列
- 创建一个没有表的序列。
- 使用序列
- 字段
- 加密
- 如何在数据库中调试和跟踪错误?
- 设置日志级别
- 投掷错误
- 获取最后一个查询
- 生成日志文件
- CLI
- 作为CLI运行
- 作为CLI相互作用
- 例子
- 运行CLI以生成存储库类。
- CLI-CLASSCODE
- CLI-SELECTCODE
- cli arraycode
- 克里·杰森
- CLI-CSV
- UI
- 如何运行UI?
- DDL数据库设计语言
- 嵌套操作员
- DQL数据库查询语言
- DML数据库模型语言
- 验证模型
- 递归
- 递归()
- getRecursive()
- HASRECURSIVE()
- 基准(MySQL,估计)
- 从3到4迁移
- 错误常见问题解答
- 未定义的错误:未定义的EFTEC_BASE PdoOne REPO :: COMPIELVERSION
- 变革主义者
- 查询构建器(DML)
例子
| exeppleticketPHP | 纸杯蛋糕 | 示例搜索 | 示例不同的方法 |
|---|---|---|---|
更多示例:
示例使用PdoOne MySQL php和PDO
安装
该库需要php 7.1及更高版本,并且需要扩展PDO和扩展PDO-MYSQL(MySQL),PDO-SQLSRV(SQL Server)或PDO-OCI(Oracle)
安装(使用作曲家)
编辑Composer.json下一个要求,然后更新作曲家。
{
"require" : {
"eftec/ PdoOne " : " ^4.0.1 "
}
}或使用CLI使用
作曲家需要eftec/ PdoOne
(手动)安装
只需从库中下载文件夹lib,然后放入您的文件夹项目即可。然后,您必须包括其中包含的所有文件。
如何创建连接?
如下创建类PdoOne的实例。然后,您可以使用方法Connect()或Open()打开连接()
use eftec PdoOne ;
// mysql
$ dao = new PdoOne ( " mysql " , " 127.0.0.1 " , " root " , " abc.123 " , " sakila " , "" );
$ conn -> logLevel = 3 ; // it is for debug purpose and it works to find problems.
$ dao -> connect ();
// sql server 10.0.0.1instance or (local)instance or machinenameinstance or machine (default instance)
$ dao = new PdoOne ( " sqlsrv " , " (local)sqlexpress " , " sa " , " abc.123 " , " sakila " , "" );
$ conn -> logLevel = 3 ; // it is for debug purpose and it works to find problems.
$ dao -> connect ();
// test (mockup)
$ dao = new PdoOne ( " test " , " anyy " , " any " , " any " , " any " , "" );
$ dao -> connect ();
// oci (oracle) ez-connect. Remember that you must have installed Oracle Instant client and added to the path.
$ cs = ' (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = instancia1))) ' ;
$ dao = new PdoOne ( " oci " , $ cs , " sa " , " abc.123 " ); // oracle uses the user as the schema
$ conn -> logLevel = 3 ; // it is for debug purpose and it works to find problems.
$ dao -> connect ();
// oci (oracle) tsnnames (the environment variables TNS_ADMIN and PATH must be correctly configured), also tnsnames.ora must exists.
$ cs = ' instancia1 ' ;
$ dao = new PdoOne ( " oci " , $ cs , " sa " , " abc.123 " ); // oracle uses the user as the schema
$ conn -> logLevel = 3 ; // it is for debug purpose and it works to find problems.
$ dao -> connect ();在哪里
$ dao = new PdoOne (“ mysql”,“ 127.0.0.1”,“ root”,“ abc.123”,“ sakila”,“”);
- “ mySQL ”是MySQL数据库。它还允许SQLSRV(用于SQL Server)或“ OCI”
- 127.0.0.1是数据库的服务器。
- 根是用户
- ABC.123是用户根的密码。
- Sakila是使用的数据库。
- “”(可选)它可能是一个日志文件,例如c: temp log.txt
OCI
Oracle安装很棘手。在Windows中,从Oracle Home的bin文件夹中,您必须将所有DLL复制到PHP文件夹和Apache文件夹。
如何运行SQL命令?
1。运行原始查询
使用方法Runrawquery() ,我们可以在有或没有参数的情况下直接执行命令到PDO。它可以返回pdostatement或数组。当我们想要速度时,这很有用。
runrawquery($ rowsql,$ param,$ returnarray,$ fetchmode,$ fetchargument)
字符串$ rawSQL执行阵列的查询| null $ param [type1,value1,type2,value2]或[name1 => value,name2 = value2] bool $ returnaray如果为true(默认),则返回一个数组。如果false,则返回pdostatement int $ fetchmode表示获取模式。示例:pdo :: fetch_assoc null $ fetchargument fetchmode的参数。
$ sql = ' select * from table where id=1 ' ;
$ pdoStatement = $ PdoOne -> runRawQuery ( $ sql ,[], false ); // [] are the parameters但是我们可以将其更改为返回一个数组
$ sql = ' select * from table where id=1 ' ;
$ values = $ PdoOne -> runRawQuery ( $ sql ); // [] are the parameters我们也可以传递参数。
$ values = $ con -> runRawQuery ( ' select * from table where id=? ' ,[ 20 ]); // with parameter
$ values = $ con -> runRawQuery ( ' select * from table where id=:name ' ,[ ' name ' => 20 ]); // with named parameter
$ values = $ con -> runRawQuery ( ' select * from table ' ,[]); // without parameter.请注意,该库使用已准备好的语句,因此它没有SQL注入(如果使用参数)
$ name = " O'hara " ;
$ values = $ con -> runRawQuery ( " select * from table where name=:name " ,[ ' name ' => $ name ]); // it works.✅
$ values = $ con -> runRawQuery ( " select * from table where name=? " ,[ $ name ]); // it works ok.✅
$ values = $ con -> runRawQuery ( " select * from table where name=' $ name ' " ); // it will crash.2。运行本机PDO语句
使用方法runquery(),我们可以在PDO中执行准备好的语句。当我们想将参数传递给它时,这很有用。 Runquery()需要准备PDO。
除非您已经使用PDO语句,否则不建议使用此方法,并且不想适应所有代码。
$ sql = " insert into `product`(name) values(?) " ;
$ stmt = $ PdoOne -> prepare ( $ sql );
$ productName = " Cocacola " ;
$ stmt -> bind_param ( " s " , $ productName ); // s stand for a string. Also i =integer, d = double and b=blob
$ rows = $ PdoOne -> runQuery ( $ stmt );
$ allRows = $ rows -> fetch_all ( PDO :: FETCH_ASSOC );3.使用查询构建器运行
您可以使用查询构建器来构建命令。您可以查看有关查询构建器(DQL)的章节,以获取更多信息。
// query builder
$ PdoOne -> set ([ ' name ' => ' cocacola ' ])
-> from ( ' product ' )
-> insert ();4。使用ORM运行
库eftec PdoOne orm允许创建表的[orm] (#orm)。如果您生成了ORM,则可以使用下一个代码
ProductRepo:: toList ([ ' category ' => ' drink ' ]);其中productrepo是使用ORM生成的服务类。
5。以不同的模式运行查询
默认情况下, PdoOne在模式pdo :: fetch_assoc中执行查询,您可以通过运行查询来更改为:
$ pdo -> setFechMode ( PDO :: FETCH_CLASS , ' stdClass ' )-> runRawQuery ( $ query );
// or you can run as
$ pdo -> runRawQuery ( $ query , null , true , false , null , PDO :: FETCH_CLASS , ' stdClass ' )如何使用日期值?
PdoOne允许5种类型的日期。
SQL格式是将日期存储到数据库中的格式。这取决于数据库的类型。例如,MySQL可以使用格式YMD。
人类格式是最终用户看起来我们日期的格式。
ISO日期格式。这是如何运输和序列化值的格式。
时间戳:它计算1-1-1970之后的秒数
类 / PHP类:这是一个日期对象。
如何运行交易?
有3种运行交易的方法:
| 方法 | 描述 |
|---|---|
| startTransaction() | 它开始交易。根据类型数据库的不同,它可以堆叠。 |
| 犯罪() | 提交(并关闭)交易 |
| 回滚() | 回滚(并关闭)交易 |
例子:
try {
$ sql = " insert into `product`(name) values(?) " ;
$ PdoOne -> startTransaction ();
$ result = $ PdoOne -> runRawQuery ( $ sql ,[ ' Fanta ' => $ productName ], false );
$ PdoOne -> commit (); // transaction ok
} catch ( Exception $ e ) {
$ PdoOne -> rollback ( false ); // error, transaction cancelled, the false means that it doesn't throw an exception if we want rollback.
}自定义查询
tableexist($ tableName)
如果表格存在(当前数据库/架构),则返回true
StatValue($ tableName,$ columnname)
返回表的列的统计信息(作为数组)。
$ stats = $ PdoOne -> statValue ( ' actor ' , ' actor_id ' );| 最小 | 最大限度 | avg | 和 | 数数 |
|---|---|---|---|---|
| 1 | 205 | 103.0000 | 21115 | 205 |
列Ttable($ tableName)
返回表的所有列
$ result = $ PdoOne -> columnTable ( ' actor ' );| colname | Coltype | 结肠化 | Colpres | colscale | ISKEY | 现有人士 |
|---|---|---|---|---|---|---|
| actor_id | 小网 | 5 | 0 | 1 | 1 | |
| 名 | Varchar | 45 | 0 | 0 | ||
| 姓 | Varchar | 45 | 0 | 0 | ||
| last_update | 时间戳 | 0 | 0 |
ExourneKeyTable($ tableName)
返回表的所有外键(源表)
createtable($ tableName,$ definity,$ priendarkey = null,$ extair ='',$ extairoutside ='')
使用定义和主键创建表。
- $定义定义是一个关联数组,其名称为键,定义为值。
- primarykey可能是字符串或关联数组。
- 如果是字符串,则是主键的名称,示例“ user_id”;
- 如果它是一个关联阵列,则可以用来定义主键,唯一,键和外键:
- 'key_name'=>'主键'
- 'key_name'=>'键'
- 'key_name'=>'唯一键'
- 'key_name'=>'外键参考tableerf(colref)...'
- $ extra它在表的定义内定义了一个额外的定义。
- Extraoutsed它定义了表格定义后的额外定义。
注意:您可以通过执行CLI(输出classcode)来生成代码使用现有表创建表
php PdoOne .php -database mysql -Server 127.0.0.1-用户根-PWD ABC.123 -DB Sakila -Input Film -Output Classcode
示例:( mysql)
$ pdo -> createTable ( ' film ' ,
[
" film_id " => " smallint unsigned not null auto_increment " ,
" title " => " varchar(255) not null " ,
" description " => " text " ,
" release_year " => " year " ,
" language_id " => " tinyint unsigned not null " ,
" original_language_id " => " tinyint unsigned " ,
" rental_duration " => " tinyint unsigned not null default '3' " ,
" rental_rate " => " decimal(4,2) not null default '4.99' " ,
" length " => " smallint unsigned " ,
" replacement_cost " => " decimal(5,2) not null default '19.99' " ,
" rating " => " enum('G','PG','PG-13','R','NC-17') default 'G' " ,
" special_features " => " set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') " ,
" last_update " => " timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP "
],[
" film_id " => " PRIMARY KEY " ,
" title " => " KEY " ,
" language_id " => " FOREIGN KEY REFERENCES`language`(`language_id`) ON UPDATE CASCADE " ,
" original_language_id " => " FOREIGN KEY REFERENCES`language`(`language_id`) ON UPDATE CASCADE "
]); $ pdo -> createTable ( ' film ' ,
[
" film_id " => " smallint unsigned not null auto_increment " ,
" title " => " varchar(255) not null " ,
" description " => " text " ,
" release_year " => " year " ,
" language_id " => " tinyint unsigned not null " ,
" original_language_id " => " tinyint unsigned " ,
" rental_duration " => " tinyint unsigned not null default '3' " ,
" rental_rate " => " decimal(4,2) not null default '4.99' " ,
" length " => " smallint unsigned " ,
" replacement_cost " => " decimal(5,2) not null default '19.99' " ,
" rating " => " enum('G','PG','PG-13','R','NC-17') default 'G' " ,
" special_features " => " set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') " ,
" last_update " => " timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP "
], ' film_id ' ); 示例(SQLSRV)
$ pdo -> createTable ( ' film ' ,
[
" film_id " => " int NOT NULL IDENTITY(1,1) " ,
" title " => " varchar(255) NOT NULL " ,
" description " => " text(2147483647) DEFAULT (NULL) " ,
" release_year " => " varchar(4) " ,
" language_id " => " tinyint NOT NULL " ,
" original_language_id " => " tinyint DEFAULT (NULL) " ,
" rental_duration " => " tinyint NOT NULL DEFAULT ((3)) " ,
" rental_rate " => " decimal(4,2) NOT NULL DEFAULT ((4.99)) " ,
" length " => " smallint DEFAULT (NULL) " ,
" replacement_cost " => " decimal(5,2) NOT NULL DEFAULT ((19.99)) " ,
" rating " => " varchar(10) DEFAULT ('G') " ,
" special_features " => " varchar(255) DEFAULT (NULL) " ,
" last_update " => " datetime NOT NULL DEFAULT (getdate()) "
],[
" language_id " => " FOREIGN KEY REFERENCES language(language_id) " ,
" original_language_id " => " FOREIGN KEY REFERENCES language(language_id) " ,
" film_id " => " PRIMARY KEY "
]);tablesorted($ maxloop = 5,$ returnproblems = false,$ debugtrace = false)
它返回按依赖项订购的表的列表(从无依赖到更依赖)
注意:此操作不是万无一失的,因为桌子可能具有圆形参考。
";
var_dump($dao->tableSorted(3, false, true)); // it returns the tables sortered
var_dump($dao->tableSorted(3, true, true)); // it returns all the tables that can't be sortered
echo "";"> $ dao = new PdoOne ( ' sqlsrv ' , " (local)sqlexpress " , " sa " , " abc.123 " , " sakila " );
$ dao -> open ();
echo " " ;
var_dump ( $ dao -> tableSorted ( 3 , false , true )); // it returns the tables sortered
var_dump ( $ dao -> tableSorted ( 3 , true , true )); // it returns all the tables that can't be sortered
echo " " ;可验证的Eftable($ pdoinstance,$ tablename,$ deftable,$ deftablekey)
如果表与值相关的定义匹配,则验证表。
$def=[
"film_id" => "int NOT NULL IDENTITY(1,1)",
"title" => "varchar(255) NOT NULL",
"description" => "text(2147483647) DEFAULT (NULL)",
"release_year" => "varchar(4)",
"language_id" => "tinyint NOT NULL",
"original_language_id" => "tinyint DEFAULT (NULL)",
"rental_duration" => "tinyint NOT NULL DEFAULT ((3))",
"rental_rate" => "decimal(4,2) NOT NULL DEFAULT ((4.99))",
"length" => "smallint DEFAULT (NULL)",
"replacement_cost" => "decimal(5,2) NOT NULL DEFAULT ((19.99))",
"rating" => "varchar(10) DEFAULT ('G')",
"special_features" => "varchar(255) DEFAULT (NULL)",
"last_update" => "datetime NOT NULL DEFAULT (getdate())"
];
$keys=[
"language_id" => "FOREIGN KEY REFERENCES language(language_id)",
"original_language_id" => "FOREIGN KEY REFERENCES language(language_id)",
"film_id" => "PRIMARY KEY"
];
var_dump( PdoOne ::validateDefTable(self::get PdoOne (),self::TABLE,$def,$keys));
外键
它返回桌子的所有外键。
$ result = $ PdoOne -> foreignKeyTable ( ' actor ' );| 同盟国 | tablem | Colrem |
|---|---|---|
| customer_id | 顾客 | customer_id |
| lental_id | 租金 | lental_id |
| Staff_ID | 职员 | Staff_ID |
查询构建器(DQL)
您还可以构建程序查询。
例子:
$ results = $ PdoOne -> select ( " * " )-> from ( " producttype " )
-> where ( ' name=? ' , [ ' Cocacola ' ])
-> where ( ' idproducttype=? ' , [ 1 ])
-> toList (); 选择($列)
指示要返回的列。该参数是SQL命令,因此它允许数据库支持(包括功能,常数,操作员,别名等)的任何操作。
$ results = $ PdoOne -> select ( " col1,col2 " ); //...生成查询:选择COL1,COL2 ....
$ results = $ PdoOne -> select ( " select * from table " ); //->...生成查询:从表中选择 * * 。
计数($ sql,$ arg ='*')
生成一个返回值计数的查询。这是方法选择()的宏
$ result = $ PdoOne -> count ( ' from table where condition=1 ' ); // select count(*) from table where c..
$ result = $ PdoOne -> count ()-> from ( ' table ' )-> where ( ' condition=? ' ,[ 1 ]); // select count(*) from table where c..
$ result = $ PdoOne -> count ( ' from table ' , ' col1 ' ); // select count(col1) from table
$ result = $ PdoOne -> count ()-> from ( ' table ' ); // select count(*) from tablemin($ sql,$ arg ='*')
生成一个查询,该查询返回列的最小值。如
通过命令行克隆项目: