query('CREATE TABLE IF NOT EXISTS "visits" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "user_id" INTEGER, "url" VARCHAR, "time" DATETIME )'); // Insert some sample data. // // It's advisable to wrap related queries in a transaction (BEGIN and COMMIT), // even if you don't care about atomicity. // If you don't do this, SQLite automatically wraps every single query // in a transaction, which slows down everything immensely. If you're new to SQLite, // you may be surprised why the INSERTs are so slow. $db->exec('BEGIN'); $db->query('INSERT INTO "visits" ("user_id", "url", "time") VALUES (42, "/test", "2017-01-14 10:11:23")'); $db->query('INSERT INTO "visits" ("user_id", "url", "time") VALUES (42, "/test2", "2017-01-14 10:11:44")'); $db->exec('COMMIT'); // Insert potentially unsafe data with a prepared statement. // You can do this with named parameters: $statement = $db->prepare('INSERT INTO "visits" ("user_id", "url", "time") VALUES (:uid, :url, :time)'); $statement->bindValue(':uid', 1337); $statement->bindValue(':url', '/test'); $statement->bindValue(':time', date('Y-m-d H:i:s')); $statement->execute(); // you can reuse the statement with different values // Fetch today's visits of user #42. // We'll use a prepared statement again, but with numbered parameters this time: $statement = $db->prepare('SELECT * FROM "visits" WHERE "user_id" = ? AND "time" >= ?'); $statement->bindValue(1, 42); $statement->bindValue(2, '2017-01-14'); $result = $statement->execute(); echo("Get the 1st row as an associative array:\n"); print_r($result->fetchArray(SQLITE3_ASSOC)); echo("\n"); echo("Get the next row as a numeric array:\n"); print_r($result->fetchArray(SQLITE3_NUM)); echo("\n"); // If there are no more rows, fetchArray() returns FALSE. // free the memory, this in NOT done automatically, while your script is running $result->finalize(); // A useful shorthand for fetching a single row as an associative array. // The second parameter means we want all the selected columns. // // Watch out, this shorthand doesn't support parameter binding, but you can // escape the strings instead. // Always put the values in SINGLE quotes! Double quotes are used for table // and column names (similar to backticks in MySQL). $query = 'SELECT * FROM "visits" WHERE "url" = \'' . SQLite3::escapeString('/test') . '\' ORDER BY "id" DESC LIMIT 1'; $lastVisit = $db->querySingle($query, true); echo("Last visit of '/test':\n"); print_r($lastVisit); echo("\n"); // Another useful shorthand for retrieving just one value. $userCount = $db->querySingle('SELECT COUNT(DISTINCT "user_id") FROM "visits"'); echo("User count: $userCount\n"); echo("\n"); // Finally, close the database. // This is done automatically when the script finishes, though. $db->close();