2 namespace TYPO3\CMS\Core\Database;
165 $this->parameters = array();
169 $this->statement = null;
172 $this->statement =
$GLOBALS[
'TYPO3_DB']->prepare_PREPAREDquery($this->query, $this->precompiledQueryParts);
200 foreach ($values as $parameter => $value) {
201 $key = is_int($parameter) ? $parameter + 1 : $parameter;
202 $this->
bindValue($key, $value, self::PARAM_AUTOTYPE);
231 public function bindValue($parameter, $value, $data_type = self::PARAM_AUTOTYPE)
233 switch ($data_type) {
234 case self::PARAM_INT:
235 if (!is_int($value)) {
236 throw new \InvalidArgumentException(
'$value is not an integer as expected: ' . $value, 1281868686);
239 case self::PARAM_BOOL:
240 if (!is_bool($value)) {
241 throw new \InvalidArgumentException(
'$value is not a boolean as expected: ' . $value, 1281868687);
244 case self::PARAM_NULL:
245 if (!is_null($value)) {
246 throw new \InvalidArgumentException(
'$value is not NULL as expected: ' . $value, 1282489834);
250 if (!is_int($parameter) && !preg_match(
'/^:[\\w]+$/', $parameter)) {
251 throw new \InvalidArgumentException(
'Parameter names must start with ":" followed by an arbitrary number of alphanumerical characters.', 1395055513);
253 $key = is_int($parameter) ? $parameter - 1 : $parameter;
254 $this->parameters[$key] = array(
256 'type' => $data_type == self::PARAM_AUTOTYPE ? $this->
guessValueType($value) : $data_type
290 public function execute(array $input_parameters = array())
293 if (!empty($input_parameters)) {
294 $parameterValues = array();
295 foreach ($input_parameters as $key => $value) {
296 $parameterValues[$key] = array(
303 if ($this->statement !== null) {
307 if (!@$this->statement->reset()) {
308 $this->statement = null;
311 if ($this->statement === null) {
322 if ($this->statement === null) {
329 foreach ($parameterValues as $parameterValue) {
330 switch ($parameterValue[
'type']) {
331 case self::PARAM_NULL:
335 case self::PARAM_INT:
337 $value = (int)$parameterValue[
'value'];
339 case self::PARAM_STR:
341 $value = $parameterValue[
'value'];
343 case self::PARAM_BOOL:
345 $value = $parameterValue[
'value'] ? 1 : 0;
348 throw new \InvalidArgumentException(sprintf(
'Unknown type %s used for parameter %s.', $parameterValue[
'type'], $key), 1281859196);
351 $combinedTypes .= $type;
356 if (!empty($combinedTypes)) {
357 $bindParamArguments = array();
358 $bindParamArguments[] = $combinedTypes;
359 $numberOfExtraParamArguments = count($values);
360 for ($i = 0; $i < $numberOfExtraParamArguments; $i++) {
361 $bindParamArguments[] = &$values[$i];
364 call_user_func_array(array($this->statement,
'bind_param'), $bindParamArguments);
367 $success = $this->statement->execute();
370 if (!$success || $this->statement->store_result() ===
false) {
374 if (empty($this->fields)) {
376 if ($this->statement instanceof \mysqli_stmt) {
377 $result = $this->statement->result_metadata();
378 if ($result instanceof \mysqli_result) {
379 $fields = $result->fetch_fields();
383 $fields = $this->statement->fetch_fields();
387 $this->fields[] = $field->name;
393 $this->buffer = null;
396 $this->parameters = array();
409 public function fetch($fetch_style = 0)
411 if ($fetch_style == 0) {
415 if ($this->statement instanceof \mysqli_stmt) {
416 if ($this->buffer === null) {
417 $variables = array();
418 $this->buffer = array();
419 foreach ($this->fields as $field) {
420 $this->buffer[$field] = null;
421 $variables[] = &$this->buffer[$field];
424 call_user_func_array(array($this->statement,
'bind_result'), $variables);
426 $success = $this->statement->fetch();
429 $columns = $this->statement->fetch();
430 $success = is_array($columns);
435 foreach ($columns as $key => $value) {
436 switch ($fetch_style) {
437 case self::FETCH_ASSOC:
440 case self::FETCH_NUM:
444 throw new \InvalidArgumentException(
'$fetch_style must be either TYPO3\\CMS\\Core\\Database\\PreparedStatement::FETCH_ASSOC or TYPO3\\CMS\\Core\\Database\\PreparedStatement::FETCH_NUM', 1281646455);
461 public function seek($rowNumber)
463 $success = $this->statement->data_seek((
int)$rowNumber);
464 if ($this->statement instanceof \mysqli_stmt) {
481 while (($row = $this->
fetch($fetch_style)) !==
false) {
496 $this->statement->close();
507 return $this->statement->num_rows;
518 return $this->statement->errno;
534 $this->statement->errno,
535 $this->statement->error
549 case self::FETCH_ASSOC:
550 case self::FETCH_NUM:
551 $this->defaultFetchMode = $mode;
554 throw new \InvalidArgumentException(
'$mode must be either TYPO3\\CMS\\Core\\Database\\PreparedStatement::FETCH_ASSOC or TYPO3\\CMS\\Core\\Database\\PreparedStatement::FETCH_NUM', 1281875340);
566 if (is_bool($value)) {
567 $type = self::PARAM_BOOL;
568 }
elseif (is_int($value)) {
569 $type = self::PARAM_INT;
570 }
elseif (is_null($value)) {
571 $type = self::PARAM_NULL;
573 $type = self::PARAM_STR;
586 $matches = preg_match(
'/(?<![\\w:]):[\\w]+\\b/',
$query);
600 $queryPartsCount = count($precompiledQueryParts[
'queryParts']);
601 $newParameterValues = array();
602 $hasNamedPlaceholders =
false;
604 if ($queryPartsCount === 0) {
606 if ($hasNamedPlaceholders) {
609 }
elseif (!empty($parameterValues)) {
610 $hasNamedPlaceholders = !is_int(key($parameterValues));
611 if ($hasNamedPlaceholders) {
612 for ($i = 1; $i < $queryPartsCount; $i += 2) {
613 $key = $precompiledQueryParts[
'queryParts'][$i];
614 $precompiledQueryParts[
'queryParts'][$i] =
'?';
615 $newParameterValues[] = $parameterValues[$key];
620 if ($hasNamedPlaceholders) {
621 if ($queryPartsCount === 0) {
623 $quotedParamWrapToken = preg_quote($this->parameterWrapToken,
'/');
625 '/' . $quotedParamWrapToken .
'(.*?)' . $quotedParamWrapToken .
'/',
631 $newParameterValues[] = $parameterValues[$key];
633 '/' . $quotedParamWrapToken . $key . $quotedParamWrapToken .
'/',
641 $parameterValues = $newParameterValues;
655 $unnamedParameterCount = 0;
656 foreach ($parameterValues as $key => $typeValue) {
658 if (!preg_match(
'/^:[\\w]+$/', $key)) {
659 throw new \InvalidArgumentException(
'Parameter names must start with ":" followed by an arbitrary number of alphanumerical characters.', 1282348825);
663 $query = preg_replace(
'/(?<![\\w:])' . preg_quote($key,
'/') .
'\\b/', $this->parameterWrapToken . $key . $this->parameterWrapToken,
$query);
665 $unnamedParameterCount++;
668 $parts = explode(
'?',
$query, $unnamedParameterCount + 1);
669 $query = implode($this->parameterWrapToken .
'?' . $this->parameterWrapToken, $parts);
680 return '__' . \TYPO3\CMS\Core\Utility\GeneralUtility::getRandomHexString(16) .
'__';