Mysql
 sql >> база данни >  >> RDS >> Mysql

Просто отстраняване на неизправности при влизане в PHP SQL

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

След това можете да използвате bind_result да назовете променлива, за да получите полетата от вашата заявка, както направих аз.

Забележете как в моята заявка използвам? това е подготвен оператор, който дефинираме с помощта на bind_param това е, за да се избегне SQL инжекция, в текущия ви код SQL инжекцията все още е възможна, тъй като не дезинфекцирате променливите си.

Друга грешка, която смятам, че правите, е съхраняването на пароли като обикновен текст, което е МНОГО МНОГО ГРЕШНО, винаги трябва да шифровате паролата, за да защитите своите потребители и себе си. Ето защо не включвам паролата в моята MySQL заявка, първо използвам само потребителя, ако потребителят бъде намерен, след това използвам паролата, която той е публикувал, за да съответства на извлечената парола от базата данни, в този случай използвам bcrypt за да изпълните задачата, която е много сигурна библиотека за криптиране.

Вижте тук как да използвате bcrypt .

Едва след като видя, че паролата е валидна, поставям данните в сесията и пренасочвам потребителя.

Освен всички грешки, които посочих в долната част на отговора си, ето как ще напиша кода ви.

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

ЗАБЕЛЕЖКА:Горният код е само примерен и не е тестван, ако забележите някаква грешка с него, уведомете ме.

Някои от грешките, които забелязах в кода, който сте публикували:

Липсва ви затварящото ; тук:

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

Също така във вашата заявка имате $Members но нямате $Members променлива, дефинирана някъде в кода ви, може би искахте да кажете Members вместо това, както в:

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

Не трябва ли това

$count = mysql_num_rows($result);

Бъди

$count = mysqli_num_rows($result);‌

И

$result=mysqli_query($sql); 

Бъди

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

Нямате заявка в долната част на 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. MySQL match() against() - подреждане по уместност и колона?

  2. Колоната с автоматично увеличение на MySQL скача с 10 - защо?

  3. Как да разбера кога моят docker mysql контейнер е готов и mysql е готов за приемане на заявки?

  4. WAMP Няма достъп в локална мрежа 403 Забранено

  5. phpMyBackupPro – Уеб базиран инструмент за архивиране на MySQL за Linux