From 41dfb1eddda304931007b934b3baec753baff781 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Rataj?= Date: Mon, 15 Jul 2024 15:22:22 +0200 Subject: [PATCH] Update README --- README.md | 288 ++++++++++++++++++++++++++---------------------------- ssql.php | 11 +-- tests.php | 4 +- 3 files changed, 144 insertions(+), 159 deletions(-) diff --git a/README.md b/README.md index 22f0bb1..e52acbf 100644 --- a/README.md +++ b/README.md @@ -1,95 +1,82 @@ # SuperSQL -SuperSQL is an easy-to-use powerful SQL query builder for SQLite and MySQL. +SuperSQL is an easy-to-use, yet powerful SQL query builder for SQLite and MySQL. ## Requirements -* PHP 5.6+ +* PHP 7+ * PDO SQLite / MySQL driver ## Setup -* Download the ssql.php file ([https://raw.githubusercontent.com/ratajs/SuperSQL/2.2/ssql.php](https://raw.githubusercontent.com/ratajs/SuperSQL/2.2/ssql.php)) +* Download the ssql.php file ([https://raw.githubusercontent.com/ratajs/SuperSQL/2.3/ssql.php](https://raw.githubusercontent.com/ratajs/SuperSQL/2.3/ssql.php)) * Include the file with `include` / `require` ## Examples -Let’s have a table “users” with 5 columns: `uid`, `username`, `password`, `sign_up_time` and `nickname` +Let’s have a table ‘users’ with 5 columns: `uid`, `username`, `password`, `sign_up_time` and `nickname` ```php q($q[, $a]), FETCH_ALL returns an array of rows, FETCH_OBJECT and FETCH_ARRAY return one row per call - $ssql->q("SELECT * FROM users")->fetch(SQ::FETCH_ALL); - - //You can use wildcards for escaping - $ssql->q("SELECT * FROM users WHERE `username`=%0 OR `nickname`=%1", [$name, $nick])->fetch(); - - //You can set the object‐wide $debug property to print all queries before being executed - $ssql->debug = true; - - //You can use queries as methods - $ssql->getUser = "SELECT * FROM users WHERE `username`=%0 OR `nickname`=%1"; - $user = $ssql->getUser($name, $nick)->fetch(); - - //For simple requests use $ssql->read($table[, $cond][, $flags]) - //Read function uses FETCH_SMART as default (FETCH_OBJECT for one row, FETCH_ALL for more), so you need to use the FETCH_ALL flag to return an array even when there is only one result - $users = $ssql->read("users", SQ::FETCH_ALL); - $user = $ssql->read("users", ['uid' => $id]); - - //You can use the DEBUG flag to print this query before execution - $user = $ssql->read("users", ['uid' => $id], SQ::DEBUG); - - //You can use more conditions - $user = $ssql->read("users", ['username' => $name, 'password' => $pass]); - - //You can use the COND_OR flag for OR operator instead of AND - $user = $ssql->read("users", ['username' => $name, 'nickname' => $nick], SQ::FETCH_ALL | SQ::COND_OR)[0]; - - //You can use custom conditions - $users = $ssql->read("users", "`sign_up_time` > " . bcsub(time(), 3600)); - - //You can use more of them - $users = $ssql->read("users", ["`sign_up_time` > " . bcsub(time(), 3600), "`nickname` IS NOT NULL"], SQ::FETCH_ALL); - - //For more complicated requests use $ssql->select($table[, $order[, $cols[, $limit[, $flags]]]]), you can use array keys for aliases - $users = $ssql->select("users", "sign_up_time", ['id' => "uid", 'name' => "username", "sign_up_time", "nickname"], NULL, SQ::ORDER_DESC)->fetch(SQ::FETCH_ALL); - - //Or $ssql->selectWhere($table, $cond[, $order[, $cols[, $limit[, $flags]]]]) - $user = $ssql->selectWhere("users", ['uid' => $id], "name", ['id' => "uid", 'name' => "username", "sign_up_time", 'nick' => "nickname"])->fetch(); - - //To quickly display tables use ->dump() - $ssql->select("users")->dump(); - - //Insert with $ssql->insert($table, $values[, $flags]) - $ssql->insert("users", [$id, $name, $pass, time(), NULL]); - - //You can use array keys as col names - $ssql->insert("users", ['username' => $name, 'password' => $pass, 'sign_up_time' => time()]); - - //You can use INSERT_RETURN_ID flag for returning the first auto increment col value (depends on the database type) - $id = $ssql->insert("users", ['username' => $name, 'password' => $pass, 'sign_up_time' => time()], SQ::INSERT_RETURN_ID); - - //Use $ssql->update($table, $cond, $values[, $flags]) to update rows - $ssql->update("users", ['id' => $id], ['nickname' => $nick]); - - //You can delete rows with $ssql->delete($table, $cond[, $flags]) - $ssql->delete("users", ['id' => $id]); - - //You can use $ssql->put($table, $data[, $cond][, $flags]) for inserting, updating and deleting as well - //Insert - $ssql->put("users", [$id, $name, $pass, time(), NULL]); - $ssql->put("users", ['username' => $name, 'password' => $pass, 'sign_up_time' => time()], SQ::INSERT_RETURN_ID); - //Update - $ssql->put("users", ['nickname' => $nick], ['id' => $id]); - //Delete - $ssql->put("users", NULL, ['id' => $id]); - - //Use $ssql->truncate($table[, $flags]) to delete all rows in a table - $ssql->truncate("users"); + include "ssql.php"; + + //Connect to MySQL with new Ssql($host[, $user[, $password[, $database]]]) + $ssql = new Ssql("localhost", "root", "root", "db"); + + //Connect to SQLite with just the first argument + $ssql = new Ssql("db.sqlite3"); + + //Use $ssql->q($q[, $a]) to execute a raw SQL query + $ssql->q("SELECT * FROM `users`"); + + //You can use wildcards for escaping + $ssql->q("SELECT * FROM `users` WHERE `username`=%0 OR `nickname`=%1", [$name, $nick]); + + //You can use queries as methods + $ssql->getUser = "SELECT * FROM `users` WHERE `username` = '%0' OR `nickname` = '%1'"; + $user = $ssql->getUser($name, $nick); + + //Use $ssql->read($table[, $cond][, $flags]) for simple reading + $users = $ssql->read("users"); // Access the username of a specific user with $users[$index]->username + $users = $users->data(); // If you need a raw array, for example for json_encode($users) + $user = $ssql->read("users", ['uid' => $id]); // You can access the username with $user->username if only one result is returned + + //You can use the DEBUG flag to print this query before execution + $user = $ssql->read("users", ['uid' => $id], SQ::DEBUG); + + //Or you can set the object‐wide $debug property to print all queries + $ssql->debug = true; + + //You can use more conditions + $user = $ssql->read("users", ['username' => $name, 'password' => $pass]); + + //You can use the COND_OR flag to use the OR operator instead of AND + $user = $ssql->read("users", ['username' => $name, 'nickname' => $nick], SQ::COND_OR)[0]; + + //You can use custom conditions + $users = $ssql->read("users", "`sign_up_time` > " . bcsub(time(), 3600)); + + //You can use more of them + $users = $ssql->read("users", ["`sign_up_time` > " . bcsub(time(), 3600), "`nickname` IS NOT NULL"]); + + //Use $ssql->get($table[, $options][, $flags]) for more complex data retrieval + $users = $ssql->get("users", ['order' => "sign_up_time", 'cols' => ['id' => "uid", 'name' => "username", "sign_up_time", "nickname"], 'limit' => 10], SQ::ORDER_DESC); + $user = $ssql->get("users", ['cond' => ['uid' => $id], 'order' => "name", 'cols' => ['id' => "uid", 'name' => "username", "sign_up_time", 'nick' => "nickname"]]); + + //You can print the result of a ->read() or ->get() call as an HTML table + print $ssql->read("users"); + + //Insert with $ssql->put($table, $values[, $flags]) + $ssql->put("users", [$id, $name, $pass, time(), NULL]); + + //You can use array keys as col names + $ssql->put("users", ['username' => $name, 'password' => $pass, 'sign_up_time' => time()]); + + //You can use INSERT_RETURN_ID flag for returning the first auto increment col value (depends on the database type) + $id = $ssql->put("users", ['username' => $name, 'password' => $pass, 'sign_up_time' => time()], SQ::INSERT_RETURN_ID); + + //Use $ssql->put($table, $values, $cond[, $flags]) to update rows + $ssql->put("users", ['nickname' => $nick], ['uid' => $id]); + + //You can delete rows by supplying NULL to the $values argument + $ssql->put("users", NULL, ['uid' => $id]); + $ssql->put("users", NULL); //Delete all users ?> ``` @@ -104,10 +91,7 @@ Here is list of all SuperSQL flags: * INSERT_RETURN_ID * COND_AND * COND_OR -* FETCH_OBJECT -* FETCH_ARRAY -* FETCH_ALL -* FETCH_SMART +* CASE_INSENSITIVE * NO_ERROR * DEBUG @@ -115,70 +99,76 @@ Here is list of all SuperSQL flags: ```php changeDb("newDB"); - - - //Join - - - //Use $ssql->selectJoin($table, $join, $on[, $order[, $cols[, $limit[, $flags]]]]) to execute a JOIN command - $result = $ssql->selectJoin("users", "messages", ['from_user' => 'uid'], "time", "*", 5, SQ::ORDER_DESC)->fetch(SQ::FETCH_ALL); - //Use JOIN_LEFT, JOIN_RIGHT and JOIN_FULL flags to other types of JOIN - - //To combine JOIN and WHERE use $ssql->selectJoinWhere($table, $join, $on, $cond[, $order[, $cols[, $limit[, $flags]]]]) - $result = $ssql->selectJoinWhere("users", "messages", ['from_user' => 'uid'], ['from_user' => $uid])->fetch(SQ::FETCH_ALL); - - - - //Table creation and deletion - - - //For basic table creation use $ssql->createTable($table, $params[, $primary[, $flags]]) - $ssql->createTable("myTable", [ - 'number' => [ // Column name - 'type' => "int", // Column type - 'NULL' => false // NULL - ], - 'text' => [ - 'type' => "varchar", - 'length' => 64, // Max length - 'NULL' => true - ] - ], "number"); - - //Use $ssql->deleteTable($table[, $flags]) to delete a table - $ssql->deleteTable("myTable"); - - //To see a list of all tables in your database use $ssql->tableList([$flags]) - print_r($ssql->tableList()); - - - //Advanced conditions - - - //You can use more advanced conditions with $ssql->cond(), this will select users that have the same username and nickname signed up in the last hour - $ssql->read("users", $ssql->cond()->eq("username", "nickname")->gte("sign_up_time", time() - 3600)); - - //Use arrays to differentiate string values from column names and to specify more alternatives, the COND_OR flag is also supported - //This will select users that have username either "ratajs" or "admin" or that have nickname "RatajS" - $ssql->read("users", $ssql->cond()->eq("username", ["ratajs", "admin"])->eq("nickname", ["RatajS"], SQ::COND_OR)); - - //->not() negates the condition, this will select users with usernames other than admin - $ssql->read("users", $ssql->cond()->eq("username", ["admin"])->not()); - - //You can also pass another condition to it, this will select users that don’t have any nickname with username other than "admin" or "root". - $ssql->read("users", $ssql->cond()->eq("nickname", [""])->not($ssql->cond()->eq("username", ["admin", "root"]))); - - //Supported conditions: ->eq(), ->lt(), ->gt(), ->lte(), ->gte(), ->like(), ->between(), ->begins(), ->ends(), ->contains() and ->in() + //To use the same database in more projects you can extend the Ssql class + class mySsql extends Ssql { + protected $host = "localhost"; + protected $user = "root"; + protected $password = "root"; + protected $db = "db"; //Optional + }; + //And then create an instance + $ssql = new mySsql(); + //If $db is not set, you can set it afterwards + $ssql->changeDb("newDB"); + + + //Join + + + $result = $ssql->get("users", ['join' => "messages", 'on' => ['from_user' => 'uid'], 'order' => "time", 'limit' => 5], SQ::ORDER_DESC); + //Use JOIN_LEFT, JOIN_RIGHT and JOIN_FULL flags for other types of JOIN + + $result = $ssql->get("users", ['join' => "messages", 'on' => ['from_user' => 'uid'], 'cond' => ['from_user' => $uid]]); + + + + //Table creation and deletion + + + //For basic table creation use $ssql->createTable($table, $params[, $primary[, $flags]]) + $ssql->createTable("myTable", [ + 'number' => [ + 'type' => "int", + 'NULL' => false + ], + 'text' => [ + 'type' => "varchar", + 'size' => 64, + 'NULL' => true + ] + ], "number"); // Primary key + + //Use $ssql->deleteTable($table[, $flags]) to delete a table + $ssql->deleteTable("myTable"); + + //To see a list of all tables in your database use $ssql->tableList([$flags]) + print_r($ssql->tableList()); + + + //Advanced conditions + + + //You can use more advanced conditions with $ssql->cond(), this will select users that have the same username and nickname signed up in the last hour + $ssql->read("users", $ssql->cond()->eq("username", "nickname")->gte("sign_up_time", time() - 3600)); + + //Use arrays to differentiate string values from column names and to specify more alternatives, the COND_OR flag is also supported + //This will select users that have username either "ratajs" or "admin" or that have nickname "RatajS" + $ssql->read("users", $ssql->cond()->eq("username", ["ratajs", "admin"])->eq("nickname", ["RatajS"], SQ::COND_OR)); + + //->not() negates the condition, this will select users with usernames other than admin + $ssql->read("users", $ssql->cond()->eq("username", ["admin"])->not()); + + //You can also pass another condition to it, this will select users that don’t have any nickname with username other than "admin" or "root". + $ssql->read("users", $ssql->cond()->eq("nickname", [""])->not($ssql->cond()->eq("username", ["admin", "root"]))); + + //Supported conditions: ->eq(), ->lt(), ->gt(), ->lte(), ->gte(), ->like(), ->between(), ->begins(), ->ends(), ->contains() and ->in() + + //Transactions + + $ssql->beginTransaction(); + + //... + + $ssql->endTransaction(); //Or $ssql->rollBackTransaction() ?> ``` diff --git a/ssql.php b/ssql.php index be9b6a8..ab2fd81 100644 --- a/ssql.php +++ b/ssql.php @@ -49,14 +49,9 @@ abstract class SQ { const INSERT_RETURN_ID = 64; const COND_AND = 128; const COND_OR = 256; - const FETCH_OBJECT = 512; - const FETCH_ARRAY = 1024; - const FETCH_ALL = 2048; - const FETCH_SMART = 4096; - const FETCH_HTML = 8192; - const CASE_INSENSITIVE = 16384; - const NO_ERROR = 32768; - const DEBUG = 65536; + const CASE_INSENSITIVE = 512; + const NO_ERROR = 1024; + const DEBUG = 2048; static function open(string $host = "", string $user = "", string $password = "", string $db = "", &$object = "return") { if($object=="return") diff --git a/tests.php b/tests.php index a195651..6b1171d 100644 --- a/tests.php +++ b/tests.php @@ -518,7 +518,7 @@ assert($r[0]->num==16); assert($r[1]->num==48); - $ssql->q("UPDATE `table3` SET `table3_num` = \"%1\" WHERE `table3_id` = \"%0\"", "3", "42"); + $ssql->q("UPDATE `table3` SET `table3_num` = '%1' WHERE `table3_id` = '%0'", "3", "42"); $r = $ssql->read("table3"); assert(count($r)==4); assert($r[0]->table3_id==1); @@ -537,7 +537,7 @@ assert(count($r)==1); assert($r[0]->num==16); - $ssql->inc = "UPDATE `table3` SET `table3_num` = `table3_num` + 1 WHERE `table3_id` = %0"; + $ssql->inc = "UPDATE `table3` SET `table3_num` = `table3_num` + 1 WHERE `table3_id` = '%0'"; $ssql->inc(4); $r = $ssql->read("table3"); assert(count($r)==4);