В sqlsrv_fetch_array был передан недопустимый параметр.

Я использую веб-службу PHP для своего бэкэнда разработки Android. Соединение с php и MSSQL Server прошло успешно, но, к сожалению, я застрял на этой части:

<?php
session_start();
include "connect.php";
$user_name = $_POST["username"];
$user_pass = strval($_POST["password"]);
//echo $user_name;
//echo $user_pass;

//$user_name = "admin";
//$user_pass = "admin";
$mysql_qry="SELECT ID, Password FROM user WHERE (ID = '" . $_POST["username"] . "'  AND Password = '" . $_POST["password"] . "')";
$result= sqlsrv_query($conn ,$mysql_qry);
$row  = sqlsrv_fetch_array($result);
if($row) {
$_SESSION["ID"] = $row['ID'];
header ('location:../createUser.php');
}else{
     die( print_r( sqlsrv_errors(), true));
}

?>

Он показывает ошибку: в sqlsrv_fetch_array был передан недопустимый параметр.

Это моя форма входа:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, shrink-to-fit=no"
    />
    <meta name="description" content="" />
    <meta name="author" content="" />

    <title>Login</title>

    <!-- Custom fonts for this template-->
    <link
      href="vendor/fontawesome-free/css/all.min.css"
      rel="stylesheet"
      type="text/css"
    />
    <link
      href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"
      rel="stylesheet"
    />

    <!-- Custom styles for this template-->
    <link href="css/sb-admin-2.min.css" rel="stylesheet" />
  </head>

  <body class="bg-gradient-primary">
    <div class="container">
      <!-- Outer Row -->
      <div class="row justify-content-center">
        <div class="col-xl-10 col-lg-12 col-md-9">
          <div class="card o-hidden border-0 shadow-lg my-5">
            <div class="card-body p-0">
              <!-- Nested Row within Card Body -->
              <div class="row">
                <img class="col-lg-6 d-none d-lg-block " src="img/Login.png">

                <div class="col-lg-6">
                  <div class="p-5">
                    <div class="text-center">
                      <h1 class="h4 text-gray-900 mb-4">
                        Welcome To DEMO 1
                      </h1>
                    </div>
                    <form class="user" method="POST" action="php/login.php">
                      <div class="form-group">
                        <input
                          type="text"
                          name="username"
                          class="form-control form-control-user"
                          id="exampleInputEmail"
                          aria-describedby="emailHelp"
                          placeholder="Enter Username..."
                        />
                      </div>
                      <div class="form-group">
                        <input
                          type="password"
                          name="password"
                          class="form-control form-control-user"
                          id="exampleInputPassword"
                          placeholder="Password"
                        />
                      </div>

                      <button
                        class="btn btn-primary btn-user btn-block"
                        type="submit"
                      >
                        Login
                      </button>
                    </form>
                    <hr />

                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <!-- Bootstrap core JavaScript-->
    <script src="vendor/jquery/jquery.min.js"></script>
    <script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>

    <!-- Core plugin JavaScript-->
    <script src="vendor/jquery-easing/jquery.easing.min.js"></script>

    <!-- Custom scripts for all pages-->
    <script src="js/sb-admin-2.min.js"></script>
  </body>
</html>

Я уже проверяю параметр, и все выглядит просто отлично. Почему возникает ошибка?


person tiqa    schedule 20.11.2019    source источник


Ответы (2)


Я думаю, вам нужен один параметр в

$row  = sqlsrv_fetch_array($result);

Итак, измените на

$row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC)

Или отредактируйте запрос

$mysql_qry="SELECT ID, Password FROM user WHERE ID = '$user_name' AND Password = '$user_pass' ";
person Zar Ni Ko Ko    schedule 20.11.2019
comment
проверьте мой ответ еще раз - person Zar Ni Ko Ko; 20.11.2019

Учтите следующее:

  • Одно из возможных объяснений вашей ошибки заключается в том, что вы объединяете пользовательский ввод для построения оператора SQL. По сути, вы вводите свой код. Никогда не делайте этого, всегда используйте подготовленные операторы и параметризованные запросы, чтобы предотвратить внедрение SQL. В драйвере PHP для SQL Server функция sqlsrv_query() выполняет как подготовку операторов, так и их выполнение, и может использоваться для выполнения параметризованных запросов.
  • Вам нужно хэшировать пароль, потому что в данный момент вы передаете пароль в виде обычного текста. Когда пароль хеширован, вы можете безопасно передать его в базу данных.
  • Проверьте результат выполнения sqlsrv_query().
  • В качестве примечания вы можете использовать функцию sqlsrv_has_rows(), чтобы проверить, есть ли в результирующем наборе одна или несколько строк.

Следующий пример, основанный на вашем коде, может помочь получить ожидаемые результаты:

<?php
session_start();
include "connect.php";
$user_name = $_POST["username"];
$user_pass = strval($_POST["password"]);

$mysql_qry = "
    SELECT ID, Password 
    FROM user 
    WHERE ID = ? AND Password = ?
";
$params = array($user_name, $user_pass);
$result = sqlsrv_query($conn, $mysql_qry, $params);
if ($result === false) (
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;
)

if (sqlsrv_has_rows($result)) {
    // You don't even need to fetch the record, just use:
    // $_SESSION["ID"] = $user_name;
    // header ('location:../createUser.php');
    $row = sqlsrv_fetch_array($result);
    if ($row === false) {
        echo "Error (sqlsrv_fetch_array): ".print_r(sqlsrv_errors(), true);
        exit;
    }
    $_SESSION["ID"] = $row['ID'];
    header ('location:../createUser.php');
} else {
    echo "User not found";
    exit;
}
?>
person Zhorov    schedule 20.11.2019