119 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
 | 
						|
function createDB($db_name = 'guestbook.db'): SQLite3 {
 | 
						|
	// Can't create table if it already exists
 | 
						|
	$exists = file_exists($db_name);
 | 
						|
	$db = new SQLite3($db_name);
 | 
						|
 | 
						|
	if(!$exists) {
 | 
						|
		$db->exec('CREATE TABLE user
 | 
						|
					(id_user INTEGER PRIMARY KEY,
 | 
						|
					username TEXT NOT NULL UNIQUE,
 | 
						|
					password TEXT)'
 | 
						|
		);
 | 
						|
		$db->exec('CREATE TABLE message
 | 
						|
					(id_msg INTEGER PRIMARY KEY,
 | 
						|
					id_user INT,
 | 
						|
					content TEXT NOT NULL,
 | 
						|
					date INT,
 | 
						|
					FOREIGN KEY (id_user) REFERENCES user (id_user))'
 | 
						|
		);
 | 
						|
	}
 | 
						|
 | 
						|
	return $db;
 | 
						|
}
 | 
						|
 | 
						|
function getMessages(SQLite3 $db, array $filter = [], int $limit = 25) {
 | 
						|
	// Apply filters
 | 
						|
	$append_string = '';
 | 
						|
	$verb = 'WHERE';
 | 
						|
 | 
						|
	foreach($filter as $key => $value) {
 | 
						|
		$to_append = match($key) {
 | 
						|
			'id_user' => "$verb $key = :$key",
 | 
						|
			// TODO
 | 
						|
		};
 | 
						|
		if($to_append) {
 | 
						|
 			$append_string .= " $to_append";
 | 
						|
			$verb = 'AND';
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// Prepare statement
 | 
						|
	$query = 'SELECT * FROM message' . $append_string;
 | 
						|
	//var_dump($query);
 | 
						|
	$statement = $db->prepare($query);
 | 
						|
 | 
						|
	foreach($filter as $key => $value) {
 | 
						|
		$statement->bindParam($key, $value);
 | 
						|
	}
 | 
						|
 | 
						|
	$result = $statement->execute();
 | 
						|
	$notnull = true;
 | 
						|
	$ret = [];
 | 
						|
	while($notnull) {
 | 
						|
		$arr = $result->fetchArray(SQLITE3_ASSOC);
 | 
						|
		//var_dump($arr);
 | 
						|
		if($arr !== false) {
 | 
						|
			$ret[] = $arr;
 | 
						|
		}
 | 
						|
		else $notnull = false;
 | 
						|
	}
 | 
						|
 | 
						|
	return $ret;
 | 
						|
}
 | 
						|
 | 
						|
function storeMessage(SQLite3 $db, string $content, ?int $user_id = null) : bool {
 | 
						|
	$query = 'INSERT INTO message(id_user, content, date)
 | 
						|
				VALUES (:id_user, :content, :date)';
 | 
						|
 | 
						|
	$date = (new DateTime('now'))->getTimestamp();
 | 
						|
	$statement = $db->prepare($query);
 | 
						|
	$statement->bindParam(':id_user', $user_id);
 | 
						|
	$statement->bindParam(':content', $content);
 | 
						|
	$statement->bindParam(':date', $date);
 | 
						|
	$statement->execute();
 | 
						|
	return ($db->changes() > 0);
 | 
						|
}
 | 
						|
 | 
						|
function storeUser(SQLite3 $db, string $username, string $password) : bool {
 | 
						|
	$query = 'INSERT INTO user(username, password)
 | 
						|
				VALUES (:username, :password)';
 | 
						|
 | 
						|
	$statement = $db->prepare($query);
 | 
						|
	$statement->bindParam(':username', $username);
 | 
						|
	$statement->bindParam(':password', $password);
 | 
						|
	$statement->execute();
 | 
						|
	return ($db->changes() > 0);
 | 
						|
}
 | 
						|
 | 
						|
function deleteMessage(SQLite3 $db, int $message_id) : int {
 | 
						|
	$query = 'DELETE FROM message
 | 
						|
				WHERE id_msg = :id_msg';
 | 
						|
 | 
						|
	$statement = $db->prepare($query);
 | 
						|
	$statement->bindParam(':id_msg', $message_id);
 | 
						|
	$result = $statement->execute();
 | 
						|
	if($result === false) {
 | 
						|
		return -1;
 | 
						|
	}
 | 
						|
	// Number of changed rows
 | 
						|
	return $db->changes();
 | 
						|
}
 | 
						|
 | 
						|
function userFromMessage(SQLite3 $db, int $message_id) {
 | 
						|
	$query = 'SELECT user.id_user, user.username
 | 
						|
				FROM user, message
 | 
						|
				WHERE message.id_user = user.id_user
 | 
						|
				AND message.id_msg = :id_msg';
 | 
						|
 | 
						|
	$statement = $db->prepare($query);
 | 
						|
	$statement->bindParam(':id_msg', $message_id);
 | 
						|
	$result = $statement->execute();
 | 
						|
 | 
						|
 | 
						|
	$array = $result->fetchArray();
 | 
						|
	if(!$array) return null;
 | 
						|
	return ['id' => $array['id_user'], 'username' => $array['username']];
 | 
						|
}
 |