{"id":45184564,"url":"https://github.com/moviet/tuisql","last_synced_at":"2026-02-20T10:30:22.009Z","repository":{"id":57020226,"uuid":"161780837","full_name":"moviet/tuisql","owner":"moviet","description":"Tuisql - A dynamic php database query builder","archived":false,"fork":false,"pushed_at":"2019-03-06T17:58:52.000Z","size":57,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-04-05T16:03:14.642Z","etag":null,"topics":["database","database-adapter","database-handler","pdo","query-builder"],"latest_commit_sha":null,"homepage":"","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/moviet.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-12-14T12:18:33.000Z","updated_at":"2024-01-08T09:39:47.000Z","dependencies_parsed_at":"2022-08-22T20:31:16.683Z","dependency_job_id":null,"html_url":"https://github.com/moviet/tuisql","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/moviet/tuisql","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moviet%2Ftuisql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moviet%2Ftuisql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moviet%2Ftuisql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moviet%2Ftuisql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/moviet","download_url":"https://codeload.github.com/moviet/tuisql/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moviet%2Ftuisql/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29647861,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-20T09:27:29.698Z","status":"ssl_error","status_checked_at":"2026-02-20T09:26:12.373Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["database","database-adapter","database-handler","pdo","query-builder"],"created_at":"2026-02-20T10:30:21.271Z","updated_at":"2026-02-20T10:30:21.999Z","avatar_url":"https://github.com/moviet.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"Tuisql - A dynamic query builder\n======================================================\n[![Build Status](https://travis-ci.org/moviet/tuisql.svg?branch=master)](https://travis-ci.org/moviet/tuisql)\n[![License](http://img.shields.io/:license-mit-blue.svg?style=flat-square)](http://doge.mit-license.org)\n[![Usage](https://img.shields.io/badge/usage-easy-ff69b4.svg)](https://github.com/moviet/tuisql)\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/fe6415f880494880b69cf574d9248f9d)](https://www.codacy.com/app/moviet/tuisql?utm_source=github.com\u0026amp;utm_medium=referral\u0026amp;utm_content=moviet/tuisql\u0026amp;utm_campaign=Badge_Grade)\n\n**Tuisql** is a fast database query builder, scalable and portability, based on PDO (PHP Data Object)\nas quick prepare statement, build on minimalize source codes with **_richest usage_** that may will help you \nto make an efficient development and reduce any _complexity_ just at the first you have to know how we add \nsecurity against _sql injection_ on the nice _docs_ you must read by _carefully_ and use with **yaayy**\n\n## Already\n\n* [Composer](https://getcomposer.org) \n\n## Install\n```\ncomposer require \"moviet/tuisql\"\n```\n\n## Features\n\n* **Build Connection**\n* **Simple C.R.U.D**\n* **Various Of Query**\n* **Hardcoded Query**\n* **Retrieve Query**\n\n## Usage\n\n### Build Connection\n\n* You can simply write database configuration like imho\n\n  | Setting        |\n  |:---------------| \n  | Driver         |\n  | Hostname       |\n  | Port Number    | \n  | Database Name  | \n  | Username       |\n  | Password       |\n\n  ```php\n  require __DIR__ . '/vendor/autoload.php';\n\n  use Moviet\\Base\\Tuisql;\n  use Moviet\\Base\\Puppen\\Tui;\n  \n  $connect = Tui::click(\n      ['driver','hostname','port','dbname','username','password']\n  ); \n  \n  // Or simply like this\n  \n  $connect = Tui::click(\n      ['mysql','localhost','3306','dbname','username','password']\n  );  \n  ```\n\n* For **sqlite** database you can use like simple\n  ```php\n  $connect = Tui::sqlite('folder/folder/folder','mysqlite.db');\n  ```\n  Path location is your mind on your own directory by using _simply format_ on above\n\n### Simple CRUD (Create, Read, Update, Delete)\n\n* To _insert_ a database you can use **Add** just like below\n  ```php\n  require __DIR__ . '/vendor/autoload.php';\n\n  use Moviet\\Base\\Tuisql;\n  use Moviet\\Base\\Puppen\\Tui;\n\n  $build = Tui::click(\n      ['mysql','localhost','3306','dbname','username','password']\n  );\n\n  $connect = new Tuisql($build);\n\n  $column = ['category','material','color'];\n\n  $values = ['jacket','cotton','brown'];\n  \n  $connect-\u003efrom('table')\n          -\u003ecolumn($column)\n          -\u003evalue($values)\n          -\u003eadd();\n  ```\n\n  `\n  INSERT INTO table (category, material, color) VALUES (:category1, :material2, :color3) \n  `\n\n* Then to _read_ a simple database you can use **Run** as simply like this\n  ```php\n  $values = [$varOne, $varTwo, $varNext];  \n\n  $connect-\u003eselect('*')\n          -\u003efrom('table')\n          -\u003ewhere('id, product')\n          -\u003evalue($values)\n          -\u003erun();\n  ```\n\n  `\n  SELECT * FROM table WHERE id=:id1 AND product=:product2\n  `\n\n* We don't want make a hard when _update_ database, you can **Fresh** those\n  ```php\n   // use array style\n   $connect-\u003eselect(['table'])\n           -\u003eset(['column','column','column','column'])\n           -\u003ewhere(['column'])\n           -\u003evalue(['work','easy','stay','writable'])\n           -\u003efresh();\n  ```\n\n* And last to _delete_ database you can express **Del** with yayy\n  ```php\n   // use commas style\n   $connect-\u003efrom('table')\n           -\u003ewhere('column, column')\n           -\u003evalue([$anyId, $anyVariable])\n           -\u003edel();\n  ```\n\n  By some different examples on above, you are **_totally free_** to express your styles\n\n### Various Of Query\n\n* Add single **Limit** Condition\n  ```php\n  $select  = ['column','column','column'];\n  $wheres  = ['notes','usage'];\n   \n  $values  = ['sweet','easy'];  \n\n  $connect-\u003eselect($select)\n          -\u003efrom('table')\n          -\u003ewhere($wheres)\n          -\u003elimit(10) // \u003c= Optional integer/string\n          -\u003evalue($data)\n          -\u003erun();\n  ```     \n\n* Add **Offset Or Limits** Condition\n  ```php\n  $select  = 'column, column, column';\n  $wheres  = 'type, category';\n\n  $values  = ['comma','yippy', 10, 20];  // \u003c= Add binding values\n\n  $connect-\u003eselect($select)\n          -\u003efrom('table')\n          -\u003ewhere($wheres)\n          -\u003elimits('one, two') // \u003c= add uniques :bind (implicitely)\n          -\u003evalue($values)\n          -\u003erun();\n  ```   \n\n  `\n  SELECT column, column, column FROM table WHERE type=:type1 AND category=:category2 LIMIT :one, :two\n  `\n\n* Add **Count** Condition\n  ```php\n  $connect-\u003eselect('column, column, column')\n          -\u003ecount('column')\n          -\u003efrom('table')\n          -\u003ewhere('column')\n          -\u003elimits('11, 12') // must be unique :naming\n          -\u003evalue(['something', 11, 12])\n          -\u003erun();\n  ```  \n\n* Add **Distinct** Condition\n  ```php\n  $connect-\u003edistinct('column AS price')\n          -\u003efrom('table')\n          -\u003ewhere('something')\n          -\u003elimit(22)\n          -\u003evalue(['something'])\n          -\u003erun();\n  ```  \n\n* Add **Group By** Condition\n  ```php\n  $select  = ['column','column','column'];\n  $wheres  = ['column','column','column'];\n\n  $values  = ['make','ease','readable']; \n\n  $connect-\u003eselect($select)\n          -\u003efrom('table')\n          -\u003ewhere($wheres)\n          -\u003egroupBy('hashtable')\n          -\u003evalue($values)\n          -\u003erun();\n  ``` \n\n* Add **Order By** Condition\n  ```php\n  $select  = ['column','column','column'];\n  $wheres  = ['column','column','column'];\n\n  $values  = ['free','styles','whatever']; \n\n  $connect-\u003eselect($select)\n          -\u003efrom('table')\n          -\u003ewhere($wheres)\n          -\u003egroupBy('column')\n          -\u003eOrderBy('date ASC') // \u003c= sorting\n          -\u003elimit('15')\n          -\u003evalue($values)\n          -\u003erun();\n  ``` \n\n* Add **Like** Condition\n  ```php\n  $select  = 'column, column, column';\n  $likes   = 'chocolato, coffee';\n\n  $values  = ['delicious','groovy'];\n\n  $connect-\u003eselect($select)\n          -\u003efrom('table')\n          -\u003eisWhere()  // \u003c= require Where condition\n          -\u003elike($likes)\n          -\u003evalue($values)\n          -\u003erun();\n  ```\n\n  The above will add LIKE with **AND** condition, you can put **-\u003eorLike()** to create OR condition\n\n* Add **Having** Condition\n  ```php\n  $connect-\u003eselect('column, column, column')\n          -\u003efrom('table')\n          -\u003ehaving('count(column) \u003e :ten') // \u003c= add optional :bind\n          -\u003egroupBy('column count(a, b, c)')\n          -\u003evalue([10]) // \u003c= get :bind value\n          -\u003erun();\n  ```\n\n* Add **Between** Condition\n  ```php\n  $select  = 'column, column, column';  \n  $where   = 'column, column';\n  $between = 'column, column'; // \u003c= add between column name\n\n  $values  = ['distract','damages','between_val','between_val'];\n\n  $connect-\u003eselect($select)\n          -\u003efrom('table')\n          -\u003ewhere($where)\n          -\u003ebetween($between)\n          -\u003evalue($values)\n          -\u003erun();\n  ```\n\n* Add **OR** with Where Condition\n  ```php\n  $select  = 'column, column, column';  \n  $where   = 'column, column';\n\n  $values  = ['magnum','doritos'];\n\n  $connect-\u003eselect($select)\n          -\u003efrom('table')\n          -\u003eor()\n          -\u003ewhere($where)\n          -\u003evalue($values)\n          -\u003erun();\n  ```\n\n* Add **Where In** Condition\n  ```php\n  $select  = ['column AS A','column'];  \n  $whereIn = ['column']; // add where in column\n  $addIn   = ['ca, ca, ca, ca']; // add uniques :binding\n\n  $values  = ['cheese','sauce','salt','sugar'];\n\n  $connect-\u003eselect($select)\n          -\u003efrom('table')\n          -\u003eisWhere()  // \u003c= must be add where condition\n          -\u003ewhereIn($whereIn, $addIn)\n          -\u003evalue($values)\n          -\u003erun();\n  ```\n\n* Add **Not In** Condition\n  ```php\n  $select  = ['column','column'];\n  $notIn   = ['column NOT']; // add Not explicitely\n  $addIn   = ['id, id, id, id'];\n\n  $values  = ['homies','sweet','home','selfie'];\n\n  $connect-\u003eselect($select)\n          -\u003efrom('table')\n          -\u003eisWhere()\n          -\u003ewhereIn($notIn, $addIn)\n          -\u003evalue($values)\n          -\u003erun();\n  ```\n\n* **Join** Tables Without Attributes\n  ```php\n  $select  = ['column.a','column.b','column.id as col'];\n  $wheres  = ['column.a','column.b'];\n\n  $values  = ['yayy','mooo'];\n\n  $connect-\u003eselect($select)\n          -\u003efrom('table.a')\n          -\u003ewhere($wheres)\n          -\u003evalue($values)\n          -\u003erun();\n  ```\n\n* **Inner Join** Tables\n  ```php\n  $select  = ['column.a*','column.b*'];\n  $table   = ['mytable'];\n  $join    = ['inner','column.b'];\n  $addOn   = ['column.a=column.id','column.b=column.id']; \n  $wheres  = ['column.aid','column.bid']; // \u003c= add 2 :binds column\n\n  $values  = [11, 12]; // \u003c= send bind with 2 values\n\n  $connect-\u003eselect($select)\n          -\u003efrom($table)\n          -\u003ejoin($join)\n          -\u003eon($addOn)\n          -\u003ewhere($where)\n          -\u003evalue($values)\n          -\u003erun();\n  ```\n\n  You can join many table with parameter and add attribute eg. [join, inner, left, cross, right]\n\n* **Join** Multi Table With **Where In**\n  ```php\n  $select  = ['column.a*','column.b*'];\n  $table   = ['mytable'];\n  $join    = ['left','column.b']; \n  $addOn   = ['column.a=column.id','column.b=column.id','column.b=column.a']; \n  $whereIn = ['column.a']; // \u003c= add column\n  $inValue = ['id','id','id','id']; // \u003c= add uniques :binds\n  $order   = ['date'];\n\n  $values  = [5, 20, 40, 48]; // \u003c= add values\n\n  $connect-\u003eselect($select)\n          -\u003efrom($table)\n          -\u003ejoin($join)\n          -\u003eon($addOn)\n          -\u003eisWhere()\n          -\u003ewhereIn($whereIn, $inValue)\n          -\u003eorderBy($order)\n          -\u003evalue($values)\n          -\u003erun();\n  ```\n\n  **Quotes** :\n   \u003e With various examples on above you can express many styles by your self\n\n### Hardcoded Query\n\n* You don't want anybody knows what you need, so you can make a _hardcoded_ like this\n  ```php\n  $select  = ['column','column'];\n  $table   = ['tableA']\n  $join1   = ['join','column.b']; \n  $On_1    = ['column.a=column.id','column.a=column.id','column.a=column.e']; \n  $join2   = ['inner','column.b']; \n  $On_2    = ['column.b=column.id','column.b=column.id','column.b=column.a']; \n  $join3   = ['left','column.b']; \n  $On_3    = ['column.c=column.id','column.c=column.id','column.c=column.b']; \n  $join4   = ['cross','column.c']; \n  $On_4    = ['column.d=column.id','column.d=column.id','column.d=column.c']; \n  $join5   = ['right','column.c']; \n  $On_5    = ['column.e=column.id','column.e=column.id','column.e=column.d']; \n  $wereIn1 = ['column.a'];\n  $withIn1 = ['a','a','a']; // \u003c= add unique string binds =\u003e a = :ina1,..\n  $wereIn2 = ['column.b'];\n  $withIn2 = ['b','b','b']; // \u003c= add unique string binds =\u003e b = :inb1,..\n  $group   = ['date.a'];\n  $order   = ['date.a ASC'];\n  $limit   = [20];\n\n  $values  = [1, 2, 3, 4, 8, 16, 24, 32]; // \u003c= depends on total parameter :binding\n\n  $connect-\u003eselect($select)\n          -\u003efrom($table)\n          -\u003ejoin($join1)\n          -\u003eon($On_1)\n          -\u003ejoin($join2)\n          -\u003eon($On_2)\n          -\u003ejoin($join3)\n          -\u003eon($On_3)\n          -\u003ejoin($join4)\n          -\u003eon($On_4)\n          -\u003ejoin($join5)\n          -\u003eon($On_5)\n          -\u003eisWhere()\n          -\u003eor()\n          -\u003ewhereIn($wereIn1, $withIn1)\n          -\u003ewhereIn($wereIn1, $withIn2)\n          -\u003egroupBy($group)\n          -\u003eorderBy($order)\n          -\u003elimit($limit)\n          -\u003evalue($values)\n          -\u003erun();\n  ```\n\n* You can create a **_Badass_** query that's still possible and use **_DRAW_** with hardcoded _manually_\n  ```php\n  $colom   = ['columnA','columnB AS Badass'];\n  $count   = ['columnD'];\n  $table   = ['columnA'];\n  $draw1   = ['INNER JOIN column.b AS Bad ON column.id, column.di WHERE columnA.id=:param']; // \u003c= add binding \":\" name\n  $draw2   = ['UNION ALL'];\n  $draw3   = ['(SELECT column.id FROM columnC'];\n  $join1   = ['left','column.b']; \n  $addOn1  = ['column.b=column.id','column.b=column.id','column.b=column.a']; \n  $join2   = ['cross','column.c']; \n  $addOn2  = ['column.c=column.id','column.c=column.id','column.c=column.a']; \n  $join3   = ['right','column.d']; \n  $addOn3  = ['column.d=column.id','column.d=column.id','column.d=column.a']; \n  $where   = ['column.a','column.b','column.c'];\n  $among   = ['a.date','b.date'];\n  $whereIn = ['column.a'];\n  $withIn  = ['id','id','id'];\n  $likes   = ['column.b', 'column.c'];\n  $groups  = ['columnA.date','columnB.date','columnC.date'];\n  $orders  = ['column.a ASC','column.b ASC','column.c ASC'];\n  $limit   = [':hundred)']; // \u003c= add limit binding \":\" name\n\n  $values  = ['home','sweet','home','makes', date('Y-m-d'), date('Y-m-d'), 1, 2, 3, 'badass','speed', 100]; // in sequence \n\n  $connect-\u003eselect($colom)\n          -\u003ecount($count)\n          -\u003efrom($table)\n          -\u003edraw($draw1)\n          -\u003edraw($draw2)\n          -\u003edraw($draw3)\n          -\u003ejoin($join1)\n          -\u003eon($addOn1)\n          -\u003ejoin($join2)\n          -\u003eon($addOn2)\n          -\u003ejoin($join3)\n          -\u003eon($addOn3)\n          -\u003ewhere($where)\n          -\u003ebetween($among)\n          -\u003ewhereIn($whereIn, $withIn)\n          -\u003eorLike()\n          -\u003elike($likes)\n          -\u003egroupBy($groups)\n          -\u003eorderBy($orders)\n          -\u003elimit($limit)\n          -\u003evalue($values)\n          -\u003erun();\n  ```\n  **Notes** :\n   \u003e You must add uniques **:name** as binding when you get _values_ from **outside** to prevent **_sql injection_**\n\n  The example on above will produces a hardcoded query like below\n\n  ```php\n  SELECT columnA, columnB AS Badass, \n  COUNT(columnD)\n  FROM columnA\n  INNER JOIN column.b AS Bad\n  ON column.id, column.date \n  WHERE columnA.id=:bindparam\n  UNION ALL\n        (SELECT column.id \n         FROM columnC\n         LEFT JOIN column.b \n         ON column.b=column.id, column.b=column.id, column.b=column.a\n         CROSS JOIN column.c\n         ON column.c=column.id, column.c=column.id, column.c=column.a\n         RIGHT JOIN column.d\n         ON column.d=column.id, column.d=column.id, column.d=column.a\n         WHERE column.a=:columna1 AND column.b=:columnb2 AND column.c=:columnc3 \n         AND a.date BETWEEN :bdate AND b.date BETWEEN :bdate \n         AND column.a IN(:inid1, :inid2, :inid3)\n         AND column.b LIKE :columnb1 OR column.c LIKE :columnc2\n         GROUP BY columnA.date, columnB.date, columnC.date\n         ORDER BY column.a ASC, column.b ASC, column.c ASC\n         LIMIT :hundred)\n  ``` \n\n### Joins\n\n| Attributes     | Values          | \n| -------------- |:----------------| \n| join           | JOIN            |\n| inner          | INNER JOIN      | \n| left           | LEFT JOIN       | \n| right          | RIGHT JOIN      |\n| cross          | CROSSS JOIN     | \n\n### Retrieve Query\n\n* You can retrieve a _single row_ from **Tuisql** as simply as below\n  ```php\n  require __DIR__ . '/vendor/autoload.php';\n\n  use Moviet\\Base\\Tuisql;\n  use Moviet\\Base\\Puppen\\Tui;\n  use Moviet\\Base\\Fetchs\\Rtui;\n\n  $database = Tui::click(\n      ['mysql','localhost','3306','dbname','username','password']\n  );\n\n  $connect = new Tuisql($database);\n\n  $column = ['myid','type','color'];\n  $values = [123456];\n\n  $query  = $connect-\u003eselect($column)\n                    -\u003efrom('house')\n                    -\u003ewhere('id')\n                    -\u003evalue($values)\n                    -\u003erun();\n\n  $getRow = Rtui::oneRow($query);\n\n  $myid   = $getRow['myid'];\n  $type   = $getRow['type'];\n  $color  = $getRow['color'];\n\n  $direct = Rtui::notFound($getRow, '404.shtml'); // Direct url eg. url/404.shtml\n  ```\n\n* And to retrieve _more data_ you can use like this\n  ```php\n  $database = Tui::click(\n      ['mysql','localhost','3306','dbname','username','password']\n  );\n\n  $connect = new Tuisql($database);\n\n  $column = ['code','shoes','color'];\n  $values = [123456];\n\n  $query  = $connect-\u003eselect($column)\n                    -\u003efrom('house')\n                    -\u003ewhere('code')\n                    -\u003evalue($values)\n                    -\u003erun();\n\n  $allRow = Rtui::allRow($query); // Equivalent like fetchAll\n\n  foreach ($allRow as $row =\u003e $all) {\n\n      $code   = $all['code'];\n      $shoes  = $all['shoes'];\n      $color  = $all['color'];\n  }\n\n  $direct = Rtui::notFound($allRow, '404.shtml'); // Direct url eg. url/404.shtml\n  ```\n  \n* Retrieve _one column_ of query\n  ```php\n  $allRow = Rtui::oneColumn($query);\n  ```\n  \n* Retrieve _Row Count_ of query\n  ```php\n  $allRow = Rtui::count($query);\n  ```\n  \n* Retrieve _Row Num_ of query\n  ```php\n  $allRow = Rtui::oneNum($query);\n  ```\n  \n* Retrieve _Row Lazy_ of query\n  ```php\n  $allRow = Rtui::oneLazy($query);\n  ```\n  \n* Retrieve _Row Object_ of query\n  ```php\n  $allRow = Rtui::allObj($query);\n  ```\n\n\n## License\n\n`Moviet/tuisql` is released under the MIT public license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoviet%2Ftuisql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmoviet%2Ftuisql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoviet%2Ftuisql/lists"}