163 lines
4.8 KiB
PHP
163 lines
4.8 KiB
PHP
<?php
|
|
|
|
namespace objects;
|
|
|
|
use classes\db;
|
|
use classes\object_property;
|
|
use Exception;
|
|
use traits\db_object_t;
|
|
|
|
class user_key_value_pairs_o extends db
|
|
{
|
|
use db_object_t;
|
|
|
|
public int $user_id;
|
|
public object_property $var;
|
|
public object_property $val;
|
|
|
|
public function structure(): void
|
|
{
|
|
$this->setTable('user_key_value_pairs');
|
|
}
|
|
|
|
public function objectChanged(): void
|
|
{
|
|
// Since the user_key_value_pairs object is not cached, there is no need to invalidate the cache
|
|
}
|
|
|
|
public function getObjectProperties(): void
|
|
{
|
|
$this->var = new object_property($this->table, $this->id, 'var', 'string', true);
|
|
$this->val = new object_property($this->table, $this->id, 'val', 'mixed', true);
|
|
}
|
|
|
|
public function setUser($user_id): user_key_value_pairs_o
|
|
{
|
|
$this->user_id = (int)$user_id;
|
|
return $this;
|
|
}
|
|
|
|
public function setValue($var, $val): user_key_value_pairs_o
|
|
{
|
|
global $db;
|
|
self::requireSelected();
|
|
$userId = (int)$this->user_id;
|
|
// Avoid SQL injection
|
|
$var = $db->escape_string($var);
|
|
$val = $db->escape_string($val);
|
|
// Check if the value exists in the database
|
|
$exists = $this->getValue($var);
|
|
// Create a new record in the database if it doesn't exist
|
|
if ($exists !== null) {
|
|
$sql = "UPDATE $this->table SET val = '$val' WHERE user_id = $userId AND var = '$var'";
|
|
} else {
|
|
$sql = "INSERT INTO $this->table (user_id, var, val) VALUES ($userId, '$var', '$val')";
|
|
}
|
|
$db->query($sql);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @throws Exception
|
|
*/
|
|
public function requireSelected(): void
|
|
{
|
|
if (empty($this->user_id)) {
|
|
throw new Exception('The user id is not set!.');
|
|
}
|
|
}
|
|
|
|
public function getValue($var): mixed
|
|
{
|
|
global $db;
|
|
self::requireSelected();
|
|
$userId = (int)$this->user_id;
|
|
// Avoid SQL injection
|
|
$var = $db->escape_string($var);
|
|
// Get the record from the database
|
|
$sql = "SELECT val FROM $this->table WHERE user_id = $userId AND var = '$var'";
|
|
$result = $db->query($sql);
|
|
if ($result->num_rows > 0) {
|
|
return $db->fetch_assoc($result)['val'];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public function deleteValue($var): user_key_value_pairs_o
|
|
{
|
|
global $db;
|
|
self::requireSelected();
|
|
$userId = (int)$this->user_id;
|
|
// Avoid SQL injection
|
|
$var = $db->escape_string($var);
|
|
// Create a new record in the database
|
|
$sql = "DELETE FROM $this->table WHERE user_id = $userId AND var = '$var'";
|
|
$db->query($sql);
|
|
return $this;
|
|
}
|
|
|
|
public function getAllKeys(): array
|
|
{
|
|
global $db;
|
|
self::requireSelected();
|
|
$userId = (int)$this->user_id;
|
|
// Get all the keys from the database
|
|
$sql = "SELECT var, val FROM $this->table WHERE user_id = $userId";
|
|
$result = $db->query($sql);
|
|
$result = $db->fetch_all($result);
|
|
$keys = [];
|
|
foreach ( $result as $row ) {
|
|
$keys[$row['var']] = $row['val'];
|
|
}
|
|
return $keys;
|
|
}
|
|
|
|
public function getCustomerNumbersWithKey(array $keys): array
|
|
{
|
|
global $db;
|
|
$safeKeys = [];
|
|
foreach ($keys as $key) {
|
|
if (!is_scalar($key)) {
|
|
continue;
|
|
}
|
|
$key = trim((string)$key);
|
|
if ($key === '') {
|
|
continue;
|
|
}
|
|
$safeKeys[] = "'" . $db->escape_string($key) . "'";
|
|
}
|
|
$safeKeys = array_values(array_unique($safeKeys));
|
|
if (empty($safeKeys)) {
|
|
return [];
|
|
}
|
|
// Get all the users, and their customer numbers, with the given keys
|
|
$sql = "SELECT user_id, val FROM $this->table WHERE var IN (" . implode(',', $safeKeys) . ")";
|
|
$result = $db->query($sql);
|
|
$result = $db->fetch_all($result);
|
|
$user_ids = [];
|
|
// Add the user ids to the array
|
|
foreach ( $result as $row ) {
|
|
// Check if the value is empty
|
|
if (empty($row['val'])) {
|
|
continue;
|
|
}
|
|
$user_ids[] = (int)$row['user_id'];
|
|
}
|
|
$user_ids = array_values(array_unique($user_ids));
|
|
if (empty($user_ids)) {
|
|
return [];
|
|
}
|
|
// Get the customer numbers from the users table
|
|
$sql = "SELECT id, customer_number FROM users WHERE id IN (" . implode(',', $user_ids) . ")";
|
|
$result = $db->query($sql);
|
|
$result = $db->fetch_all($result);
|
|
$customer_numbers = [];
|
|
// Return the customer numbers
|
|
foreach ( $result as $row ) {
|
|
$customer_numbers[] = (int)$row['customer_number'];
|
|
}
|
|
return $customer_numbers;
|
|
}
|
|
|
|
}
|