159 $this->parameters = array();
163 $this->statement = NULL;
166 $this->statement =
$GLOBALS[
'TYPO3_DB']->prepare_PREPAREDquery($this->query, $this->precompiledQueryParts);
193 foreach ($values as $parameter => $value) {
194 $key = is_int($parameter) ? $parameter + 1 : $parameter;
195 $this->
bindValue($key, $value, self::PARAM_AUTOTYPE);
224 public function bindValue($parameter, $value, $data_type = self::PARAM_AUTOTYPE) {
225 switch ($data_type) {
226 case self::PARAM_INT:
227 if (!is_int($value)) {
228 throw new \InvalidArgumentException(
'$value is not an integer as expected: ' . $value, 1281868686);
231 case self::PARAM_BOOL:
232 if (!is_bool($value)) {
233 throw new \InvalidArgumentException(
'$value is not a boolean as expected: ' . $value, 1281868687);
236 case self::PARAM_NULL:
237 if (!is_null($value)) {
238 throw new \InvalidArgumentException(
'$value is not NULL as expected: ' . $value, 1282489834);
242 if (!is_int($parameter) && !preg_match(
'/^:[\\w]+$/', $parameter)) {
243 throw new \InvalidArgumentException(
'Parameter names must start with ":" followed by an arbitrary number of alphanumerical characters.', 1395055513);
245 $key = is_int($parameter) ? $parameter - 1 : $parameter;
246 $this->parameters[$key] = array(
248 'type' => $data_type == self::PARAM_AUTOTYPE ? $this->
guessValueType($value) : $data_type
282 public function execute(array $input_parameters = array()) {
284 if (!empty($input_parameters)) {
285 $parameterValues = array();
286 foreach ($input_parameters as $key => $value) {
287 $parameterValues[$key] = array(
294 if ($this->statement !== NULL) {
298 if (!@$this->statement->reset()) {
299 $this->statement = NULL;
302 if ($this->statement === NULL) {
313 if ($this->statement === NULL) {
320 foreach ($parameterValues as $parameterValue) {
321 switch ($parameterValue[
'type']) {
322 case self::PARAM_NULL:
326 case self::PARAM_INT:
328 $value = (int)$parameterValue[
'value'];
330 case self::PARAM_STR:
332 $value = $parameterValue[
'value'];
334 case self::PARAM_BOOL:
336 $value = $parameterValue[
'value'] ? 1 : 0;
339 throw new \InvalidArgumentException(sprintf(
'Unknown type %s used for parameter %s.', $parameterValue[
'type'], $key), 1281859196);
342 $combinedTypes .= $type;
347 if (!empty($combinedTypes)) {
348 $bindParamArguments = array();
349 $bindParamArguments[] = $combinedTypes;
350 $numberOfExtraParamArguments = count($values);
351 for ($i = 0; $i < $numberOfExtraParamArguments; $i++) {
352 $bindParamArguments[] = &$values[$i];
355 call_user_func_array(array($this->statement,
'bind_param'), $bindParamArguments);
358 $success = $this->statement->execute();
361 if (!$success || $this->statement->store_result() === FALSE) {
365 if (count($this->fields) === 0) {
367 if ($this->statement instanceof \mysqli_stmt) {
368 $result = $this->statement->result_metadata();
369 if (
$result instanceof \mysqli_result) {
374 $fields = $this->statement->fetch_fields();
378 $this->fields[] = $field->name;
385 $this->buffer = NULL;
388 $this->parameters = array();
401 public function fetch($fetch_style = 0) {
402 if ($fetch_style == 0) {
406 if ($this->statement instanceof \mysqli_stmt) {
407 if ($this->buffer === NULL) {
408 $variables = array();
409 $this->buffer = array();
410 foreach ($this->fields as $field) {
411 $this->buffer[$field] = NULL;
412 $variables[] = &$this->buffer[$field];
415 call_user_func_array(array($this->statement,
'bind_result'), $variables);
417 $success = $this->statement->fetch();
420 $columns = $this->statement->fetch();
421 $success = is_array($columns);
426 foreach ($columns as $key => $value) {
427 switch ($fetch_style) {
428 case self::FETCH_ASSOC:
431 case self::FETCH_NUM:
435 throw new \InvalidArgumentException(
'$fetch_style must be either TYPO3\\CMS\\Core\\Database\\PreparedStatement::FETCH_ASSOC or TYPO3\\CMS\\Core\\Database\\PreparedStatement::FETCH_NUM', 1281646455);
452 public function seek($rowNumber) {
453 $success = $this->statement->data_seek((
int)$rowNumber);
454 if ($this->statement instanceof \mysqli_stmt) {
470 while (($row = $this->
fetch($fetch_style)) !== FALSE) {
484 $this->statement->close();
494 return $this->statement->num_rows;
504 return $this->statement->errno;
519 $this->statement->errno,
520 $this->statement->error
533 case self::FETCH_ASSOC:
535 case self::FETCH_NUM:
536 $this->defaultFetchMode = $mode;
539 throw new \InvalidArgumentException(
'$mode must be either TYPO3\\CMS\\Core\\Database\\PreparedStatement::FETCH_ASSOC or TYPO3\\CMS\\Core\\Database\\PreparedStatement::FETCH_NUM', 1281875340);
550 if (is_bool($value)) {
551 $type = self::PARAM_BOOL;
552 } elseif (is_int($value)) {
553 $type = self::PARAM_INT;
554 } elseif (is_null($value)) {
555 $type = self::PARAM_NULL;
557 $type = self::PARAM_STR;
569 $matches = preg_match(
'/(?<![\\w:]):[\\w]+\\b/',
$query);
582 $queryPartsCount = count($precompiledQueryParts[
'queryParts']);
583 $newParameterValues = array();
584 $hasNamedPlaceholders = FALSE;
586 if ($queryPartsCount === 0) {
588 if ($hasNamedPlaceholders) {
591 } elseif (count($parameterValues) > 0) {
592 $hasNamedPlaceholders = !is_int(key($parameterValues));
593 if ($hasNamedPlaceholders) {
594 for ($i = 1; $i < $queryPartsCount; $i += 2) {
595 $key = $precompiledQueryParts[
'queryParts'][$i];
596 $precompiledQueryParts[
'queryParts'][$i] =
'?';
597 $newParameterValues[] = $parameterValues[$key];
602 if ($hasNamedPlaceholders) {
603 if ($queryPartsCount === 0) {
605 $quotedParamWrapToken = preg_quote($this->parameterWrapToken,
'/');
607 '/' . $quotedParamWrapToken .
'(.*?)' . $quotedParamWrapToken .
'/',
613 $newParameterValues[] = $parameterValues[$key];
615 '/' . $quotedParamWrapToken . $key . $quotedParamWrapToken .
'/',
623 $parameterValues = $newParameterValues;
636 $unnamedParameterCount = 0;
637 foreach ($parameterValues as $key => $typeValue) {
639 if (!preg_match(
'/^:[\\w]+$/', $key)) {
640 throw new \InvalidArgumentException(
'Parameter names must start with ":" followed by an arbitrary number of alphanumerical characters.', 1282348825);
644 $query = preg_replace(
'/(?<![\\w:])' . preg_quote($key,
'/') .
'\\b/', $this->parameterWrapToken . $key . $this->parameterWrapToken,
$query);
646 $unnamedParameterCount++;
649 $parts = explode(
'?',
$query, $unnamedParameterCount + 1);
650 $query = implode($this->parameterWrapToken .
'?' . $this->parameterWrapToken, $parts);
bindValue($parameter, $value, $data_type=self::PARAM_AUTOTYPE)
hasNamedPlaceholders($query)
static getRandomHexString($count)
generateParameterWrapToken()
__construct($query, $table, array $precompiledQueryParts=array())
execute(array $input_parameters=array())
convertNamedPlaceholdersToQuestionMarks(&$query, array &$parameterValues, array &$precompiledQueryParts)
if($list_of_literals) if(!empty($literals)) if(!empty($literals)) $result
Analyse literals to prepend the N char to them if their contents aren't numeric.
if(!defined('TYPO3_MODE')) $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_userauth.php']['logoff_pre_processing'][]
tokenizeQueryParameterMarkers($query, array $parameterValues)
bindValues(array $values)