@6ondawave9

Почему неправильно работает сравнение?

Есть код который ищет значение login в столбце базы данных. Если такое значение есть - то выводит соответствующее и аналогично если нет. Но почему-то в случае если значение уже есть, то сообщение появляется, а если нет - тишина. В чем проблема? Есть предположение что с циклами foreach где-то напортачил, потому что в принципе не понял почему в foreach ($result as $i) $i тоже массивы, но в таком случае не понимаю почему часть если значение уже есть в бд работает верно.
<?php

$input = json_decode(file_get_contents("php://input"), true);

$link = mysqli_connect(*информация БД*);

$login = $input['login'];
$password = $input['password'];

if ($link == false){
    echo("Ошибка: Невозможно подключиться к MySQL: " . mysqli_connect_error());
} else {
    echo ("Подключение к БД прошло успешно!");
    mysqli_set_charset($con, "utf8");

    $res = mysqli_query($link, "SELECT login FROM sn_users WHERE login='$login'");
    if (!$res) {
        echo "Не удалось выполнить запрос";
    } 
    $result = $res->fetch_all();
    foreach ($result as $i) {
        foreach ($i as $j) {

            $j = (string)$j;
            
            if (strcmp($j, $login) == 0) {
                echo "Лоигн занят";
                return;
            } else {
                echo "Лоигн свободен";
            }
        }
    }
}
  • Вопрос задан
  • 202 просмотра
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Вопрос
Сколько строк вернёт база данных, если в запрос передать несуществующий логин?

Дополнительный вопрос
Какой смысл вообще городить авторизацию, если любой придурок авторизуется без всякого пароля, через SQL инъекцию?

Подробнее про вопрос секьюрности этого куска:
Если переменная подставляется напрямую в запрос, то это значит что в нее можно дописать SQL, который будет делать совсем не то, что ожидалось.
Например, если вместо имени пользователя написать что-то вроде имя' AND LEFT(password, 1) = 'a
то тогда код напишет "Лоигн занят" если первая буква пароля - "а". Пара десятков таких запросов - и первую букву мы уже угадали. Тем же способом же достаём остальные и вот мы получили пароль любого клиента.

Чтобы этого не было, переменные никогда не пишут в запрос напрямую. а передают отдельно.
как это делать - я уже писал подробно, правда в ответе на другой вопрос

Здесь надо делать так

$input = json_decode(file_get_contents("php://input"), true);

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect(*информация БД*);
$link->set_charset("utf8mb4");

$stmt = $link->prepare( "SELECT login FROM sn_users WHERE login=?");
$stmt->bind_param("s", $login);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
if ($row) {
    echo "Лоигн занят";
} else {
    echo "Лоигн свободен";
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы