123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- <?php
- /**
- * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
- * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
- *
- * Licensed under The MIT License
- * For full copyright and license information, please see the LICENSE.txt
- * Redistributions of files must retain the above copyright notice.
- *
- * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
- * @link https://cakephp.org CakePHP(tm) Project
- * @since 3.0.0
- * @license https://opensource.org/licenses/mit-license.php MIT License
- */
- namespace Cake\Database;
- /**
- * Value binder class manages list of values bound to conditions.
- *
- * @internal
- */
- class ValueBinder
- {
- /**
- * Array containing a list of bound values to the conditions on this
- * object. Each array entry is another array structure containing the actual
- * bound value, its type and the placeholder it is bound to.
- *
- * @var array
- */
- protected $_bindings = [];
- /**
- * A counter of the number of parameters bound in this expression object
- *
- * @var int
- */
- protected $_bindingsCount = 0;
- /**
- * Associates a query placeholder to a value and a type
- *
- * @param string|int $param placeholder to be replaced with quoted version
- * of $value
- * @param mixed $value The value to be bound
- * @param string|int $type the mapped type name, used for casting when sending
- * to database
- * @return void
- */
- public function bind($param, $value, $type = 'string')
- {
- $this->_bindings[$param] = compact('value', 'type') + [
- 'placeholder' => is_int($param) ? $param : substr($param, 1)
- ];
- }
- /**
- * Creates a unique placeholder name if the token provided does not start with ":"
- * otherwise, it will return the same string and internally increment the number
- * of placeholders generated by this object.
- *
- * @param string $token string from which the placeholder will be derived from,
- * if it starts with a colon, then the same string is returned
- * @return string to be used as a placeholder in a query expression
- */
- public function placeholder($token)
- {
- $number = $this->_bindingsCount++;
- if ($token[0] !== ':' && $token !== '?') {
- $token = sprintf(':%s%s', $token, $number);
- }
- return $token;
- }
- /**
- * Creates unique named placeholders for each of the passed values
- * and binds them with the specified type.
- *
- * @param array|\Traversable $values The list of values to be bound
- * @param string $type The type with which all values will be bound
- * @return array with the placeholders to insert in the query
- */
- public function generateManyNamed($values, $type = 'string')
- {
- $placeholders = [];
- foreach ($values as $k => $value) {
- $param = $this->placeholder('c');
- $this->_bindings[$param] = [
- 'value' => $value,
- 'type' => $type,
- 'placeholder' => substr($param, 1),
- ];
- $placeholders[$k] = $param;
- }
- return $placeholders;
- }
- /**
- * Returns all values bound to this expression object at this nesting level.
- * Subexpression bound values will not be returned with this function.
- *
- * @return array
- */
- public function bindings()
- {
- return $this->_bindings;
- }
- /**
- * Clears any bindings that were previously registered
- *
- * @return void
- */
- public function reset()
- {
- $this->_bindings = [];
- $this->_bindingsCount = 0;
- }
- /**
- * Resets the bindings count without clearing previously bound values
- *
- * @return void
- */
- public function resetCount()
- {
- $this->_bindingsCount = 0;
- }
- /**
- * Binds all the stored values in this object to the passed statement.
- *
- * @param \Cake\Database\StatementInterface $statement The statement to add parameters to.
- * @return void
- */
- public function attachTo($statement)
- {
- $bindings = $this->bindings();
- if (empty($bindings)) {
- return;
- }
- foreach ($bindings as $b) {
- $statement->bindValue($b['placeholder'], $b['value'], $b['type']);
- }
- }
- }
|