{"id":15025715,"url":"https://github.com/eftec/daoone","last_synced_at":"2025-04-09T20:04:20.547Z","repository":{"id":56975552,"uuid":"136726091","full_name":"EFTEC/DaoOne","owner":"EFTEC","description":"It is a library","archived":false,"fork":false,"pushed_at":"2020-02-13T17:08:47.000Z","size":138,"stargazers_count":9,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-09T20:04:15.727Z","etag":null,"topics":["dao","php-library","php7","php71","php72"],"latest_commit_sha":null,"homepage":"https://www.eftec.cl","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EFTEC.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-06-09T13:35:40.000Z","updated_at":"2024-09-23T21:03:41.000Z","dependencies_parsed_at":"2022-08-21T11:50:56.599Z","dependency_job_id":null,"html_url":"https://github.com/EFTEC/DaoOne","commit_stats":null,"previous_names":[],"tags_count":29,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EFTEC%2FDaoOne","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EFTEC%2FDaoOne/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EFTEC%2FDaoOne/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EFTEC%2FDaoOne/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EFTEC","download_url":"https://codeload.github.com/EFTEC/DaoOne/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248103865,"owners_count":21048245,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dao","php-library","php7","php71","php72"],"created_at":"2024-09-24T20:02:53.164Z","updated_at":"2025-04-09T20:04:20.524Z","avatar_url":"https://github.com/EFTEC.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Database Access Object wrapper for PHP and MySqli in a single class\n\nDaoOne. It's a simple wrapper for Mysqli\n\nThis library is as fast as possible. Most of the operations are simple string/array managements.\n\n\u003e Note: This release is moved to https://github.com/EFTEC/PdoOne   \n\u003e PdoOne does the same job but it works with PDO library (instead of MySQLi).\n\u003e Right now PdoOne works with Mysqli and SqlSrv but it has many other features that will\n\u003e not be present on DaoOne\n\n[![Build Status](https://travis-ci.org/EFTEC/DaoOne.svg?branch=master)](https://travis-ci.org/EFTEC/DaoOne)\n[![Packagist](https://img.shields.io/packagist/v/eftec/daoone.svg)](https://packagist.org/packages/eftec/daoone)\n[![Total Downloads](https://poser.pugx.org/eftec/daoone/downloads)](https://packagist.org/packages/eftec/daoone)\n[![Maintenance](https://img.shields.io/maintenance/yes/2020.svg)]()\n[![composer](https://img.shields.io/badge/composer-%3E1.6-blue.svg)]()\n[![php](https://img.shields.io/badge/php-\u003e5.6-green.svg)]()\n[![php](https://img.shields.io/badge/php-7.x-green.svg)]()\n[![CocoaPods](https://img.shields.io/badge/docs-70%25-yellow.svg)]()\n\n# Migrating to eftec/PdoOne\n\n## Adding the dependency\n\nInstall via composer\n\n\u003e composer require eftec/pdoone\n\nThis library could works in tandem with eftec/daoone.\n\n## Changing the library\n\nChange the class, instead of use eftec/daoone -\u003e eftec/pdoone\n\nExample:\n\nBefore:\n```php\n/** @var \\eftec\\DaoOne $db */\n$db=null;\n```\n\nAfter:\n```php\n/** @var \\eftec\\PdoOne $db */\n$db=null;\n```\n\n## Constructor\n\nBefore:\n```php\n$db=new DaoOne('127.0.0.1','root','abc.123','sakila');\n```\nAfter:\n```php\n$db=new DaoOne('mysql','127.0.0.1','root','abc.123','sakila'); // check 'mysql'\n```\n\n## Operators \n\nIf we use DaoOne::runGen(false), then we must check the result. runGen (DaoOne) returns\n a mysqli_result object. runGen (PdoOne) returns a pdostatement object.\n\nBefore:\n```php\n$result=$db-\u003erunGen(false); // it returns a mysqli_result\n$result-\u003efetch_assoc();\n$result-\u003efree_result();\n```\n\nAfter:\n```php\n$result=$db-\u003erunGen(false); // it returns a pdostatement\n$result-\u003efetch( PDO::FETCH_ASSOC);\n$result=null;\n```\n\n\n# How it works?\n\nTurn this \n\n```$stmt = $mysqli-\u003eprepare(\"SELECT * FROM myTable WHERE name = ?\");\n$stmt-\u003ebind_param(\"s\", $_POST['name']);\n$stmt-\u003eexecute();\n$result = $stmt-\u003eget_result();\nif($result-\u003enum_rows === 0) exit('No rows');\nwhile($row = $result-\u003efetch_assoc()) {\n  $ids[] = $row['id'];\n  $names[] = $row['name'];\n  $ages[] = $row['age'];\n}\nvar_export($ages);\n$stmt-\u003eclose();\n```\n\ninto this\n\n```\n$products=$dao\n    -\u003eselect(\"*\")\n    -\u003efrom(\"myTable\")\n    -\u003ewhere(\"name = ?\",[$_POST['name']])\n    -\u003etoList();\n```\n\n\n\n## Table of Content\n\n- [DaoOne](#daoone)\n  * [Install (using composer)](#install--using-composer-)\n  * [Install (manually)](#install--manually-)\n  * [Usage](#usage)\n    + [Start a connection](#start-a-connection)\n    + [Run an unprepared query](#run-an-unprepared-query)\n    + [Run a prepared query](#run-a-prepared-query)\n    + [Run a prepared query with parameters.](#run-a-prepared-query-with-parameters)\n    + [Return data (first method)](#return-data--first-method-)\n    + [Return data (second method)](#return-data--second-method-)\n    + [Running a transaction](#running-a-transaction)\n  * [Query Builder (DQL)](#query-builder--dql-)\n    + [select($columns)](#select--columns-)\n    + [distinct($distinct='distinct')](#distinct--distinct--distinct--)\n    + [from($tables)](#from--tables-)\n    + [where($where,[$arrayParameters=array()])](#where--where---arrayparameters-array----)\n    + [order($order)](#order--order-)\n    + [group($group)](#group--group-)\n    + [having($having,[$arrayParameters])](#having--having---arrayparameters--)\n    + [runGen($returnArray=true)](#rungen--returnarray-true-)\n    + [toList()](#tolist--)\n    + [toResult()](#toresult--)\n    + [first()](#first--)\n    + [last()](#last--)\n    + [sqlGen()](#sqlgen--)\n  * [Query Builder (DML), i.e. insert, update,delete](#query-builder--dml---ie-insert--update-delete)\n    + [insert($table,$schema,[$values])](#insert--table--schema---values--)\n    + [update($$table,$schema,$values,[$schemaWhere],[$valuesWhere])](#update---table--schema--values---schemawhere----valueswhere--)\n    + [delete($table,$schemaWhere,[$valuesWhere])](#delete--table--schemawhere---valueswhere--)\n  * [Changelist](#changelist)\n\n\n\n## Install (using composer)\n\n\u003e\n\nAdd to composer.json the next requirement, then update composer.\n\n```json\n  {\n      \"require\": {\n        \"eftec/daoone\": \"^3.15\"\n      }\n  }\n```\nor install it via cli using\n\n\u003e composer require eftec/daoone\n\n## Install (manually)\n\nJust download the file lib/DaoOne.php and save it in a folder.\n\n## Usage\n\n### Start a connection\n\n```php\n$dao=new DaoOne(\"127.0.0.1\",\"root\",\"abc.123\",\"sakila\",\"\");\n$dao-\u003econnect();\n```\n\nwhere \n* 127.0.0.1 is the server where is the database.\n* root is the user   \n* abc.123 is the password of the user root.\n* sakila is the database used.\n* \"\" (optional) it could be a log file, such as c:\\temp\\log.txt\n\n### Run an unprepared query\n\n```php\n$sql=\"CREATE TABLE `product` (\n    `idproduct` INT NOT NULL AUTO_INCREMENT,\n    `name` VARCHAR(45) NULL,\n    PRIMARY KEY (`idproduct`));\";\n$dao-\u003erunRawQuery($sql);  \n```\n\n### Run a prepared query\n```php\n$sql=\"insert into `product`(name) values(?)\";\n$stmt=$dao-\u003eprepare($sql);\n$productName=\"Cocacola\";\n$stmt-\u003ebind_param(\"s\",$productName); // s stand for string. Also i =integer, d = double and b=blob\n$dao-\u003erunQuery($stmt);\n```\n\n\u003e note: you could also insert using a procedural chain [insert($table,$schema,[$values])](#insert--table--schema---values--)\n\n### Run a prepared query with parameters.\n```php\n$dao-\u003erunRawQuery('insert into `product` (name) values(?)'\n    ,array('s','cocacola'));\n```\n\n\n\n### Return data (first method)\nIt returns a mysqli_statement.\n\n```php\n    $sql=\"select * from `product` order by name\";\n    $stmt=$dao-\u003eprepare($sql);\n    $dao-\u003erunQuery($stmt);\n    $rows = $stmt-\u003eget_result();\n    while ($row = $rows-\u003efetch_assoc()) {\n        var_dump($row);\n    }\n    \n```    \n\u003e This statement must be processed manually.\n\n### Return data (second method)\nIt returns an associative array.\n\n```php\n    $sql=\"select * from `product` order by name\";\n    $stmt=$dao-\u003eprepare($sql);\n    $dao-\u003erunQuery($stmt);\n    $rows = $stmt-\u003eget_result();\n    $allRows=$rows-\u003efetch_all(MYSQLI_ASSOC);\n    var_dump($allRows);\n```    \n\n### Running a transaction\n```php\ntry {\n    $sql=\"insert into `product`(name) values(?)\";\n    $dao-\u003estartTransaction();\n    $stmt=$dao-\u003eprepare($sql);\n    $productName=\"Fanta\";\n    $stmt-\u003ebind_param(\"s\",$productName); \n    $dao-\u003erunQuery($stmt);\n    $dao-\u003ecommit(); // transaction ok\n} catch (Exception $e) {\n    $dao-\u003erollback(false); // error, transaction cancelled.\n}\n```   \n#### startTransaction()\nIt starts a transaction\n\n#### commit($throw=true)\nIt commits a transaction. \n* If $throw is true then it throws an exception if the transaction fails to commit.  Otherwise, it does not.\n\n#### rollback($throw=true)\nIt rollbacks a transaction. \n* If $throw is true then it throws an exception if the transaction fails to rollback.  If false, then it ignores if the rollback fail or if the transaction is not open.\n\n### Fields\n\n### throwOnError=true\nIf true (default), then it throws an error if happens an error. If false, then the execution continues  \n\n### isOpen=true\nIt is true if the database is connected otherwise,it's false.\n\n\n## Query Builder (DQL)\nYou could also build a procedural query.\n\nExample:\n```php\n$results = $dao-\u003eselect(\"*\")-\u003efrom(\"producttype\")\n    -\u003ewhere('name=?', ['s', 'Cocacola'])\n    -\u003ewhere('idproducttype=?', ['i', 1])\n    -\u003etoList();   \n```\n\n### select($columns)\nGenerates a select command.\n```php\n$results = $dao-\u003eselect(\"col1,col2\")-\u003e...\n```\n\u003e Generates the query: **select col1,col2** ....\n\n```php\n$results = $dao-\u003eselect(\"select * from table\")-\u003e...\n```\n\n\u003e Generates the query: **select * from table** ....\n\n\n\n### distinct($distinct='distinct')\nGenerates a select command.\n```php\n$results = $dao-\u003eselect(\"col1,col2\")-\u003edistinct()...\n```\n\u003e Generates the query: select **distinct** col1,col2 ....\n\n\u003eNote: -\u003edistinct('unique') returns select **unique** ..\n\n### from($tables)\nGenerates a from command.\n```php\n$results = $dao-\u003eselect(\"*\")-\u003efrom('table')...\n```\n\u003e Generates the query: select * **from table**\n\n**$tables** could be a single table or a sql construction. For examp, the next command is valid:\n\n```php\n$results = $dao-\u003eselect(\"*\")-\u003efrom('table t1 inner join t2 on t1.c1=t2.c2')...\n```\n\n\n### where($where,[$arrayParameters=array()])\nGenerates a where command.\n\n* $where is an array or a string. If it's a string, then it's evaluated by using the parameters. if any\n\n```php\n$results = $dao-\u003eselect(\"*\")\n-\u003efrom('table')\n-\u003ewhere('p1=1')...\n```\n\u003e Generates the query: select * **from table** where p1=1\n\n\u003e Note: ArrayParameters is an array as follow: **type,value.**     \n\u003e   Where type is i=integer, d=double, s=string or b=blob. In case of doubt, use \"s\"   \n\u003e Example of arrayParameters:   \n\u003e ['i',1 ,'s','hello' ,'d',20.3 ,'s','world']\n\n```php\n$results = $dao-\u003eselect(\"*\")\n-\u003efrom('table')\n-\u003ewhere('p1=?',['i',1])...\n```\n\u003e Generates the query: select * from table **where p1=?(1)**\n\n```php\n$results = $dao-\u003eselect(\"*\")\n-\u003efrom('table')\n-\u003ewhere('p1=? and p2=?',['i',1,'s','hello'])...\n```\n\n\u003e Generates the query: select * from table **where p1=?(1) and p2=?('hello')**\n\n\u003e Note. where could be nested.\n```php\n$results = $dao-\u003eselect(\"*\")\n-\u003efrom('table')\n-\u003ewhere('p1=?',['i',1])\n-\u003ewhere('p2=?',['s','hello'])...\n```\n\u003e Generates the query: select * from table **where p1=?(1) and p2=?('hello')**\n\nYou could also use:\n```php\n$results = $dao-\u003eselect(\"*\")-\u003efrom(\"table\")\n    -\u003ewhere(['p1'=\u003e'Coca-Cola','p2'=\u003e1])\n    -\u003etoList();\n```\n\u003e Generates the query: select * from table **where p1=?(Coca-Cola) and p2=?(1)**        \n\n### order($order)\nGenerates a order command.\n```php\n$results = $dao-\u003eselect(\"*\")\n-\u003efrom('table')\n-\u003eorder('p1 desc')...\n```\n\u003e Generates the query: select * from table **order by p1 desc**\n\n### group($group)\nGenerates a group command.\n```php\n$results = $dao-\u003eselect(\"*\")\n-\u003efrom('table')\n-\u003egroup('p1')...\n```\n\u003e Generates the query: select * from table **group by p1**\n\n### having($having,[$arrayParameters])\nGenerates a group command.\n```php\n$results = $dao-\u003eselect(\"*\")\n-\u003efrom('table')\n-\u003egroup('p1')\n-\u003ehaving('p1\u003e?',array('i',1))...\n```\n\u003e Generates the query: select * from table group by p1 having p1\u003e?(1)\n\n\u003e Note: Having could be nested having()-\u003ehaving()  \n\u003e Note: Having could be without parameters having('col\u003e10') \n\n### runGen($returnArray=true)\nRun the query generate.\n\n\u003eNote if returnArray is true then it returns an associative array.\n\u003e if returnArray is false then it returns a mysqli_result  \n\u003eNote: It resets the current parameters (such as current select, from, where,etc.)\n\n### toList()\nIt's a macro of runGen. It returns an associative array or null.\n\n```php\n$results = $dao-\u003eselect(\"*\")\n-\u003efrom('table')\n-\u003etoList()\n```\n### toResult()\nIt's a macro of runGen. It returns a mysqli_result or null.\n\n```php\n$results = $dao-\u003eselect(\"*\")\n-\u003efrom('table')\n-\u003etoResult()\n```\n\n### first()\nIt's a macro of runGen. It returns the first row (if any, if not, it returns false) as an associative array.\n\n```php\n$results = $dao-\u003eselect(\"*\")\n-\u003efrom('table')\n-\u003efirst()\n```\n\n### last()\nIt's a macro of runGen. It returns the last row (if any, if not, it returns false) as an associative array.\n\n```php\n$results = $dao-\u003eselect(\"*\")\n-\u003efrom('table')\n-\u003elast()\n```\n\u003e Sometimes is more efficient to run order() and first() because last() reads all values.\n\n### sqlGen()\n\nIt returns the sql command.\n```php\n$sql = $dao-\u003eselect(\"*\")\n-\u003efrom('table')\n-\u003esqlGen();\necho $sql; // returns select * from table\n$results=$dao-\u003etoList(); // executes the query\n```\n\u003e Note: it doesn't reset the query.\n\n## Query Builder (DML), i.e. insert, update,delete\n\nThere are four ways to execute each command.\n\nLet's say that we want to add an **integer** in the column **col1** with the value **20**\n\n__Schema and values using a list of values__: Where the first value is the column, the second is the type of value (i=integer,d=double,s=string,b=blob) and second array contains the values.\n```php\n$dao-\u003einsert(\"table\"\n    ,['col1','i']\n    ,[20]);\n```\n__Schema and values in the same list__: Where the first value is the column, the second is the type of value (i=integer,d=double,s=string,b=blob) and the third is the value.\n```php\n$dao-\u003einsert(\"table\"\n    ,['col1','i',20]);\n```\n\n__Schema and values using two associative arrays__:\n\n```php\n$dao-\u003einsert(\"table\"\n    ,['col1'=\u003e'i']\n    ,['col1'=\u003e20]);\n```\n__Schema and values using a single associative array__: The type is calculated automatically.\n\n```php\n$dao-\u003einsert(\"table\"\n    ,['col1'=\u003e20]);\n```\n\n### insert($table,$schema,[$values])\nGenerates a insert command.\n\n```php\n$dao-\u003einsert(\"producttype\"\n    ,['idproducttype','i','name','s','type','i']\n    ,[1,'cocacola',1]);\n```\n\nUsing nested chain (single array)\n```php\n    $dao-\u003efrom(\"producttype\")\n        -\u003eset(['idproducttype','i',0 ,'name','s','Pepsi' ,'type','i',1])\n        -\u003einsert();\n```\n\nUsing nested chain multiple set\n```php\n    $dao-\u003efrom(\"producttype\")\n        -\u003eset(\"idproducttype=?\",['i',101])\n        -\u003eset('name=?',['s','Pepsi'])\n        -\u003eset('type=?',['i',1])\n        -\u003einsert();\n```\nor (the type is defined, in the possible, automatically by MySql)     \n```php\n    $dao-\u003efrom(\"producttype\")\n        -\u003eset(\"idproducttype=?\",['i',101])\n        -\u003eset('name=?','Pepsi')\n        -\u003eset('type=?',1)\n        -\u003einsert();\n```\n\n\n\n\n    \nUsing nested chain declarative set\n```php\n    $dao-\u003efrom(\"producttype\")\n        -\u003eset('(idproducttype,name,type) values (?,?,?)',['i',100,'s','Pepsi','i',1])\n        -\u003einsert();\n```\n\n\n\u003e Generates the query: **insert into productype(idproducttype,name,type) values(?,?,?)** ....\n\n\n### update($$table,$schema,$values,[$schemaWhere],[$valuesWhere])\nGenerates a insert command.\n\n```php\n$dao-\u003eupdate(\"producttype\"\n    ,['name','s','type','i'] //set\n    ,[6,'Captain-Crunch',2] //set\n    ,['idproducttype','i'] // where\n    ,[6]); // where\n```\n\n```php\n$dao-\u003eupdate(\"producttype\"\n    ,['name'=\u003e'Captain-Crunch','type'=\u003e2] // set\n    ,['idproducttype'=\u003e6]); // where\n```\n\n```php\n$dao-\u003efrom(\"producttype\")\n    -\u003eset(\"name=?\",['s','Captain-Crunch']) //set\n    -\u003eset(\"type=?\",['i',6]) //set\n    -\u003ewhere('idproducttype=?',['i',6]) // where\n    -\u003eupdate(); // update\n```\n\nor\n\n```php\n$dao-\u003efrom(\"producttype\")\n    -\u003eset(\"name=?\",'Captain-Crunch') //set\n    -\u003eset(\"type=?\",6) //set\n    -\u003ewhere('idproducttype=?',['i',6]) // where\n    -\u003eupdate(); // update\n```\n\n\n\u003e Generates the query: **update producttype set `name`=?,`type`=? where `idproducttype`=?** ....\n\n### delete([$table],[$schemaWhere],[$valuesWhere])\nGenerates a delete command.\n\n```php\n$dao-\u003edelete(\"producttype\"\n    ,['idproducttype','i'] // where\n    ,[7]); // where\n```\n```php\n$dao-\u003edelete(\"producttype\"\n    ,['idproducttype'=\u003e7]); // where\n```\n\u003e Generates the query: **delete from producttype where `idproducttype`=?** ....\n\nYou could also delete via a DQL builder chain.\n```php\n$dao-\u003efrom(\"producttype\")\n    -\u003ewhere('idproducttype=?',['i',7]) // where\n    -\u003edelete(); \n```\n```php\n$dao-\u003efrom(\"producttype\")\n    -\u003ewhere(['idproducttype'=\u003e7]) // where\n    -\u003edelete(); \n```\n\u003e Generates the query: **delete from producttype where `idproducttype`=?** ....\n\n## Sequence\n\nSequence is an alternative to AUTO_NUMERIC field.  It uses a table to generate an unique ID.  \nThe sequence used is based on Twitter's Snowflake and it is generated based on \ntime (with microseconds), Node Id and a sequence.   This generates a LONG (int 64) value that it's unique\n\n### Creating a sequence\n\n* **$dao-\u003enodeId** set the node value (default is 1). If we want unique values amongst different clusters,\n then we could set the value\nof the node as unique. The limit is up to 1024 nodes.\n* **$dao-\u003etableSequence** it sets the table (and function), the default value is snowflake.\n\n```\n$dao-\u003enodeId=1; // optional\n$dao-\u003etableSequence='snowflake'; // optional\n$dao-\u003ecreateSequence(); // it creates a table called snowflake and a function called next_snowflake()\n```\n\n### Using the sequence\n\n* **$dao-\u003egetSequence([unpredictable=false])** returns the last sequence. If the sequence fails to generate, then it returns -1.\n The function could fails if the function is called more than 4096 times every 1/1000th second.\n\n```\n$dao-\u003egetSequence() // string(19) \"3639032938181434317\" \n```\n\n```\n$dao-\u003egetSequence(true) // returns a sequence by flipping some values.\n```\n\n### Creating a sequence without a table.\n\n* **$dao-\u003egetSequencePHP([unpredictable=false])** Returns a sequence without using a table.\n  This sequence is more efficient than $dao-\u003egetSequence but it uses a random value to deals\n  with collisions.\n  \n* If upredictable is true then it returns an unpredictable number (it flips some digits)\n\n```\n$dao-\u003egetSequencePHP() // string(19) \"3639032938181434317\" \n```\n\n```\n$dao-\u003egetSequencePHP(true) // string(19) \"1739032938181434311\" \n```\n\n\n\n## Changelist\n\n* 3.30 2020-02-13 Some cleanup.\n* 3.28 2019-05-04 Added comments. Also -\u003eselect() allows an entire query.\n* 3.27 2019-04-21 Added new methods of encryption SIMPLE (short encryption) and INTEGER (it converts and returns an integer)\n* 3.26 2019-03-06 Now Encryption has it's own class.\n* 3.25 2019-03-06 Added getSequencePHP(), getUnpredictable() and getUnpredictableInv()\n* 3.24 2019-02-06 Added a new format of date\n* 3.22 2018-12-30 Added sequence\n* 3.21 2018-12-17 Fixed a bug with parameters, set() and insert(). There are several ways to do an insertar.  Now NULL is self:null\n* 3.20 2018-12-15 Fixed bug with parameters and insert(). \n* 3.19 2018-12-09 Now null parameters are considered null.  We use instead PHP_INT_MAX to indicate when the value is not set. \n* 3.18 2018-12-07 Changed minimum stability.\n* 3.17 2018-12-01 set() now allows a single value for the second argument.   \n* 3.16 2018-11-03 Added test unit and travis CI.\n* 3.15 2018-10-27\n* * Now it allows multiple select()\n* * function generateSqlFields()\n* 3.14 2018-10-16 \n* * Added field throwOnError. \n* * Added more control on the error. \n* * Now methods fails if the database is not open.\n* * Added a container to messages (optional). It works with the function messages()\n* * Added field isOpen\n* * Added method storeInfo()\n* 3.13 2018-10-05 Changed command eval to bind_param( ...)\n* 3.12 2018-09-29 Fixed a bug with insert() it now returns the last identity.\n* 3.11 2018-09-27 Cleaned the code. If it throws an exception, then the chain is reset.\n* 3.9 2018-09-24 Some fixes\n* 3.7 Added charset.\n* 3.6 More fixes.\n* 3.5 Small fixed.\n* 3.4 DML new features. It allows nested operations \n    + -\u003efrom()-\u003ewhere()-\u003edelete()\n    + -\u003efrom()-\u003eset()-\u003ewhere()-\u003eupdate()\n    + -\u003efrom()-\u003eset()-\u003einsert()\n* 3.3 DML modified. It allows a different kind of parameters.\n* 3.2 Insert, Update,Delete\n* 3.0 Major overhaul. It adds Query Builder features.\n* 2.6.4 Better correction of error.\n* 2.6.3 Fixed transaction. Now a nested transaction is not nested (and returns a false).\n* 2.6 first public version\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feftec%2Fdaoone","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feftec%2Fdaoone","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feftec%2Fdaoone/lists"}