Никогда не используйте mysqli_real_escape_string
. Просто забудьте, что эта функция даже существует.
Если вы помещаете PHP переменные в SQL, то даже если вы их избегаете, вы не делаете это должным образом. Вы должны использовать привязку параметров и никоим образом не изменять ввод, если это не требуется для вашей бизнес-логики c.
Чтобы предотвратить внедрение SQL (которое, как я полагаю, является вашей целью), вы должны использовать заполнители и привязку параметров. В mysqli это выглядит примерно так:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
$mysqli->set_charset('utf8mb4'); // always set the charset
$username = $_POST["username"];
$password = password_hash($_POST["password"], PASSWORD_DEFAULT);
$stmt = $mysqli->prepare('INSERT INTO users(username, passwordHash) VALUES(?,?)');
$stmt->bind_param('ss', $username, $password);
$stmt->execute();
Я рекомендую перейти с mysqli на PDO. Он предлагает больше и проще в использовании. В PDO тот же пример будет выглядеть так:
$dsn = "mysql:host=localhost;dbname=db;charset=utf8mb4";
$pdo = new PDO($dsn, $user, $pass, [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_EMULATE_PREPARES => false
]);
$username = $_POST["username"];
$password = password_hash($_POST["password"], PASSWORD_DEFAULT);
$stmt = $pdo->prepare('INSERT INTO users(username, passwordHash) VALUES(?,?)');
$stmt->execute([$username, $password]);