vendor/doctrine/dbal/src/Statement.php line 249

  1. <?php
  2. namespace Doctrine\DBAL;
  3. use Doctrine\DBAL\Platforms\AbstractPlatform;
  4. use Doctrine\DBAL\Types\Type;
  5. use Doctrine\Deprecations\Deprecation;
  6. use function func_num_args;
  7. use function is_string;
  8. /**
  9.  * A database abstraction-level statement that implements support for logging, DBAL mapping types, etc.
  10.  */
  11. class Statement
  12. {
  13.     /**
  14.      * The SQL statement.
  15.      *
  16.      * @var string
  17.      */
  18.     protected $sql;
  19.     /**
  20.      * The bound parameters.
  21.      *
  22.      * @var mixed[]
  23.      */
  24.     protected $params = [];
  25.     /**
  26.      * The parameter types.
  27.      *
  28.      * @var int[]|string[]
  29.      */
  30.     protected $types = [];
  31.     /**
  32.      * The underlying driver statement.
  33.      *
  34.      * @var Driver\Statement
  35.      */
  36.     protected $stmt;
  37.     /**
  38.      * The underlying database platform.
  39.      *
  40.      * @var AbstractPlatform
  41.      */
  42.     protected $platform;
  43.     /**
  44.      * The connection this statement is bound to and executed on.
  45.      *
  46.      * @var Connection
  47.      */
  48.     protected $conn;
  49.     /**
  50.      * Creates a new <tt>Statement</tt> for the given SQL and <tt>Connection</tt>.
  51.      *
  52.      * @internal The statement can be only instantiated by {@see Connection}.
  53.      *
  54.      * @param Connection       $conn      The connection for handling statement errors.
  55.      * @param Driver\Statement $statement The underlying driver-level statement.
  56.      * @param string           $sql       The SQL of the statement.
  57.      *
  58.      * @throws Exception
  59.      */
  60.     public function __construct(Connection $connDriver\Statement $statementstring $sql)
  61.     {
  62.         $this->conn     $conn;
  63.         $this->stmt     $statement;
  64.         $this->sql      $sql;
  65.         $this->platform $conn->getDatabasePlatform();
  66.     }
  67.     /**
  68.      * Binds a parameter value to the statement.
  69.      *
  70.      * The value can optionally be bound with a DBAL mapping type.
  71.      * If bound with a DBAL mapping type, the binding type is derived from the mapping
  72.      * type and the value undergoes the conversion routines of the mapping type before
  73.      * being bound.
  74.      *
  75.      * @param string|int $param The name or position of the parameter.
  76.      * @param mixed      $value The value of the parameter.
  77.      * @param mixed      $type  Either a PDO binding type or a DBAL mapping type name or instance.
  78.      *
  79.      * @return bool TRUE on success, FALSE on failure.
  80.      *
  81.      * @throws Exception
  82.      */
  83.     public function bindValue($param$value$type ParameterType::STRING)
  84.     {
  85.         $this->params[$param] = $value;
  86.         $this->types[$param]  = $type;
  87.         $bindingType ParameterType::STRING;
  88.         if ($type !== null) {
  89.             if (is_string($type)) {
  90.                 $type Type::getType($type);
  91.             }
  92.             $bindingType $type;
  93.             if ($type instanceof Type) {
  94.                 $value       $type->convertToDatabaseValue($value$this->platform);
  95.                 $bindingType $type->getBindingType();
  96.             }
  97.         }
  98.         try {
  99.             return $this->stmt->bindValue($param$value$bindingType);
  100.         } catch (Driver\Exception $e) {
  101.             throw $this->conn->convertException($e);
  102.         }
  103.     }
  104.     /**
  105.      * Binds a parameter to a value by reference.
  106.      *
  107.      * Binding a parameter by reference does not support DBAL mapping types.
  108.      *
  109.      * @deprecated Use {@see bindValue()} instead.
  110.      *
  111.      * @param string|int $param    The name or position of the parameter.
  112.      * @param mixed      $variable The reference to the variable to bind.
  113.      * @param int        $type     The binding type.
  114.      * @param int|null   $length   Must be specified when using an OUT bind
  115.      *                             so that PHP allocates enough memory to hold the returned value.
  116.      *
  117.      * @return bool TRUE on success, FALSE on failure.
  118.      *
  119.      * @throws Exception
  120.      */
  121.     public function bindParam($param, &$variable$type ParameterType::STRING$length null)
  122.     {
  123.         Deprecation::trigger(
  124.             'doctrine/dbal',
  125.             'https://github.com/doctrine/dbal/pull/5563',
  126.             '%s is deprecated. Use bindValue() instead.',
  127.             __METHOD__,
  128.         );
  129.         $this->params[$param] = $variable;
  130.         $this->types[$param]  = $type;
  131.         try {
  132.             if (func_num_args() > 3) {
  133.                 return $this->stmt->bindParam($param$variable$type$length);
  134.             }
  135.             return $this->stmt->bindParam($param$variable$type);
  136.         } catch (Driver\Exception $e) {
  137.             throw $this->conn->convertException($e);
  138.         }
  139.     }
  140.     /**
  141.      * Executes the statement with the currently bound parameters.
  142.      *
  143.      * @deprecated Statement::execute() is deprecated, use Statement::executeQuery() or executeStatement() instead
  144.      *
  145.      * @param mixed[]|null $params
  146.      *
  147.      * @throws Exception
  148.      */
  149.     public function execute($params null): Result
  150.     {
  151.         Deprecation::triggerIfCalledFromOutside(
  152.             'doctrine/dbal',
  153.             'https://github.com/doctrine/dbal/pull/4580',
  154.             '%s() is deprecated, use Statement::executeQuery() or Statement::executeStatement() instead',
  155.             __METHOD__,
  156.         );
  157.         if ($params !== null) {
  158.             $this->params $params;
  159.         }
  160.         $logger $this->conn->getConfiguration()->getSQLLogger();
  161.         if ($logger !== null) {
  162.             $logger->startQuery($this->sql$this->params$this->types);
  163.         }
  164.         try {
  165.             return new Result(
  166.                 $this->stmt->execute($params),
  167.                 $this->conn,
  168.             );
  169.         } catch (Driver\Exception $ex) {
  170.             throw $this->conn->convertExceptionDuringQuery($ex$this->sql$this->params$this->types);
  171.         } finally {
  172.             if ($logger !== null) {
  173.                 $logger->stopQuery();
  174.             }
  175.         }
  176.     }
  177.     /**
  178.      * Executes the statement with the currently bound parameters and return result.
  179.      *
  180.      * @param mixed[] $params
  181.      *
  182.      * @throws Exception
  183.      */
  184.     public function executeQuery(array $params = []): Result
  185.     {
  186.         if (func_num_args() > 0) {
  187.             Deprecation::trigger(
  188.                 'doctrine/dbal',
  189.                 'https://github.com/doctrine/dbal/pull/5556',
  190.                 'Passing $params to Statement::executeQuery() is deprecated. Bind parameters using'
  191.                     ' Statement::bindParam() or Statement::bindValue() instead.',
  192.             );
  193.         }
  194.         if ($params === []) {
  195.             $params null// Workaround as long execute() exists and used internally.
  196.         }
  197.         return $this->execute($params);
  198.     }
  199.     /**
  200.      * Executes the statement with the currently bound parameters and return affected rows.
  201.      *
  202.      * @param mixed[] $params
  203.      *
  204.      * @throws Exception
  205.      */
  206.     public function executeStatement(array $params = []): int
  207.     {
  208.         if (func_num_args() > 0) {
  209.             Deprecation::trigger(
  210.                 'doctrine/dbal',
  211.                 'https://github.com/doctrine/dbal/pull/5556',
  212.                 'Passing $params to Statement::executeStatement() is deprecated. Bind parameters using'
  213.                     ' Statement::bindParam() or Statement::bindValue() instead.',
  214.             );
  215.         }
  216.         if ($params === []) {
  217.             $params null// Workaround as long execute() exists and used internally.
  218.         }
  219.         return $this->execute($params)->rowCount();
  220.     }
  221.     /**
  222.      * Gets the wrapped driver statement.
  223.      *
  224.      * @return Driver\Statement
  225.      */
  226.     public function getWrappedStatement()
  227.     {
  228.         return $this->stmt;
  229.     }
  230. }