Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Proste rozwiązywanie problemów z logowaniem PHP SQL

Po pierwsze obsługa błędów podczas tworzenia jest bardzo ważna dlatego sprawdzamy, czy nasz post jest obecny, sprawdzamy, czy połączyliśmy się z bazą danych, sprawdzamy, czy nasze zapytanie przeszło i czy jest OK do uruchomienia, sprawdzamy parametry, które podajemy do zapytanie i w końcu je wykonujemy.

Następnie możesz użyć bind_result nazwać zmienną, aby otrzymać pola z zapytania, tak jak ja to zrobiłem.

Zwróć uwagę, jak na moje zapytanie używam? to jest przygotowana instrukcja, którą definiujemy za pomocą bind_param ma to na celu uniknięcie wstrzyknięcia SQL, w obecnym kodzie, wstrzyknięcie SQL jest nadal możliwe, ponieważ nie oczyszczasz swoich zmiennych.

Innym błędem, który według mnie popełniasz, jest przechowywanie haseł w postaci zwykłego tekstu, co jest BARDZO BARDZO BŁĘDNE. Zawsze powinieneś zaszyfrować hasło, aby chronić swoich użytkowników i siebie. Dlatego nie umieszczam hasła w moim zapytaniu MySQL, najpierw używam tylko użytkownika, jeśli użytkownik zostanie znaleziony, używam hasła, które zamieścił, aby pasowało do hasła pobranego z bazy danych, w tym przypadku używam bcrypt do wykonania zadania, które jest bardzo bezpieczną biblioteką szyfrowania.

Zobacz tutaj jak używać bcrypt .

Dopiero gdy widzę, że hasło jest prawidłowe, wprowadzam dane do sesji i przekierowuję użytkownika.

Poza wszystkimi błędami, które wskazałem na dole mojej odpowiedzi, oto jak napiszę Twój kod.

<?php
session_start();
include_once('bcrypt.php');
// Your database info
$db_host = '';
$db_user = '';
$db_pass = '';
$db_name = '';

if (!isset($_POST['Username']))
{
    echo 'Fill in the username...';
    exit;
}

if (!isset($_POST['Password']))
{
    echo 'Fill in your password...';
    exit;
}

$con = new mysqli($db_host, $db_user, $db_pass, $db_name);
if ($con->connect_error)
{
    die('Connect Error (' . $con->connect_errno . ') ' . $con->connect_error);
}

$sql = "SELECT Username, Password FROM `Members` WHERE Username = ?";
if (!$result = $con->prepare($sql))
{
    die('Query failed: (' . $con->errno . ') ' . $con->error);
}

if (!$result->bind_param('s', $_POST['Username']))
{
    die('Binding parameters failed: (' . $result->errno . ') ' . $result->error);
}

if (!$result->execute())
{
    die('Execute failed: (' . $result->errno . ') ' . $result->error);
}

$result->store_result();
if ($result->num_rows == 0)
{
    die('No username found...');
}

$result->bind_result($db_username, $db_password);
$result->fetch();
$result->close();
$con->close();

$bcrypt = new Bcrypt(15);
if ($bcrypt->verify($password, $db_password))
{
    $_SESSION['Username'] = $db_username;
    header('location:login_success.php');
    exit;
}
else
{
    echo 'Wrong Username or Password';
}

UWAGA:powyższy kod jest tylko przykładem i nie był testowany, jeśli zauważysz w nim jakiś błąd, daj mi znać.

Niektóre z błędów, które zauważyłem w opublikowanym przez Ciebie kodzie:

Brakuje zamykającego ; tutaj:

$sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"

Również w swoim zapytaniu masz $Members ale nie masz $Members zmienna zdefiniowana w dowolnym miejscu w kodzie, może chciałeś powiedzieć Members? zamiast tego, jak w:

$sql = "SELECT * FROM `Members` WHERE Username = '$Username' and Password = '$Password'";

Czy nie powinno to

$count = mysql_num_rows($result);

Bądź

$count = mysqli_num_rows($result);‌

I

$result=mysqli_query($sql); 

Bądź

$result=mysqli_query($sql_connection, $sql);

Nie masz zapytania w poniższej części mysqli_query

if (!mysqli_query($sql_connection)) 



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zmień lub ustaw wartość długiego czasu zapytań MySQL dla zapytań log-slow-query

  2. java.sql.SQLException:Odmowa dostępu dla użytkownika 'root'@'localhost' (przy użyciu hasła:TAK)

  3. Przechowywanie danych w MySQL w formacie JSON

  4. Czy w MySQL powinienem używać danych typu datetime czy timestamp?

  5. Mytop – przydatne narzędzie do monitorowania wydajności MySQL/MariaDB w systemie Linux