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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user