Statement for the given SQL and Connection. * * @internal The statement can be only instantiated by {@link Connection}. * * @param string $sql The SQL of the statement. * @param Connection $conn The connection on which the statement should be executed. * * @throws Exception */ public function __construct($sql, Connection $conn) { $driverConnection = $conn->getWrappedConnection(); try { $stmt = $driverConnection->prepare($sql); } catch (Exception $ex) { throw $conn->convertExceptionDuringQuery($ex, $sql); } $this->sql = $sql; $this->stmt = $stmt; $this->conn = $conn; $this->platform = $conn->getDatabasePlatform(); } /** * Binds a parameter value to the statement. * * The value can optionally be bound with a DBAL mapping type. * If bound with a DBAL mapping type, the binding type is derived from the mapping * type and the value undergoes the conversion routines of the mapping type before * being bound. * * @param string|int $param The name or position of the parameter. * @param mixed $value The value of the parameter. * @param mixed $type Either a PDO binding type or a DBAL mapping type name or instance. * * @return bool TRUE on success, FALSE on failure. * * @throws Exception */ public function bindValue($param, $value, $type = ParameterType::STRING) { $this->params[$param] = $value; $this->types[$param] = $type; $bindingType = ParameterType::STRING; if ($type !== null) { if (is_string($type)) { $type = Type::getType($type); } $bindingType = $type; if ($type instanceof Type) { $value = $type->convertToDatabaseValue($value, $this->platform); $bindingType = $type->getBindingType(); } } try { return $this->stmt->bindValue($param, $value, $bindingType); } catch (Exception $e) { throw $this->conn->convertException($e); } } /** * Binds a parameter to a value by reference. * * Binding a parameter by reference does not support DBAL mapping types. * * @param string|int $param The name or position of the parameter. * @param mixed $variable The reference to the variable to bind. * @param int $type The binding type. * @param int|null $length Must be specified when using an OUT bind * so that PHP allocates enough memory to hold the returned value. * * @return bool TRUE on success, FALSE on failure. * * @throws Exception */ public function bindParam($param, &$variable, $type = ParameterType::STRING, $length = null) { $this->params[$param] = $variable; $this->types[$param] = $type; try { return $this->stmt->bindParam($param, $variable, $type, $length); } catch (Exception $e) { throw $this->conn->convertException($e); } } /** * Executes the statement with the currently bound parameters. * * @param mixed[]|null $params * * @throws Exception */ public function execute($params = null): Result { if ($params !== null) { $this->params = $params; } $logger = $this->conn->getConfiguration()->getSQLLogger(); if ($logger !== null) { $logger->startQuery($this->sql, $this->params, $this->types); } try { return new Result( $this->stmt->execute($params), $this->conn ); } catch (Exception $ex) { throw $this->conn->convertExceptionDuringQuery($ex, $this->sql, $this->params, $this->types); } finally { if ($logger !== null) { $logger->stopQuery(); } } } /** * Gets the wrapped driver statement. * * @return DriverStatement */ public function getWrappedStatement() { return $this->stmt; } }