Нет, это не безопасно / хорошо написано. Предполагается, что глобальные регистры включены, а использование глобальных переменных вместо аргументов функций делает код очень трудным для переноса в различные контексты. Оставляя в стороне плохое форматирование, полное отсутствие каких-либо комментариев усложняет обслуживание кода - хороший стиль кодирования является необходимым условием для хорошего программирования - и, следовательно, безопасности.
Существуют также определенные проблемы с самим кодом. Предполагается, что $ username в кавычках, будет работать неэффективно. И поскольку вы сравниваете строку $ username с тем, что возвращает база данных, она явно не экранирована должным образом, что означает, что код открыт для атак с использованием инъекций. Поскольку вы используете PDO, решение состоит в том, чтобы просто использовать подготовленную привязку оператора / переменной - что вы фактически сделали с INSERT!
Итерация по каждому подходящему имени пользователя не имеет никакого смысла и серьезно подрывает поведение. Лучший подход (но не правильный) будет:
/**
* @param username string - a candidate username
* @param DBH - connected PDO object referencing user database
* @return bool - true if username does not exist already
*
* search the current list of users to see if the candidate username is available
*/
function checkName($username, $DBH){
$STH = $DBH->prepare('SELECT username FROM users WHERE username = :username');
$STH->execute(array(':username'=>$username));
$STH->setFetchMode(PDO::FETCH_OBJ);
$row = $STH->fetch();
if ($row === false) {
die('whoops!');
}
return $username!==$row->username;
}
Правильное решение: если предположить, что ваши имена пользователей уникальны (и они действительно, ДЕЙСТВИТЕЛЬНО должны быть), тогда не беспокойтесь о проверке, существует ли имя пользователя до INSERT - создайте уникальный индекс и проверьте наличие ошибок дублирования ключа после INSERT.
Далее вы используете try / catch для начального соединения, но не проверяете ошибки в последующем запросе. Получив исключение, хотя вы записываете и сообщаете об ошибке, вы, кажется, не обращаетесь к потоку управления на этом этапе, чтобы предотвратить выполнение остальной части кода.
Извините - это не очень хороший код, не говоря уже о безопасности.