Problem łączenia z bazą

0

Witam, mam taki kod:

<?php
    session_start();

    $login = $_SESSION['login'];
    $haslo = $_SESSION['haslo'];

    $connect = mysqli_connect('localhost', 'root', '', 'gra');
    $zapytanie = "SELECT * FROM gra WHERE login = ".$login." AND WHERE haslo = ".$haslo."";
	$wynik = mysqli_query($connect, $zapytanie);
	if($wynik == false)
	{
        echo $login;
        echo $haslo;
    }
    else
	{
		$user = mysqli_fetch_row($wynik);
		if($user>0)
		{
			$_SESSION['log'] = true;
			header("location: game.php");
		}else
		{
			$_SESSION['log'] = false;
			header("location: zaloguj.php");
		}
	}
?>

I pokazuje mój login i hasło (czyli false jest) i jak zrobić, aby było true? W bazie w kolumnach login i haslo są dobre wartości.

0

W bazie w kolumnach login i haslo są dobre wartości.

Zapytanie jest nieprawidłowe i w dodatku prosisz się tutaj o SQL injection. Użyj parametrów.

1

No to pierwsza sprawa - zobacz, co dostajesz jak wynik połączenia z bazą. Przykład masz tutaj - https://www.php.net/manual/en/function.mysqli-connect.php

Jeśli połączenie z bazą się nawiązuje poprawnie, to wyświetl sobie treść zapytania (czyli zmiennej $zapytanie) i zobacz, jak się ono układa.

Po trzecie - jeśli zapytanie będzie poprawnie sformułowane i nie pojawią się w nim żadne dziwne elementy, spróbuj je ręcznie wywołać (chociażby w phpMyAdmin albo w konsoli) i zobacz, czy wtedy wszystko będzie działać.

Poza tym takie dwie uwagi:

  • nie trzyma się haseł w bazie w postaci czystego tekstu
  • zabezpiecz się przed SQL Injection
    Wprawdzie to dotyczy systemów na produkcji, a Ty się raczej dopiero uczysz, ale dobre nawyki lepiej mieć od początku :)
1

A gdzie błąd w zapytaniu?

Brakuje znaków ' przez co login oraz hasło nie są brane jako varchar. Nie zmienia to jednak faktu, że robisz to nieprawidłowo. Podobny przykład tutaj: Prośba o ocenę aplikacji

1

Taka podpowiedź w temacie porady od @grzesiek51114 - rzuć okiem na http://phpmajster.blogspot.com/2015/05/php-pdo-podstawy-3-bindowanie.html

0

Jak będzie echo $connect to pokazuje: > Recoverable fatal error: Object of class mysqli could not be converted to string in C:\xampp\htdocs\gra\logowanie.php on line 12

0

No zasadniczo tak raczej nie wyświetlisz wartości tego, co jest przypisane do $connect, jeśli chcesz to możesz ewentualnie skorzystać z var_dump - https://www.php.net/manual/en/function.var-dump.php.

Ale czy rzuciłeś okiem na podany przeze mnie kilka linii wcześniej link? Jest tam chyba to trochę inaczej rozwiązane:

$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");

if (!$link) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}

echo "Success: A proper connection to MySQL was made! The my_db database is great." . PHP_EOL;
0
$zapytanie = "SELECT * FROM gra WHERE login = ".$login." AND WHERE haslo = ".$haslo."";

przed i po $login i $haslo usuń kropki i według mnie bardziej czytelnie by było gdyby $login i $hasło było w apostrofach ,ale to tylko moja opinia :)

0

przed i po $login i $haslo usuń kropki i według mnie bardziej czytelnie by było gdyby $login i $hasło było w apostrofach ,ale to tylko moja opinia :)

Kropki muszą być, bo błąd pokazuje.

0

Powtórzę, bo widzę, że się temat trochę nam rozjeżdża.

  1. sprawdź, czy w ogóle połączenie z bazą się nawiązuje poprawnie
  2. jeśli tak - skorzystaj z porady @grzesiek51114 oraz podanego przeze mnie tutoriala i zmień sposób operowania na bazie. Roboty na 5 minut, a będzie od razu porządniej, poza tym z automatu zabezpieczysz się przed SQL injection
0
cerrato napisał(a):

No zasadniczo tak raczej nie wyświetlisz wartości tego, co jest przypisane do $connect, jeśli chcesz to możesz ewentualnie skorzystać z var_dump - https://www.php.net/manual/en/function.var-dump.php.

Ale czy rzuciłeś okiem na podany przeze mnie kilka linii wcześniej link? Jest tam chyba to trochę inaczej rozwiązane:

$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");

if (!$link) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}

echo "Success: A proper connection to MySQL was made! The my_db database is great." . PHP_EOL;

Tak, rzuciłem okiem na ten link, ale nie znalazłem tam rozwiązania.
Var_dump pokazuje:

object(mysqli)#1 (19) { ["affected_rows"]=> int(-1) ["client_info"]=> string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: 401a40ebd5e281cf22215acdc170723a1519aaa9 $" ["client_version"]=> int(50012) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(1064) ["error"]=> string(167) "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE haslo = haslo' at line 1" ["error_list"]=> array(1) { [0]=> array(3) { ["errno"]=> int(1064) ["sqlstate"]=> string(5) "42000" ["error"]=> string(167) "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE haslo = haslo' at line 1" } } ["field_count"]=> int(0) ["host_info"]=> string(20) "localhost via TCP/IP" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(21) "5.5.5-10.1.37-MariaDB" ["server_version"]=> int(50505) ["stat"]=> string(133) "Uptime: 4168 Threads: 1 Questions: 463 Slow queries: 0 Opens: 31 Flush tables: 1 Open tables: 25 Queries per second avg: 0.111" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(72) ["warning_count"]=> int(0) } haslo

Hasło to "haslo"
Login to "login"

0
cerrato napisał(a):

Powtórzę, bo widzę, że się temat trochę nam rozjeżdża.

  1. sprawdź, czy w ogóle połączenie z bazą się nawiązuje poprawnie
  2. jeśli tak - skorzystaj z porady @grzesiek51114 oraz podanego przeze mnie tutoriala i zmień sposób operowania na bazie. Roboty na 5 minut, a będzie od razu porządniej, poza tym z automatu zabezpieczysz się przed SQL injection

Ok

0

Zapytanie masz nieprawidłowe, ponieważ masz tam dwa razy WHERE:

SELECT * FROM gra WHERE login = ".$login." AND WHERE haslo = ".$haslo."

No i zapewne apostrofy ' są potrzebne, żeby login i hasło były prawidłowo interpretowane jako varchar, abstrahując już w ogóle od podatności na SQL Injection.

0
cerrato napisał(a):

Powtórzę, bo widzę, że się temat trochę nam rozjeżdża.

  1. sprawdź, czy w ogóle połączenie z bazą się nawiązuje poprawnie
  2. jeśli tak - skorzystaj z porady @grzesiek51114 oraz podanego przeze mnie tutoriala i zmień sposób operowania na bazie. Roboty na 5 minut, a będzie od razu porządniej, poza tym z automatu zabezpieczysz się przed SQL injection

Pokazuje mi wpisane przeze mnie hasło.

To ja cały kod pokażę, bo może w innej części jest kod:

login.php:

<?php
    $_SESSION['log'] = false;
?>
<!DOCTYPE HTML>
<html lang= "pl">
<head>
    <meta charset = "utf-8" />
    <title>Kosmos</title>
    <meta name="description" content= "test2" />
    <meta name= "keywords"content="Cytaty.pl" />
    <link href="https://fonts.googleapis.com/css?family=Open+Sans" rel="stylesheet">  
    <script type="text/javascript" src="pokazopis.js"></script>
    <meta http-equiv="X-UA-Compatible" content= "IE=edge,chrome=1" />
    <link rel="stylesheet" href="style.css" type="text/css"/>
    <link rel="shortcut icon" href="miniaturka.gif">
</head>
<body>
    <form action="session.php" method="post">
        <input type="text" name="login" />
        <input type="password" name="haslo" />
        <input type="submit" name="zaloguj" value="zaloguj" />
    </form>
</body>
</html>

sessino.php:

<?php
    session_start();

    //Login i Hasło
    if(isset($_POST['login']) && isset($_POST['haslo']))
    {
        $_SESSION['login'] = $_POST['login'];
        $_SESSION['haslo'] = $_POST['haslo'];
        header("location: logowanie.php");
    }
?>

logowanie.php:

<?php
    session_start();

    $login = $_SESSION['login'];
    $haslo = $_SESSION['haslo'];

    $connect = mysqli_connect('localhost', 'root', '', 'gra');
    $zapytanie = "SELECT * FROM gra WHERE login = '".$login."' AND WHERE haslo = '".$haslo."'";
	$wynik = mysqli_query($connect, $zapytanie);
	if($wynik == false)
	{
        echo $wynik;
        echo $haslo;
    }
    else
	{
		$user = mysqli_fetch_row($wynik);
		if($user>0)
		{
			$_SESSION['log'] = true;
			header("location: game.php");
		}else
		{
			$_SESSION['log'] = false;
			header("location: zaloguj.php");
		}
	}
?>
0

@Gouda105: Napisałem Ci wyżej. Masz błąd w zapytaniu. :)

1
$query = "SELECT * FROM gra WHERE login = '".htmlspecialchars($login, ENT_QUOTES)."' AND haslo = '".htmlspecialchars($haslo, ENT_QUOTES)."'";
0

Ok, działa @mr_jaro dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1