Handle boolean conversion, null checks, and object sanitization in db_object_t and enhance parameter validation in orderBookingRoute

- Added boolean to integer conversion in `db_object_t` during database operations.
- Improved handling of null values, numeric types, and sanitized inputs in `db_object_t`.
- Enhanced safety seal parameter validation in `orderBookingRoute` with support for nullable integers.
- Updated `getTargetItems` to retrieve product names for each item in the order.
This commit is contained in:
Jeppe Bundgaard
2025-11-11 09:50:18 +01:00
parent 72c028c0fd
commit ff7f87475d
2 changed files with 43 additions and 16 deletions
@@ -8,6 +8,7 @@ use objects\departments_o;
use objects\logs_o;
use objects\order_bookings_o;
use objects\order_items_o;
use objects\products_o;
use objects\users_o;
use traits\route_t;
@@ -317,7 +318,13 @@ class orderBookingRoute
$error = 'Invalid safety seal';
if (!$required && !$this->isParametersSet([$parameter])) return null;
self::requireParameters([$parameter]);
self::requireType(self::getParameter($parameter), self::type_int());
if ($required) {
self::requireType(self::getParameter($parameter), self::type_int());
} else {
self::requireTypeIn(self::getParameter($parameter), [self::type_int(), self::type_null()]);
// Check if the value is null
if ($this->getParameter($parameter) === null) return null;
}
self::requireMinLength($parameter, 1);
self::requireMaxLength($parameter, 9);
$value = (int)self::getParameter($parameter);
@@ -466,6 +473,10 @@ class orderBookingRoute
self::requireType(self::getParameter($parameter), self::type_bool());
return (bool)self::getParameter($parameter);
}
/**
* @throws Exception
*/
private function getTargetItems(bool $required = true): array|null {
global $response;
$parameter = 'items';
@@ -481,6 +492,7 @@ class orderBookingRoute
foreach ($items as $key => $item) {
self::requireType($item, self::type_array());
self::requireValidItem((array)$item, $key);
$items[$key]['name'] = (new products_o())->select((int)$item['id'])->name->value();
}
return $items;
}
+30 -15
View File
@@ -1037,6 +1037,11 @@ trait db_object_t
continue;
}
// If the value is boolean, convert it to 1 or 0
if (is_bool($value)) {
$value = $value ? 1 : 0;
}
$value = $db->escape_string($value);
$set[] = "$key = '$value'";
}
@@ -1141,33 +1146,43 @@ trait db_object_t
global /** @var db $db */
$db;
try {
// Update the object in the database
$set = [];
// Sanitize the data
foreach ( $data as $key => $value ) {
// If the value is an object or an array, convert it to a JSON string
// JSON encode objects and arrays
if (is_object($value) || is_array($value)) {
$data[$key] = json_encode($value);
if ($data[$key] === false) {
$value = json_encode($value);
if ($value === false) {
throw new Exception('Failed to encode value for key: ' . $key . ' - ' . json_last_error_msg());
}
}
// If the value is null, set it to null
if ($value === null || (is_string($value) && strtolower($value) === 'null')) {
$data[$key] = null;
$set[] = "$key = NULL";
continue;
}
// Escape the value to prevent SQL injection (this is important for strings)
if (is_string($value)) {
// If the value is a string, escape it
$data[$key] = $db->escape_string($value);
} elseif (is_numeric($value)) {
// If the value is numeric, cast it to a string
$data[$key] = (string)$value;
} elseif (is_bool($value)) {
// If the value is a boolean, convert it to an integer
$data[$key] = (int)$value;
// If the value is numeric, don't escape it
if (is_numeric($value) && strlen((int)$value) == strlen($value)) {
$set[] = "$key = $value";
continue;
}
// If the value is boolean, convert it to 1 or 0
if (is_bool($value)) {
$value = $value ? 1 : 0;
$set[] = "$key = $value";
continue;
}
// If the value is a string, escape it
$value = $db->escape_string($value);
$set[] = "$key = '$value'";
}
$set = implode(', ', $set);
$sql = "INSERT INTO $this->table SET $set";
$db->query($sql);
// Trigger the object changed event
self::objectChanged();
// Prepare the SQL query to insert the data
$columns = implode(', ', array_keys($data));
$values = implode("', '", array_values($data));