DaoOne 。這是 Mysqli 的簡單包裝
這個庫盡可能快。大多數操作都是簡單的字串/陣列管理。
注意:此版本已移至 https://github.com/EFTEC/PdoOne
PdoOne 執行相同的工作,但它與 PDO 庫(而不是 MySQLi)一起使用。目前,PdoOne 可與 Mysqli 和 SqlSrv 配合使用,但它還有許多其他DaoOne上不具備的功能
透過作曲家安裝
作曲家需要 eftec/pdoone
該庫可以與 eftec/ DaoOne協同工作。
更改類,而不是使用 eftec/ DaoOne -> eftec/pdoone
例子:
前:
/** @var eftec DaoOne $db */
$ db = null ;
後:
/** @var eftecPdoOne $db */
$ db = null ;
前:
$ db = new DaoOne ( ' 127.0.0.1 ' , ' root ' , ' abc.123 ' , ' sakila ' );
後:
$ db = new DaoOne ( ' mysql ' , ' 127.0.0.1 ' , ' root ' , ' abc.123 ' , ' sakila ' ); // check 'mysql'
如果我們使用DaoOne ::runGen(false),那麼我們必須檢查結果。 runGen ( DaoOne ) 傳回一個 mysqli_result 物件。 runGen (PdoOne) 傳回一個 pdostatement 物件。
前:
$ result = $ db -> runGen ( false ); // it returns a mysqli_result
$ result -> fetch_assoc ();
$ result -> free_result ();
後:
$ result = $ db -> runGen ( false ); // it returns a pdostatement
$ result -> fetch ( PDO :: FETCH_ASSOC );
$ result = null ;
轉這個
$stmt->bind_param("s", $_POST['name']);
$stmt->execute();
$result = $stmt->get_result();
if($result->num_rows === 0) exit('No rows');
while($row = $result->fetch_assoc()) {
$ids[] = $row['id'];
$names[] = $row['name'];
$ages[] = $row['age'];
}
var_export($ages);
$stmt->close();
進入這個
$products=$dao
->select("*")
->from("myTable")
->where("name = ?",[$_POST['name']])
->toList();
將下一個要求加入composer.json,然後更新composer。
{
"require" : {
"eftec/ DaoOne " : " ^3.15 "
}
}
或透過 cli 安裝它
作曲家需要 eftec/ DaoOne
只需下載檔案 lib/ DaoOne .php 並將其保存在資料夾中。
$ dao = new DaoOne ( " 127.0.0.1 " , " root " , " abc.123 " , " sakila " , "" );
$ dao -> connect ();
在哪裡
$ sql = " CREATE TABLE `product` (
`idproduct` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NULL,
PRIMARY KEY (`idproduct`)); " ;
$ dao -> runRawQuery ( $ sql );
$ sql = " insert into `product`(name) values(?) " ;
$ stmt = $ dao -> prepare ( $ sql );
$ productName = " Cocacola " ;
$ stmt -> bind_param ( " s " , $ productName ); // s stand for string. Also i =integer, d = double and b=blob
$ dao -> runQuery ( $ stmt );
注意:您也可以使用過程鏈 insert($table,$schema,[$values]) 進行插入
$ dao -> runRawQuery ( ' insert into `product` (name) values(?) '
, array ( ' s ' , ' cocacola ' ));
它傳回一個 mysqli_statement。
$ sql = " select * from `product` order by name " ;
$ stmt = $ dao -> prepare ( $ sql );
$ dao -> runQuery ( $ stmt );
$ rows = $ stmt -> get_result ();
while ( $ row = $ rows -> fetch_assoc ()) {
var_dump ( $ row );
}
該語句必須手動處理。
它傳回一個關聯數組。
$ sql = " select * from `product` order by name " ;
$ stmt = $ dao -> prepare ( $ sql );
$ dao -> runQuery ( $ stmt );
$ rows = $ stmt -> get_result ();
$ allRows = $ rows -> fetch_all ( MYSQLI_ASSOC );
var_dump ( $ allRows );
try {
$ sql = " insert into `product`(name) values(?) " ;
$ dao -> startTransaction ();
$ stmt = $ dao -> prepare ( $ sql );
$ productName = " Fanta " ;
$ stmt -> bind_param ( " s " , $ productName );
$ dao -> runQuery ( $ stmt );
$ dao -> commit (); // transaction ok
} catch ( Exception $ e ) {
$ dao -> rollback ( false ); // error, transaction cancelled.
}
它開始一個事務
它提交一個事務。
它回滾事務。
如果為 true(預設),則如果發生錯誤,它將拋出錯誤。如果為 false,則繼續執行
如果資料庫已連線則為 true,否則為 false。
您也可以建立一個過程查詢。
例子:
$ results = $ dao -> select ( " * " )-> from ( " producttype " )
-> where ( ' name=? ' , [ ' s ' , ' Cocacola ' ])
-> where ( ' idproducttype=? ' , [ ' i ' , 1 ])
-> toList ();
產生選擇命令。
$ results = $ dao -> select ( " col1,col2 " )->. . .
產生查詢: select col1,col2 ....
$ results = $ dao -> select ( " select * from table " )->. . .
產生查詢: select * from table ....
產生選擇命令。
$ results = $ dao -> select ( " col1,col2 " )-> distinct (). . .
產生查詢:選擇不同的col1,col2 ....
注意:->distinct('unique') 回傳 select unique ..
產生一個 from 命令。
$ results = $ dao -> select ( " * " )-> from ( ' table ' ). . .
產生查詢:select * from table
$tables可以是單一資料表或 SQL 結構。例如,下一個命令是有效的:
$ results = $ dao -> select ( " * " )-> from ( ' table t1 inner join t2 on t1.c1=t2.c2 ' ). . .
產生一個 where 指令。
$ results = $ dao -> select ( " * " )
-> from ( ' table ' )
-> where ( ' p1=1 ' ). . .
產生查詢: select * from table where p1=1
注意:ArrayParameters 是一個數組,如下: type,value。
其中類型為 i=integer、d=double、s=string 或 b=blob。如有疑問,請使用“s”
數組參數範例:
['i',1,'s','你好','d',20.3,'s','世界']
$ results = $ dao -> select ( " * " )
-> from ( ' table ' )
-> where ( ' p1=? ' ,[ ' i ' , 1 ]). . .
產生查詢: select * from table where p1=?(1)
$ results = $ dao -> select ( " * " )
-> from ( ' table ' )
-> where ( ' p1=? and p2=? ' ,[ ' i ' , 1 , ' s ' , ' hello ' ]). . .
產生查詢: select * from table where p1=?(1) and p2=?('hello')
筆記。哪裡可以嵌套。
$ results = $ dao -> select ( " * " )
-> from ( ' table ' )
-> where ( ' p1=? ' ,[ ' i ' , 1 ])
-> where ( ' p2=? ' ,[ ' s ' , ' hello ' ]). . .
產生查詢: select * from table where p1=?(1) and p2=?('hello')
您也可以使用:
$ results = $ dao -> select ( " * " )-> from ( " table " )
-> where ([ ' p1 ' => ' Coca-Cola ' , ' p2 ' => 1 ])
-> toList ();
產生查詢: select * from table where p1=?(Coca-Cola) and p2=?(1)
產生訂單命令。
$ results = $ dao -> select ( " * " )
-> from ( ' table ' )
-> order ( ' p1 desc ' ). . .
產生查詢: select * from table order by p1 desc
生成組命令。
$ results = $ dao -> select ( " * " )
-> from ( ' table ' )
-> group ( ' p1 ' ). . .
產生查詢: select * from table group by p1
生成組命令。
$ results = $ dao -> select ( " * " )
-> from ( ' table ' )
-> group ( ' p1 ' )
-> having ( ' p1>? ' , array ( ' i ' , 1 )). . .
產生查詢: select * from table group by p1having p1>?(1)
注意:having 可以巢狀having()->having()
注意:having 可以不含參數having('col>10')
運行查詢生成。
請注意,如果 returnArray 為 true,則它會傳回關聯陣列。如果 returnArray 為 false,則傳回 mysqli_result
注意:它會重設目前參數(如目前 select、from、where 等)
這是runGen的巨集。它傳回一個關聯數組或 null。
$ results = $ dao -> select ( " * " )
-> from ( ' table ' )
-> toList ()
這是runGen的巨集。它傳回 mysqli_result 或 null。
$ results = $ dao -> select ( " * " )
-> from ( ' table ' )
-> toResult ()
這是runGen的巨集。它會傳回第一行(如果有,如果沒有,則傳回 false)作為關聯數組。
$ results = $ dao -> select ( " * " )
-> from ( ' table ' )
-> first ()
這是runGen的巨集。它會傳回最後一行(如果有的話,如果沒有,則傳回 false)作為關聯數組。
$ results = $ dao -> select ( " * " )
-> from ( ' table ' )
-> last ()
有時運行 order() 和 first() 更有效,因為 last() 讀取所有值。
它傳回 sql 指令。
$ sql = $ dao -> select ( " * " )
-> from ( ' table ' )
-> sqlGen ();
echo $ sql ; // returns select * from table
$ results = $ dao -> toList (); // executes the query
注意:它不會重置查詢。
每個指令有四種執行方式。
假設我們要在col1列中新增一個值為20 的整數
使用值清單的架構和值:其中第一個值是列,第二個值是值的型別 (i=integer,d=double,s=string,b=blob),第二個陣列包含值。
$ dao -> insert ( " table "
,[ ' col1 ' , ' i ' ]
,[ 20 ]);
同一列表中的架構和值:其中第一個值是列,第二個是值的型別(i=integer,d=double,s=string,b=blob),第三個是值。
$ dao -> insert ( " table "
,[ ' col1 ' , ' i ' , 20 ]);
使用兩個關聯數組的架構和值:
$ dao -> insert ( " table "
,[ ' col1 ' => ' i ' ]
,[ ' col1 ' => 20 ]);
使用單一關聯數組的架構和值:自動計算類型。
$ dao -> insert ( " table "
,[ ' col1 ' => 20 ]);
產生插入命令。
$ dao -> insert ( " producttype "
,[ ' idproducttype ' , ' i ' , ' name ' , ' s ' , ' type ' , ' i ' ]
,[ 1 , ' cocacola ' , 1 ]);
使用嵌套鏈(單一數組)
$ dao -> from ( " producttype " )
-> set ([ ' idproducttype ' , ' i ' , 0 , ' name ' , ' s ' , ' Pepsi ' , ' type ' , ' i ' , 1 ])
-> insert ();
使用嵌套鏈多個集合
$ dao -> from ( " producttype " )
-> set ( " idproducttype=? " ,[ ' i ' , 101 ])
-> set ( ' name=? ' ,[ ' s ' , ' Pepsi ' ])
-> set ( ' type=? ' ,[ ' i ' , 1 ])
-> insert ();
或(類型可能由 MySql 自動定義)
$ dao -> from ( " producttype " )
-> set ( " idproducttype=? " ,[ ' i ' , 101 ])
-> set ( ' name=? ' , ' Pepsi ' )
-> set ( ' type=? ' , 1 )
-> insert ();
使用嵌套鏈聲明集
$ dao -> from ( " producttype " )
-> set ( ' (idproducttype,name,type) values (?,?,?) ' ,[ ' i ' , 100 , ' s ' , ' Pepsi ' , ' i ' , 1 ])
-> insert ();
產生查詢: insert intoproducttype(idproducttype,name,type)values(?,?,?) ....
產生插入命令。
$ dao -> update ( " producttype "
,[ ' name ' , ' s ' , ' type ' , ' i ' ] //set
,[ 6 , ' Captain-Crunch ' , 2 ] //set
,[ ' idproducttype ' , ' i ' ] // where
,[ 6 ]); // where
$ dao -> update ( " producttype "
,[ ' name ' => ' Captain-Crunch ' , ' type ' => 2 ] // set
,[ ' idproducttype ' => 6 ]); // where
$ dao -> from ( " producttype " )
-> set ( " name=? " ,[ ' s ' , ' Captain-Crunch ' ]) //set
-> set ( " type=? " ,[ ' i ' , 6 ]) //set
-> where ( ' idproducttype=? ' ,[ ' i ' , 6 ]) // where
-> update (); // update
或者
$ dao -> from ( " producttype " )
-> set ( " name=? " , ' Captain-Crunch ' ) //set
-> set ( " type=? " , 6 ) //set
-> where ( ' idproducttype=? ' ,[ ' i ' , 6 ]) // where
-> update (); // update
產生查詢: update Producttype set
name
=?,type
=?其中idproducttype
=? ....
產生刪除命令。
$ dao -> delete ( " producttype "
,[ ' idproducttype ' , ' i ' ] // where
,[ 7 ]); // where
$ dao -> delete ( " producttype "
,[ ' idproducttype ' => 7 ]); // where
產生查詢: delete from Producttype where
idproducttype
=? ....
您也可以透過 DQL 建構器鏈進行刪除。
$ dao -> from ( " producttype " )
-> where ( ' idproducttype=? ' ,[ ' i ' , 7 ]) // where
-> delete ();
$ dao -> from ( " producttype " )
-> where ([ ' idproducttype ' => 7 ]) // where
-> delete ();
產生查詢: delete from Producttype where
idproducttype
=? ....
序列是 AUTO_NUMERIC 欄位的替代項。它使用一個表來產生唯一的 ID。
使用的序列是基於 Twitter 的 Snowflake,它是根據時間(微秒)、節點 ID 和序列產生的。這會產生一個唯一的 LONG (int 64) 值
$dao->nodeId=1; // optional
$dao->tableSequence='snowflake'; // optional
$dao->createSequence(); // it creates a table called snowflake and a function called next_snowflake()
$dao->getSequence() // string(19) "3639032938181434317"
$dao->getSequence(true) // returns a sequence by flipping some values.
$dao->getSequencePHP([unpredictable=false])不使用表格回傳序列。該序列比 $dao->getSequence 更有效,但它使用隨機值來處理衝突。
如果 uppredictable 為真,那麼它會傳回一個不可預測的數字(它會翻轉一些數字)
$dao->getSequencePHP() // string(19) "3639032938181434317"
$dao->getSequencePHP(true) // string(19) "1739032938181434311"