Вход Регистрация
Файл: vendor/doctrine/dbal/src/Statement.php
Строк: 315
<?php

namespace DoctrineDBAL;

use 
DoctrineDBALPlatformsAbstractPlatform;
use 
DoctrineDBALTypesType;
use 
DoctrineDeprecationsDeprecation;

use function 
func_num_args;
use function 
is_string;

/**
 * A database abstraction-level statement that implements support for logging, DBAL mapping types, etc.
 */
class Statement
{
    
/**
     * The SQL statement.
     *
     * @var string
     */
    
protected $sql;

    
/**
     * The bound parameters.
     *
     * @var mixed[]
     */
    
protected $params = [];

    
/**
     * The parameter types.
     *
     * @var int[]|string[]
     */
    
protected $types = [];

    
/**
     * The underlying driver statement.
     *
     * @var DriverStatement
     */
    
protected $stmt;

    
/**
     * The underlying database platform.
     *
     * @var AbstractPlatform
     */
    
protected $platform;

    
/**
     * The connection this statement is bound to and executed on.
     *
     * @var Connection
     */
    
protected $conn;

    
/**
     * Creates a new <tt>Statement</tt> for the given SQL and <tt>Connection</tt>.
     *
     * @internal The statement can be only instantiated by {@see Connection}.
     *
     * @param Connection       $conn      The connection for handling statement errors.
     * @param DriverStatement $statement The underlying driver-level statement.
     * @param string           $sql       The SQL of the statement.
     *
     * @throws Exception
     */
    
public function __construct(Connection $connDriverStatement $statementstring $sql)
    {
        
$this->conn     $conn;
        
$this->stmt     $statement;
        
$this->sql      $sql;
        
$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 (
DriverException $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.
     *
     * @deprecated Use {@see bindValue()} instead.
     *
     * @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)
    {
        
Deprecation::trigger(
            
'doctrine/dbal',
            
'https://github.com/doctrine/dbal/pull/5563',
            
'%s is deprecated. Use bindValue() instead.',
            
__METHOD__,
        );

        
$this->params[$param] = $variable;
        
$this->types[$param]  = $type;

        try {
            if (
func_num_args() > 3) {
                return 
$this->stmt->bindParam($param$variable$type$length);
            }

            return 
$this->stmt->bindParam($param$variable$type);
        } catch (
DriverException $e) {
            throw 
$this->conn->convertException($e);
        }
    }

    
/**
     * Executes the statement with the currently bound parameters.
     *
     * @deprecated Statement::execute() is deprecated, use Statement::executeQuery() or executeStatement() instead
     *
     * @param mixed[]|null $params
     *
     * @throws Exception
     */
    
public function execute($params null): Result
    
{
        
Deprecation::triggerIfCalledFromOutside(
            
'doctrine/dbal',
            
'https://github.com/doctrine/dbal/pull/4580',
            
'%s() is deprecated, use Statement::executeQuery() or Statement::executeStatement() instead',
            
__METHOD__,
        );

        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 (
DriverException $ex) {
            throw 
$this->conn->convertExceptionDuringQuery($ex$this->sql$this->params$this->types);
        } finally {
            if (
$logger !== null) {
                
$logger->stopQuery();
            }
        }
    }

    
/**
     * Executes the statement with the currently bound parameters and return result.
     *
     * @param mixed[] $params
     *
     * @throws Exception
     */
    
public function executeQuery(array $params = []): Result
    
{
        if (
func_num_args() > 0) {
            
Deprecation::trigger(
                
'doctrine/dbal',
                
'https://github.com/doctrine/dbal/pull/5556',
                
'Passing $params to Statement::executeQuery() is deprecated. Bind parameters using'
                    
' Statement::bindParam() or Statement::bindValue() instead.',
            );
        }

        if (
$params === []) {
            
$params null// Workaround as long execute() exists and used internally.
        
}

        return 
$this->execute($params);
    }

    
/**
     * Executes the statement with the currently bound parameters and return affected rows.
     *
     * @param mixed[] $params
     *
     * @throws Exception
     */
    
public function executeStatement(array $params = []): int
    
{
        if (
func_num_args() > 0) {
            
Deprecation::trigger(
                
'doctrine/dbal',
                
'https://github.com/doctrine/dbal/pull/5556',
                
'Passing $params to Statement::executeStatement() is deprecated. Bind parameters using'
                    
' Statement::bindParam() or Statement::bindValue() instead.',
            );
        }

        if (
$params === []) {
            
$params null// Workaround as long execute() exists and used internally.
        
}

        return 
$this->execute($params)->rowCount();
    }

    
/**
     * Gets the wrapped driver statement.
     *
     * @return DriverStatement
     */
    
public function getWrappedStatement()
    {
        return 
$this->stmt;
    }
}
Онлайн: 2
Реклама