Нужно ли закрывать неиспользованные подготовленные заявления?

function time_elapsed_string($ptime)
{
    $etime = time() - $ptime;

    if ($etime < 1)
    {
        return '0 seconds';
    }

    $a = array( 365 * 24 * 60 * 60  =>  'year',
                 30 * 24 * 60 * 60  =>  'month',
                      24 * 60 * 60  =>  'day',
                           60 * 60  =>  'hour',
                                60  =>  'minute',
                                 1  =>  'second'
                );
    $a_plural = array( 'year'   => 'years',
                       'month'  => 'months',
                       'day'    => 'days',
                       'hour'   => 'hours',
                       'minute' => 'minutes',
                       'second' => 'seconds'
                );

    foreach ($a as $secs => $str)
    {
        $d = $etime / $secs;
        if ($d >= 1)
        {
            $r = round($d);
            return $r . ' ' . ($r > 1 ? $a_plural[$str] : $str) . ' ago';
        }
    }
}
1
задан emfi 12 March 2019 в 11:01
поделиться

1 ответ

Как я сказал в комментариях.

Я думаю, вы путаете соединение с открытой базой данных с подготовленным заявлением. Для подготовленного оператора PDO возвращает объект PDOStatment, для которого необходимо вызвать execute. На самом деле PDO даже не имеет метода execute.

http://php.net/manual/en/class.pdo.php

Кроме того, не существует такой вещи, как открытое или закрытое подготовленное утверждение.

В вашем примере кода:

public function testExpectedSQLResults(string $sql)
{
    $this->getPdo()->prepare($sql);
}

Это, по существу, спорный (если вы не просто делаете это бросить исключение, которое до сих пор в основном спорно смотри ниже), как вы никогда не можете выполнить это запрос, потому что вы не возвращаете объект PDOStatment, который на самом деле имеет метод execute.

В случае соединения с БД, как правило, вам не нужно беспокоиться об этом либо

Для тестирования PDO::prepare действительно возвращает логическое значение false или выдает исключение в зависимости от того, как его настроить. Параметризованные данные не существуют (как правило) в исходном коде. Это зависит от состояния приложения при его запуске. Входные данные, если вы будете. Без этого невозможно реально проверить это.

В основном то, что вы делаете выше, это просто проверка синтаксиса вашего SQL, который обычно будет хорошим или плохим и не будет сильно меняться в зависимости от пользовательского ввода. Даже динамические запросы будут либо работать, либо нет, потому что ваш SQL будет синтаксически правильным или нет. Если это не так, вам придется изменить код, который его генерирует, что-то, что вы обнаружите при разработке.

Модульное тестирование - это другое дело, если вы используете что-то вроде PHPUnit . Где вы можете использовать фиксаторы и макеты для входных данных и т. Д. Это больше для тестирования вашего кода в соответствии с известными вариантами использования, так что если вы сделаете здесь изменение кода, вы внезапно не столкнетесь с ошибкой там. И так далее. Это то, что вы можете посмотреть на это. Вы не упомянули об этом в вопросе, поэтому я предположил, что вы этим не пользуетесь.

В PHPUnit вы можете проверить, генерирует ли этот метод тестирования конкретное исключение, например, подобное этому, используя аннотацию:

/**
 * @expectedException \PDOException
 */

https://phpunit.readthedocs.io/en/8.0/ index.html

Надеюсь, это поможет.

0
ответ дан ArtisticPhoenix 12 March 2019 в 11:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: