Показываю на пальцах, как отлаживать свой кривой код
$passwd = '123123';
$email = "test@test.test";
$hash = password_hash($passwd, PASSWORD_DEFAULT);
$stmt =$conn->prepare("INSERT INTO reg SET email = ?, password=?, name_reg=''");
$stmt->bind_param("ss", $email, $hash,);
$stmt->execute();
$id = $conn->insert_id;
$stmt =$conn->prepare("SELECT * FROM reg WHERE id=?");
$stmt->bind_param("s", $id);
$stmt->execute();
$result = $stmt->get_result();
$userData = $result->fetch_assoc();
$checkPasswd = password_verify($hash, $userData["password"]);
var_dump($hash, $userData["password"],$passwd === $userData["password"],$checkPasswd);
Запустить этот код и убедиться, что
на удивление, База данных
ничего с твоими данными не делает, возвращает в точности то же самое что клал (ну или, как вариант, с удивлением обнаружить что длина поля совсем не 128 букв например).
После этого начать разбираться с
менее фантастическими вариантами. Например, что в БД "после экспериментов" лежит куча записей с оинаковыми емейлами и разными паролями. Или какая-то другая проблема столь же интеллектуального свойства.
Если $hash, $userData["password"] выглядят одинаково, но $passwd === $userData["password"] возвращает false, то выводим $hash, $userData["password"] через urlencode() и смотрим разницу.
Основная идея тут в том, чтобы проверять каждое свое предположение. Причем не методом высасывания из пальца, а самым что ни на есть наглядным способом. То есть проверять ровно то, что клал в конкретную таблицу БД, а не то что когда-то давно куда-то клал, но куда и когда не помню.