+ /**
+ * Add user meta data
+ * @param string $key
+ * @param string $value
+ * @return bool
+ */
+ function add_meta(string $key, string $value)
+ {
+ if (!$key || !$value)
+ return false;
+
+ $meta = [
+ "id" => $this->id,
+ "key" => $key,
+ "value" => $value
+ ];
+
+ $conn = sqlnew();
+
+ /* check if it exists first, update it if it does */
+ $query = "SELECT * FROM " . SQL_PREFIX . "user_meta WHERE user_id = :id AND meta_key = :key";
+ $stmt = $conn->prepare($query);
+ $stmt->execute(["id" => $this->id, "key" => $key]);
+ if ($stmt->rowCount()) // it exists, update instead of insert
+ {
+ $query = "UPDATE " . SQL_PREFIX . "user_meta SET meta_value = :value WHERE user_id = :id AND meta_key = :key";
+ $stmt = $conn->prepare($query);
+ $stmt->execute($meta);
+ if ($stmt->rowCount())
+ return true;
+ return false;
+ }
+
+ else
+ {
+ $query = "INSERT INTO " . SQL_PREFIX . "user_meta (user_id, meta_key, meta_value) VALUES (:id, :key, :value)";
+ $stmt = $conn->prepare($query);
+ $stmt->execute($meta);
+ if ($stmt->rowCount())
+ return true;
+ return false;
+ }
+ }
+
+ /**
+ * Delete user meta data by key
+ * @param string $key
+ * @return bool
+ */
+ function delete_meta(string $key)
+ {
+ if (!$key )
+ return false;
+
+ $meta = [
+ "id" => $this->id,
+ "key" => $key,
+ ];
+
+ $conn = sqlnew();
+ $query = "DELETE FROM " . SQL_PREFIX . "user_meta WHERE user_id = :id AND meta_key = :key";
+ $stmt = $conn->prepare($query);
+ $stmt->execute($meta);
+ if ($stmt->rowCount())
+ return true;
+ return false;
+
+ }
+}
+
+
+/**
+ * This class looks up and returns any user meta.
+ * This is used by SQLA_User, so you won't need to
+ * call it separately from SQLA_User.
+ */
+class SQLA_User_Meta
+{
+ public $list = [];
+ function __construct($id)
+ {
+ $conn = sqlnew();
+ if ($id)
+ {
+ $prep = $conn->prepare("SELECT * FROM " . SQL_PREFIX . "user_meta WHERE user_id = :id");
+ $prep->execute(["id" => $id]);
+ }
+ foreach ($prep->fetchAll() as $row)
+ {
+ $this->list[$row['meta_key']] = $row['meta_value'];
+ }
+ }