summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--it_dbi.class42
1 files changed, 31 insertions, 11 deletions
diff --git a/it_dbi.class b/it_dbi.class
index 0dfde04..217b572 100644
--- a/it_dbi.class
+++ b/it_dbi.class
@@ -258,18 +258,18 @@ function _expressions($tags, $force = false)
if (!$this->_fields[$f] && $this->_fields['dyncols'])
{
if (substr($field, 0, 1) === "-")
- $newdyns[] = "'\$.$f', " . $value;
+ $newdyns[$f] = $value;
else if ($force || isset($value) && isset($dyndata[$f]) ? strval($value) !== strval($dyndata[$f]) : $value !== $dyndata[$f] || !array_key_exists($f, $dyndata))
{
if (is_null($value))
- $deldyns[] = "'\$.$f'";
- if (is_int($value))
- $newdyns[] = "'\$.$f', $value";
+ $deldyns[] = $f;
+ else if (is_int($value))
+ $newdyns[$f] = $value;
else
- $newdyns[] = "'\$.$f', " . $this->escape_string($value);
+ $newdyns[$f] = $this->escape_string($value);
}
- $alldyns[] = $this->escape_string($f) . ", " . (substr($field, 0, 1) === "-" || is_int($value) ? $value : $this->escape_string($value));
+ $alldyns[$f] = (substr($field, 0, 1) === "-" || is_int($value) ? $value : $this->escape_string($value));
$dyndata[$f] = $value;
}
else if (substr($field, 0, 1) === '-') # Unquoted value (always added)
@@ -281,14 +281,14 @@ function _expressions($tags, $force = false)
if ($alldyns)
{
if ($force == "insert") # INSERT/REPLACE
- $result['dyncols'] = "JSON_OBJECT(" . join(", ", (array)$alldyns) . ")";
+ $result['dyncols'] = $this->_json_object($alldyns);
else if ($newdyns || $deldyns)
{
- $source = $this->_dyndata ? 'dyncols' : '"{}"';
+ $source = $this->_dyndata ? 'dyncols' : $this->escape_string('{}');
if ($newdyns)
- $source = "JSON_SET($source, " . join(', ', $newdyns) . ')';
+ $source = $this->_json_set($source, $newdyns);
if ($deldyns)
- $source = "JSON_REMOVE($source, " . join(', ', $deldyns) . ')';
+ $source = $this->_json_remove($source, $deldyns);
$result['dyncols'] = $source;
}
}
@@ -412,7 +412,7 @@ function _where($params)
}
if ($dyncols_enabled && $this->_fields['dyncols'] && !$this->_fields[$field] && strpos($field, '(') === false)
- $field = "JSON_EXTRACT(dyncols, " . $this->escape_string('$.' . $field) . ")";
+ $field = $this->_json_extract('dyncols', $field);
switch ($op)
{
@@ -1119,6 +1119,26 @@ function _query($query, $p)
return $result;
}
+function _json_extract($col, $field)
+{
+ return "JSON_EXTRACT($col, " . $this->escape_string('$.' . $field) . ")";
+}
+
+function _json_object($tags)
+{
+ return "JSON_OBJECT(" . implode(', ', it::map(fn ($f, $v) => "'$f', $v", (array)$tags)) . ")";
+}
+
+function _json_set($source, $tags)
+{
+ return "JSON_SET($source, " . implode(", ", it::map(fn ($f, $v) => "'\$.$f', $v", (array)$tags)) . ')';
+}
+
+function _json_remove($source, $fields)
+{
+ return "JSON_REMOVE($source, " . implode(", ", it::map(fn ($dummy, $f) => "'\$.$f'", (array)$fields)) . ')';
+}
+
function _fetch_assoc($res)
{
return mysqli_fetch_assoc($res);