public static convertPositionalToNamedPlaceholders ( string $statement ) : string | ||
$statement | string | The SQL statement to convert. |
return | string |
public static function convertPositionalToNamedPlaceholders($statement)
{
$count = 1;
$inLiteral = false;
// a valid query never starts with quotes
$stmtLen = strlen($statement);
$paramMap = array();
for ($i = 0; $i < $stmtLen; $i++) {
if ($statement[$i] == '?' && !$inLiteral) {
// real positional parameter detected
$paramMap[$count] = ":param{$count}";
$len = strlen($paramMap[$count]);
$statement = substr_replace($statement, ":param{$count}", $i, 1);
$i += $len - 1;
// jump ahead
$stmtLen = strlen($statement);
// adjust statement length
++$count;
} elseif ($statement[$i] == "'" || $statement[$i] == '"') {
$inLiteral = !$inLiteral;
// switch state!
}
}
return array($statement, $paramMap);
}
/** * @dataProvider dataConvertPositionalToNamedParameters * @param string $inputSQL * @param string $expectedOutputSQL * @param array $expectedOutputParamsMap */ public function testConvertPositionalToNamedParameters($inputSQL, $expectedOutputSQL, $expectedOutputParamsMap) { list($statement, $params) = \Doctrine\DBAL\Driver\OCI8\OCI8Statement::convertPositionalToNamedPlaceholders($inputSQL); $this->assertEquals($expectedOutputSQL, $statement); $this->assertEquals($expectedOutputParamsMap, $params); }