В чем смысл этих двух строк кода PHP? - PullRequest
2 голосов
/ 28 мая 2019

В настоящее время я программирую скрипт для входа в систему пользователя, если пользователь вводит правильную информацию в поле «Пароль» и «Логин» на странице входа. Сценарий работает просто отлично, но я на самом деле не знаю, что эти две строки кода означают и делают для общего пользовательского опыта.

Я скоро собираюсь на экзамен, где я должен объяснить смысл кода, и было бы просто удивительно, если бы вы, ребята, помогли мне, объяснив, что две строки кода делают ниже. Это полный сценарий:

<?php  

require('db_connect.php');

if (isset($_POST['user_id']) and isset($_POST['user_pass'])) {

    $username = $_POST['user_id'];
    $password = $_POST['user_pass'];

    $query = "SELECT * FROM dataforlogin WHERE username='$username' and password='$password'";

    $result = mysqli_query($connection, $query) or die(mysqli_error($connection));
    $count = mysqli_num_rows($result);

    if ($count == 1) {

        header("location: ../staudal/dashboard/index.php");

    } else {

        echo "Fail";

  }
}

?>

Две строки кода, которые мне трудно понять, это:

$result = mysqli_query($connection, $query) or die(mysqli_error($connection));
$count = mysqli_num_rows($result);

Что они делают и почему?

Ответы [ 4 ]

21 голосов
/ 28 мая 2019

Это хороший вопрос, потому что эти линии в большинстве своем ошибочны или бесполезны в соответствии с современными стандартами безопасности и дизайна приложений.Мне никогда не приходило в голову, что в двух строках кода может быть столько ошибок.

, вот как это должно быть

$stmt = $mysqli->prepare("SELECT * FROM dataforlogin WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$result= $stmt->get_result()
$user = $result->fetch_assoc();

if ($user && password_verify($password, $user['password']))
{
    // write some info into the session
    header("location: ../staudal/dashboard/index.php");
    exit;
} else {
    echo "invalid";
}
  • вПервая линия, которую мы готовимSQL-запрос с вопросительными знаками, помещенными туда, куда должны идти переменные (так он называется заполнителем).
  • во второй строке мы привязываем фактическую переменную к заполнителю, поэтому она будет отправлена ​​на сервер MySQL, отделенный от запроса, и они не смогут вмешиваться.
  • затемзапрос фактически выполняется.
  • затем мы получаем переменную mysqli_result, знакомую всем пользователям старого или нового запроса mysql - фактического источника данных, возвращаемых запросом.
  • затем мы пытаемся получить выбранную строку.
  • затем мы проверяем две вещи одновременно:
    • , вернул ли наш запрос какую-либо строку
    • иесли да, то совпадает ли пароль, отправленный из формы, с паролем, сохраненным в базе данных с помощью функции password_verify ()
  • , остальное такое же, как в вашем коде, за исключением двух вещей
    • перед перенаправлением пользователя вы должны записать некоторую информацию о них в сеанс, чтобы распознать их на других страницах
    • рекомендуется добавить exit после отправки Locationheader.

Надеюсь, этих объяснений будет достаточно для ваших учителей

Серьезно, этот вопрос должен повысить осведомленность о состоянии образования в PHP.Большинство источников, как онлайн, так и офлайн, учат так, как если бы они все еще работали на PHP3, с незначительными изменениями в отношении устаревших функций.Но подход, который во многих отношениях неверен, остается прежним.

0 голосов
/ 28 мая 2019

Я младший разработчик, но я надеюсь, что этот ответ поможет в соответствии с вашим кодом:

  1. $ result = mysqli_query ($ connection, $ query) или die (mysqli_error ($ connection));

    • $ результат - переменная php

    • mysqli_query ($ connection, $ query) означает, что mysqli_query будет использовать объявленную базу данных подключения к базе данных в вашем db_connect.php для запуска запроса [$ query = "SELECT * FROM dataforlogin WHERE username = '$ username' и пароль = '$ пароль' ";]

    • или умри (mysqli_error ($ connection)); означает, что если mysqli_query не найдет указанную базу данных или таблицу, то в этом случае (dataforlogin) будет отображаться ошибка соединения, указанная в вашем db_connect.php

  2. $ count = mysqli_num_rows ($ result);

    • $ count - переменная php

    • mysqli_num_rows ($ результат); означает, что $ count равно числу строк, найденных в таблице (dataforlogin) для $ result при запуске mysqli_query ($ connection, $ query).

Примечание: пожалуйста, избегайте использования строки --- или die (mysqli_error ($ connection), поскольку это может помешать загрузке страницы, в этом нет необходимости.

0 голосов
/ 28 мая 2019

Сначала я хотел бы сказать, пожалуйста, используйте подготовленное заявление.

$result = mysqli_query($connection, $query) or die(mysqli_error($connection));

Функция mysqli_query() выполняет запрос к базе данных, а переменная $connection открывает новое соединение с сервером MySQL, которое вы уже создали в db_connect.php , и вы проверяете, установлено ли соединение или не. Если нет, то будет запущена функция die(). Он используется для печати сообщения и выхода из текущего php-скрипта.

$count = mysqli_num_rows($result);

mysqli_num_rows() функция возвращает количество строк в наборе результатов, и вы сохраняете это число в переменной $count.

Надеюсь, это поможет вам

0 голосов
/ 28 мая 2019

$result = mysqli_query($connection, $query) or die(mysqli_error($connection)); Это выполняет запрос MySQL, такой как SELECT * FROM <i>table</i> WHERE id = ?, а затем сохраняет результаты. В противном случае возвращается сообщение об ошибке.

$count = mysqli_num_rows($result); Это просто возвращает количество строк, возвращаемых вашим запросом.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...