mirror of
https://github.com/dg/dibi.git
synced 2025-08-05 05:37:39 +02:00
* new: DibiResult::fetchAssoc() supports "object" mode via @ descriptor
* fixed mysqli_set_charset in PHP < 5.1.5
This commit is contained in:
@@ -108,8 +108,11 @@ class DibiMySqliDriver extends NObject implements DibiDriverInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isset($config['charset'])) {
|
if (isset($config['charset'])) {
|
||||||
// affects the character set used by mysql_real_escape_string() (was added in MySQL 5.0.7 and PHP 5.0.5)
|
$ok = FALSE;
|
||||||
$ok = @mysqli_set_charset($this->connection, $config['charset']);
|
if (version_compare(PHP_VERSION , '5.1.5', '>=')) {
|
||||||
|
// affects the character set used by mysql_real_escape_string() (was added in MySQL 5.0.7 and PHP 5.0.5, fixed in PHP 5.1.5)
|
||||||
|
$ok = @mysqli_set_charset($this->connection, $config['charset']);
|
||||||
|
}
|
||||||
if (!$ok) $ok = @mysqli_query($this->connection, "SET NAMES '$config[charset]'");
|
if (!$ok) $ok = @mysqli_query($this->connection, "SET NAMES '$config[charset]'");
|
||||||
if (!$ok) $this->throwException();
|
if (!$ok) $this->throwException();
|
||||||
}
|
}
|
||||||
|
@@ -293,8 +293,8 @@ class DibiResult extends NObject implements IteratorAggregate, Countable
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches all records from table and returns associative tree
|
* Fetches all records from table and returns associative tree
|
||||||
* Associative descriptor: assoc1,#,assoc2,=,assco3
|
* Associative descriptor: assoc1,#,assoc2,=,assoc3,@
|
||||||
* builds a tree: $data[value1][index][value2]['assoc3'][value3] = {record}
|
* builds a tree: $data[assoc1][index][assoc2]['assoc3']->value = {record}
|
||||||
*
|
*
|
||||||
* @param string associative descriptor
|
* @param string associative descriptor
|
||||||
* @return array
|
* @return array
|
||||||
@@ -311,21 +311,24 @@ class DibiResult extends NObject implements IteratorAggregate, Countable
|
|||||||
|
|
||||||
// check columns
|
// check columns
|
||||||
foreach ($assoc as $as) {
|
foreach ($assoc as $as) {
|
||||||
if ($as !== '#' && $as !== '=' && !array_key_exists($as, $row)) {
|
if ($as !== '#' && $as !== '=' && $as !== '@' && !array_key_exists($as, $row)) {
|
||||||
throw new InvalidArgumentException("Unknown column '$as' in associative descriptor");
|
throw new InvalidArgumentException("Unknown column '$as' in associative descriptor");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count($assoc) === 1) { // speed-up
|
// strip leading = and @
|
||||||
$as = $assoc[0];
|
$assoc[] = '='; // gap
|
||||||
do {
|
|
||||||
$data[ $row[$as] ] = $row;
|
|
||||||
} while ($row = $this->fetch());
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
$last = count($assoc) - 1;
|
$last = count($assoc) - 1;
|
||||||
if ($assoc[$last] === '=') unset($assoc[$last]);
|
while ($assoc[$last] === '=' || $assoc[$last] === '@') {
|
||||||
|
$leaf = $assoc[$last];
|
||||||
|
unset($assoc[$last]);
|
||||||
|
$last--;
|
||||||
|
|
||||||
|
if ($last < 0) {
|
||||||
|
$assoc[] = '#';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// make associative tree
|
// make associative tree
|
||||||
do {
|
do {
|
||||||
@@ -345,12 +348,24 @@ class DibiResult extends NObject implements IteratorAggregate, Countable
|
|||||||
$x = & $x[ $assoc[$i+1] ];
|
$x = & $x[ $assoc[$i+1] ];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} elseif ($as === '@') { // "object" node
|
||||||
|
if ($x === NULL) {
|
||||||
|
$x = (object) $row;
|
||||||
|
$x = & $x->{$assoc[$i+1]};
|
||||||
|
$x = NULL; // prepare child node
|
||||||
|
} else {
|
||||||
|
$x = & $x->{$assoc[$i+1]};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} else { // associative-array node
|
} else { // associative-array node
|
||||||
$x = & $x[ $row[ $as ] ];
|
$x = & $x[ $row[ $as ] ];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($x === NULL) $x = $row; // build leaf
|
if ($x === NULL) { // build leaf
|
||||||
|
if ($leaf === '=') $x = $row; else $x = (object) $row;
|
||||||
|
}
|
||||||
|
|
||||||
} while ($row = $this->fetch());
|
} while ($row = $this->fetch());
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user