You are here

public function StatementTest::testRepeatedInsertStatementReuse in Drupal 9

Tests that a prepared statement object can be reused for multiple inserts.

File

core/tests/Drupal/KernelTests/Core/Database/StatementTest.php, line 18

Class

StatementTest
Tests the Statement classes.

Namespace

Drupal\KernelTests\Core\Database

Code

public function testRepeatedInsertStatementReuse() {
  $num_records_before = $this->connection
    ->select('test')
    ->countQuery()
    ->execute()
    ->fetchField();
  $sql = "INSERT INTO {test} ([name], [age]) VALUES (:name, :age)";
  $args = [
    ':name' => 'Larry',
    ':age' => '30',
  ];
  $options = [
    'return' => Database::RETURN_STATEMENT,
    'allow_square_brackets' => FALSE,
  ];
  $stmt = $this->connection
    ->prepareStatement($sql, $options);
  $this
    ->assertInstanceOf(StatementInterface::class, $stmt);
  $this
    ->assertTrue($stmt
    ->execute($args, $options));

  // We should be able to specify values in any order if named.
  $args = [
    ':age' => '31',
    ':name' => 'Curly',
  ];
  $this
    ->assertTrue($stmt
    ->execute($args, $options));
  $num_records_after = $this->connection
    ->select('test')
    ->countQuery()
    ->execute()
    ->fetchField();
  $this
    ->assertEquals($num_records_before + 2, $num_records_after);
  $this
    ->assertSame('30', $this->connection
    ->query('SELECT [age] FROM {test} WHERE [name] = :name', [
    ':name' => 'Larry',
  ])
    ->fetchField());
  $this
    ->assertSame('31', $this->connection
    ->query('SELECT [age] FROM {test} WHERE [name] = :name', [
    ':name' => 'Curly',
  ])
    ->fetchField());
}