<?php declare(strict_types = 1);
namespace MailPoet\Doctrine\WPDB;
if (!defined('ABSPATH')) exit;
use MailPoet\Doctrine\WPDB\Exceptions\NotSupportedException;
use MailPoetVendor\Doctrine\DBAL\Driver\Result;
use MailPoetVendor\Doctrine\DBAL\Driver\Statement as StatementInterface;
use MailPoetVendor\Doctrine\DBAL\ParameterType;
use MailPoetVendor\Doctrine\DBAL\SQL\Parser;
class Statement implements StatementInterface {
private Connection $connection;
private Parser $parser;
private string $sql;
private array $params = [];
public function __construct(
Connection $connection,
string $sql
) {
$this->connection = $connection;
$this->parser = new Parser(false);
$this->sql = $sql;
}
/**
* @param string|int $param
* @param mixed $value
* @param int $type
* @return true
*/
public function bindValue($param, $value, $type = ParameterType::STRING) {
$this->params[$param] = [$param, $value, $type];
return true;
}
/**
* @param string|int $param
* @param mixed $variable
* @param int $type
* @param int|null $length
* @return true
*/
public function bindParam($param, &$variable, $type = ParameterType::STRING, $length = null) {
throw new NotSupportedException(
'Statement::bindParam() is deprecated in Doctrine and not implemented in WPDB driver. Use Statement::bindValue() instead.'
);
}
public function execute($params = null): Result {
if ($params !== null) {
throw new NotSupportedException(
'Statement::execute() with parameters is deprecated in Doctrine and not implemented in WPDB driver. Use Statement::bindValue() instead.'
);
}
// Convert '?' parameters to WPDB format (sprintf-like: '%s', '%d', ...),
// and add support for named parameters that are not supported by mysqli.
$visitor = new ConvertParameters($this->params);
$this->parser->parse($this->sql, $visitor);
$sql = $visitor->getSQL();
$values = $visitor->getValues();
global $wpdb;
$query = count($values) > 0
? $wpdb->prepare($sql, $values) // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
: $sql;
return $this->connection->query($query);
}
}