Искажается хеш из MySQL при проверке пароля — как поправить?
Показываю на пальцах, как отлаживать свой кривой код$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() и смотрим разницу. Основная идея тут в том, чтобы проверять каждое свое предположение. Причем не методом высасывания из пальца, а самым что ни на есть наглядным способом. То есть проверять ровно то, что клал в конкретную таблицу БД, а не то что когда-то давно куда-то клал, но куда и когда не помню.
В базе хеши хранятся в поле VARCHAR - длинной 128, кодировка базы - utf8_general_ci
Я, конечно, извиняюсь, но кто придумал хранить хэш-суммы в поле типа VARCHAR?