mirror of
https://github.com/OpenXE-org/OpenXE.git
synced 2024-11-15 12:37:14 +01:00
67 lines
2.0 KiB
PHP
67 lines
2.0 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace Xentral\Components\Database\Parser;
|
||
|
|
||
|
/**
|
||
|
* @example
|
||
|
* self::rebuild('SELECT * FROM foo WHERE id IN (:ids)', ['ids' => [1, 2, 3]])
|
||
|
* Erzeugt:
|
||
|
* [
|
||
|
* 'statement' => 'SELECT * FROM foo WHERE id IN (:ids_expl_0_, :ids_expl_1_, :ids_expl_2_)',
|
||
|
* 'values' => [
|
||
|
* '_ids_expl_0_' => 1,
|
||
|
* '_ids_expl_1_' => 2,
|
||
|
* '_ids_expl_2_' => 3,
|
||
|
* ]
|
||
|
* ]
|
||
|
*/
|
||
|
final class MysqliArrayValueParser implements ParserInterface
|
||
|
{
|
||
|
/**
|
||
|
* @param string $statement
|
||
|
* @param array $values
|
||
|
*
|
||
|
* @return array
|
||
|
* - Array key 'statement' contains the rebuild statement
|
||
|
* - Array key 'values' contains the rebuild bind parameters
|
||
|
*/
|
||
|
public function rebuild($statement, array $values = [])
|
||
|
{
|
||
|
return $this->replaceArrayValues($statement, $values);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $statement
|
||
|
* @param array $values
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
private function replaceArrayValues($statement, array $values = [])
|
||
|
{
|
||
|
foreach ($values as $paramName => $paramValue) {
|
||
|
if (is_array($paramValue)) {
|
||
|
$counter = 0;
|
||
|
$additionalParams = [];
|
||
|
foreach ($paramValue as $arrayValue) {
|
||
|
$additionalParamName = '_' . $paramName . '_expl_' . $counter . '_';
|
||
|
$additionalParams[] = ':' . $additionalParamName;
|
||
|
$values[$additionalParamName] = $arrayValue;
|
||
|
$counter++;
|
||
|
}
|
||
|
|
||
|
// Replace original named parameter by exploded parameters in statement
|
||
|
$replaceString = implode(', ', $additionalParams);
|
||
|
$statement = str_replace(':' . $paramName, $replaceString, $statement);
|
||
|
|
||
|
// Remove original parameter value
|
||
|
unset($values[$paramName]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return [
|
||
|
'statement' => $statement,
|
||
|
'values' => $values,
|
||
|
];
|
||
|
}
|
||
|
}
|