Używam usługi sieci Web PHP do mojego zaplecza programistycznego dla Androida. Połączenie z serwerem php i MSSQL powiodło się, ale niestety utknąłem w tej części:

<?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));
}

?>

Pokazuje błąd: niepoprawny parametr został przekazany do sqlsrv_fetch_array.

To jest mój formularz logowania:

<!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>

Sprawdzam już parametr i wszystko wygląda dobrze. Dlaczego błąd utrzymuje się?

0
tiqa 20 listopad 2019, 07:07

2 odpowiedzi

Myślę, że potrzebujesz jednego parametru w

$row  = sqlsrv_fetch_array($result);

Więc zmień na

$row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC)

Lub edytuj zapytanie

$mysql_qry="SELECT ID, Password FROM user WHERE ID = '$user_name' AND Password = '$user_pass' ";
0
Zar Ni Ko Ko 20 listopad 2019, 08:05
Sprawdź moją odpowiedź ponownie
 – 
Zar Ni Ko Ko
20 listopad 2019, 08:05

Rozważ następujące:

  • Jednym z możliwych wyjaśnień błędu jest konkatenacja danych wejściowych użytkownika w celu zbudowania instrukcji SQL. W rzeczywistości wstrzykujesz swój kod. Nigdy tego nie rób, zawsze używaj przygotowanych instrukcji i sparametryzowanych zapytań, aby zapobiec iniekcji SQL. Dzięki sterownikowi PHP dla SQL Server funkcja sqlsrv_query() wykonuje zarówno przygotowanie instrukcji, jak i wykonanie instrukcji i może być używana do wykonywania zapytań parametrycznych.
  • Musisz zaszyfrować hasło, ponieważ w tej chwili przekazujesz hasło jako zwykły tekst. Gdy hasło jest zaszyfrowane, możesz bezpiecznie przekazać je do bazy danych.
  • Sprawdź wynik wykonania sqlsrv_query().
  • Uwaga: możesz użyć funkcji sqlsrv_has_rows(), aby sprawdzić, czy zestaw wyników ma jeden lub więcej wierszy.

Następny przykład, oparty na Twoim kodzie, może pomóc w uzyskaniu oczekiwanych wyników:

<?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;
}
?>
0
Zhorov 20 listopad 2019, 12:20