PHP PHP  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

PDO и параметризованные запросы

Тест проверяет путь данных от пользовательского значения до SQL без склейки строк и ложного чувства безопасности. Встречаются именованные параметры, fetch modes, конфигурация PDO и ошибки, которые нельзя молча превращать в пустой результат.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. Отделяйте структуру запроса от данных и проверяйте режим ошибок соединения. На выполнение дано 70 минут.
Вопрос 1 из 25
Какой элемент следует добавить в $options, чтобы ошибки SQL и подключения обрабатывались через исключения?
PHP
$options = [];
$pdo = new PDO($dsn, $user, $password, $options);
Вопрос 2 из 25
Где хранить пароль базы?
PHP
$password = getenv('DB_PASSWORD');
$pdo = new PDO($dsn, getenv('DB_USER'), $password);
Вопрос 3 из 25
Что описывает DSN?
PHP
$dsn = 'pgsql:host=db.internal;port=5432;dbname=shop';
$pdo = new PDO($dsn, $user, $password);
Вопрос 4 из 25
Почему persistent connection не следует включать без измерения и понимания среды?
Вопрос 5 из 25
Какие режимы PDO задаёт этот конструктор?
PHPSQL/PHP
$pdo=new PDO($dsn,$user,$pass,[
 PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
 PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC,
]);
Вопрос 6 из 25
Как безопасно передать email в WHERE?
PHP
$stmt = $pdo->prepare('SELECT id FROM users WHERE email = :email');
$stmt->execute(['email' => $email]);
Вопрос 7 из 25
Можно ли передать имя столбца через :column?
PHP
$allowed = ['name', 'created_at'];
$column = in_array($input, $allowed, true) ? $input : 'created_at';
$stmt = $pdo->query("SELECT id, name FROM users ORDER BY $column");
Вопрос 8 из 25
Чем bindParam отличается от bindValue?
PHP
$stmt = $pdo->prepare('INSERT INTO tags(name) VALUES (:name)');
$name = 'first';
$stmt->bindParam(':name', $name);
$name = 'second';
$stmt->execute();
Вопрос 9 из 25
Какие значения будут последовательно записаны в столбец name при двух вызовах execute()?
PHPSQL/PHP
$st=$pdo->prepare('INSERT INTO tags(name) VALUES (:name)');
$st->bindParam(':name',$name);
$name='A'; $st->execute();
$name='B'; $st->execute();
Вопрос 10 из 25
Почему эмуляцию prepared statements иногда отключают?
Вопрос 11 из 25
Что возвращает FETCH_ASSOC?
PHP
$stmt = $pdo->query('SELECT id, email FROM users');
$row = $stmt->fetch(PDO::FETCH_ASSOC);
Вопрос 12 из 25
Почему fetchAll рискован для миллиона строк?
PHP
$stmt = $pdo->query('SELECT * FROM events');
$all = $stmt->fetchAll(PDO::FETCH_ASSOC);
Вопрос 13 из 25
Что вернёт fetch после конца результата?
Вопрос 14 из 25
Как избежать конфликта id из двух таблиц JOIN?
Вопрос 15 из 25
Что делает FETCH_COLUMN?
Вопрос 16 из 25
Что содержит SQLSTATE?
PHP
try {
    $pdo->exec($sql);
} catch (PDOException $error) {
    $sqlState = $error->errorInfo[0] ?? $error->getCode();
}
Вопрос 17 из 25
Почему нельзя показывать PDOException пользователю?
PHP
try {
    $repository->save($entity);
} catch (PDOException $error) {
    $logger->error('Database failure', ['exception' => $error]);
    throw new ServiceUnavailableException('Сервис временно недоступен');
}
Вопрос 18 из 25
Что сделать с транзакцией после исключения?
Вопрос 19 из 25
Почему catch (PDOException) { return []; } опасен?
Вопрос 20 из 25
Что полезно журналировать при ошибке запроса?
Вопрос 21 из 25
Почему mock PDO не заменяет интеграционный тест запроса?
PHP
$repository = new UserRepository($realTestDatabase);
$repository->save(new User(1, 'a@example.test'));
$loaded = $repository->find(1);
assert($loaded?->email === 'a@example.test');
Вопрос 22 из 25
Какие данные нужны для проверки JOIN?
SQLSQL — тестовые данные
INSERT INTO users(id, email) VALUES
  (1, 'one@example.test'),
  (2, 'two@example.test'),
  (3, 'three@example.test');
INSERT INTO orders(id, user_id) VALUES
  (10, 1), (11, 1), (12, 3);
Вопрос 23 из 25
Когда смотреть EXPLAIN?
Вопрос 24 из 25
Почему SQLite в памяти может не воспроизвести PostgreSQL?
Вопрос 25 из 25
Как проверить отсутствие N+1?

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу