Странно, в тексте упоминается объект $pdo, а в коде статический вызов, у которого никаких проблем с видимостью в принципе быть не может.
Но есть отвечать буквально, то
1. Если код процедурный, то global для $pdo или статический вызов через DB:: - это нормально. Если код объектный, то передавать $pdo как параметр в конструктор, присваивать локальной переменной класса и потом уже использовать только ее.
2. В данную конструкцию никакая инъекция не пролезет
Писать, кстати, можно короче, чтобы не канителиться.
$data = array(
'email' => $_POST['email'],
'id' => $_POST['id']
);
$res = DB::prepare("UPDATE `users` SET `email` = :email WHERE `id` = :id")->execute($data);