PHP Problém

Odpovědět
RayCodeCSC
Příspěvky: 48
Registrován: 11 črc 2019 23:52

Re: PHP Problém

Příspěvek od RayCodeCSC » 20 říj 2019 23:02

Tak som to konečne vyriešil. Používam tento PHP kód:

Kód: Vybrat vše

<?php
		$pripoj = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
		$sql = "SELECT * FROM users";
		$dotaz = mysqli_query($pripoj, $sql);

		$vypis = mysqli_fetch_array($dotaz, MYSQLI_BOTH);
		
		$zobrazit_kredit = $vypis['kredit'];
		
		echo "$zobrazit_kredit";
?>
Ale problém je zasa ten, že keď vytvorím nového užívateľa, a prihlásim sa zaň, tak mi to data z tabuľky v MySQL vypíše vždy z prvého riadku.

Takže pokiaľ mám v prvom riadku napr.:
id: 1
nickname: RayCodeCSC
password: <heslo>
kredit: 150

A vytvorím nového užívateľa, a užívateľ bude mať v stĺpci "kredit" hodnotu napr. "0", tak po prihlásení, keď si nechám vypísať kredit na stránke mi to napíše kredit vždy z prvého riadka. Takže keďže som na prvom riadku ja, čerpá to informácie odo mňa, a nie svoje. Takže ja keď si napr. nastavím kredit na 160, majú ho všetci. Ako urobím, aby mal každý vypísané svoje data a nie data vždy toho, kto je v phpmyadmin na prvom riadku?

PS: Poprosím o čo najjednoduchší kód. Nechcem nič podobné, čo napísal Javierko. Po prečítaní scriptu od Javierka som mal 100 chuti sa vykašľať na celé PHP.

Uživatelský avatar
Javierko
Zákaznická podpora
Příspěvky: 80
Registrován: 09 bře 2019 19:24
Bydliště: OnGameFrame()
Kontaktovat uživatele:

Příspěvek od Javierko » 21 říj 2019 17:03

Dostáváte vždy první řádek, protože podle SQL dotazu vybíráte právě pouze jeden řádek:

Kód: Vybrat vše

$sql = "SELECT * FROM users";
Pokud chcete vybrat daného uživatele musíte ho v SQL dotazu podle něčeho identifikovat.
Př.:

Kód: Vybrat vše

$sql = "SELECT * FROM users WHERE nickname = 'testUzivatel'";
Potom dostanete data z řádku, kde se nickname rovná "testUzivatel".
PS: Poprosím o čo najjednoduchší kód. Nechcem nič podobné, čo napísal Javierko. Po prečítaní scriptu od Javierka som mal 100 chuti sa vykašľať na celé PHP.
Napsal jsem vám jednu z nejbezpečnějších metod pro SQL dotazy. :'(
Pawn, SourcePawn, Web development, MySQL, Lua, ...

YouTube: https://www.youtube.com/c/Javierko21
Twitch: https://twitch.tv/javierko

Projects:
https://steamid.cz
https://hexmania.eu/

RayCodeCSC
Příspěvky: 48
Registrován: 11 črc 2019 23:52

Příspěvek od RayCodeCSC » 21 říj 2019 20:09

Super, ide ďakujem.

Poprosím mám ešte jeden problém... Snažím sa vytvoriť registráciu, ale nechce mi to zapísať nič do databáze, a ani to nevypíše text v echo... vôbec nemám tušenie, kde môže byť chyba.

Kód: Vybrat vše

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Registrácia</title>
</head>
<body style="font-family: arial;">
	<h2><center>Registrácia - Vytvorenie účtu</center></h2>

	<center><b>Poznámka:</b> Všetky polia označené <span style="color: red;">*</span> sú povinné!</center><br>
	<form action="#" method="post" style="padding-top: 25px;">
		<center>
			Zadajte prezývku: <span style="color: red;">*</span><br>
			<input type="text" name="prezyvka" required=""><br><br>

			Zadajte e-mail: <span style="color: red;">*</span><br>
			<input type="email" name="e-mail" required=""><br><br>

			Zadajte heslo: <span style="color: red;">*</span><br>
			<input type="password" name="heslo" required=""><br><br>

			Zadajte heslo znova: <span style="color: red;">*</span><br>
			<input type="password" name="heslo-znovu" required=""><br><br>

			<button name="registrovat">Vytvoriť nový účet</button><br><br>
		</center>
	</form>

	<?php
		date_timezone_set("Europe/Bratislava");

		$nick = $_POST['prezyvka'];
		$heslo = $_POST['heslo'];
		$email = $_POST['e-mail'];
		$heslo_znovu = $_POST['heslo-znovu'];
		$reg_datum_cas = date("d.m.Y H:i:s");
		$reg = $_POST['registrovat'];

		require_once("../sql_connect.php");

		$pripoj = mysql_connect($db_host, $db_user, $db_pass, $db_name);

		if(isset($reg))
		{
			if($heslo == $heslo_znovu)
			{
				require_once("../host/functions.php");
				mysql_query($pripoj, "INSERT INTO users (nickname, password, email, datum_cas) VALUES ('$nick', '$heslo', '$email', '$reg_datum_cas')");
				echo "Registrácia prebehla úspešne!";
				reload("2", "web.php");

			}
			else
			{
				echo "Heslá sa nezhodujú!";
				reload("2", "web.php");
			}
		}
	?>
</body>
</html>
Všeličo som tam poskúšal meniť, ale nič nepomoholo. Skúsil som napr. odstrániť to overenie hesla (if($heslo == $heslo_znovu)) atď... potom som sa teda skúsil riadiť podľa návodu tu => https://www.itnetwork.cz/php/databaze/n ... p-tutorial (samozrejme Db::... som zamenil za mysql_...) a stále nič...

Uživatelský avatar
Escanor
Příspěvky: 16
Registrován: 17 zář 2019 21:52

Příspěvek od Escanor » 21 říj 2019 20:44

Javierko píše:
20 říj 2019 21:49

Kód: Vybrat vše

<?php
require_once("../functions.php");

if(isset($_POST['prihlasit'])) {
    if($_POST['nickname'] != "" && $_POST['heslo'] != "") {
        $db_name = "Nič";
        $db_user = "Nič";
        $db_pass = "Nič";
        $db_host = "Nič";

        $mysql = new mysqli($db_host, $db_user, $db_pass, $db_name) or die($mysql->error);

        $nickname = $mysql->real_escape_string($_POST['nickname']);
        $password = $mysql->real_escape_string($_POST['heslo']);

        $stmt = $mysql->prepare("SELECT * FROM users WHERE nickname = ?");
        $stmt->bind_param("s", $nickname);

        if($stmt->execute()) {
            $result = $stmt->get_result();
            $numRows = $result->num_rows;

            if($numRows > 0) {
                $user = $results->fetch_assoc();

                $userPassword = $user['password'];

                //Tady bych spíše použil funkci password_verify() a heslo bych zašifroval, protože bych ho v databázi nenechával jako jenom "heslo"
                if($password == $userPassword) {
                    //Úspěšně přihlášen
                } else {
                    exit("Špatně zadané heslo.");
                }
            } else {
                exit("Uživatel s tímto jménem neexistuje.");
            }
        } else {
            exit("Chyba při execute.");
        }
    }
}
?>

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Prihlásenie</title>
</head>
<body>
	<form action="#" method="post" style="padding-top: 10px;">
		<center>
			<h2>Prihlásenie</h2>

			Nickname:<br>
			<input type="text" name="nickname" required><br><br>

			Heslo:<br>
			<input type="password" name="heslo" required><br><br>

			<button type="submit" name="prihlasit">Prihlásiť sa</button><br><br>
		</center>
	</form>
	<center><a href="#" target="_blank">Zabudli ste prihlasovacie údaje?</a><br><br></center>
</body>
</html>

Kód: Vybrat vše

        $nickname = $mysql->real_escape_string($_POST['nickname']);
        $password = $mysql->real_escape_string($_POST['heslo']);
Je zbytočné keď tam máš prepared statement.
A ty Ray použi to čo ti poslal Javierko (aj ja to citujem práve).

Uživatelský avatar
Javierko
Zákaznická podpora
Příspěvky: 80
Registrován: 09 bře 2019 19:24
Bydliště: OnGameFrame()
Kontaktovat uživatele:

Příspěvek od Javierko » 22 říj 2019 16:43

RayCodeCSC píše:
21 říj 2019 20:09
Super, ide ďakujem.

Poprosím mám ešte jeden problém... Snažím sa vytvoriť registráciu, ale nechce mi to zapísať nič do databáze, a ani to nevypíše text v echo... vôbec nemám tušenie, kde môže byť chyba.

Kód: Vybrat vše

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Registrácia</title>
</head>
<body style="font-family: arial;">
	<h2><center>Registrácia - Vytvorenie účtu</center></h2>

	<center><b>Poznámka:</b> Všetky polia označené <span style="color: red;">*</span> sú povinné!</center><br>
	<form action="#" method="post" style="padding-top: 25px;">
		<center>
			Zadajte prezývku: <span style="color: red;">*</span><br>
			<input type="text" name="prezyvka" required=""><br><br>

			Zadajte e-mail: <span style="color: red;">*</span><br>
			<input type="email" name="e-mail" required=""><br><br>

			Zadajte heslo: <span style="color: red;">*</span><br>
			<input type="password" name="heslo" required=""><br><br>

			Zadajte heslo znova: <span style="color: red;">*</span><br>
			<input type="password" name="heslo-znovu" required=""><br><br>

			<button name="registrovat">Vytvoriť nový účet</button><br><br>
		</center>
	</form>

	<?php
		date_timezone_set("Europe/Bratislava");

		$nick = $_POST['prezyvka'];
		$heslo = $_POST['heslo'];
		$email = $_POST['e-mail'];
		$heslo_znovu = $_POST['heslo-znovu'];
		$reg_datum_cas = date("d.m.Y H:i:s");
		$reg = $_POST['registrovat'];

		require_once("../sql_connect.php");

		$pripoj = mysql_connect($db_host, $db_user, $db_pass, $db_name);

		if(isset($reg))
		{
			if($heslo == $heslo_znovu)
			{
				require_once("../host/functions.php");
				mysql_query($pripoj, "INSERT INTO users (nickname, password, email, datum_cas) VALUES ('$nick', '$heslo', '$email', '$reg_datum_cas')");
				echo "Registrácia prebehla úspešne!";
				reload("2", "web.php");

			}
			else
			{
				echo "Heslá sa nezhodujú!";
				reload("2", "web.php");
			}
		}
	?>
</body>
</html>
Všeličo som tam poskúšal meniť, ale nič nepomoholo. Skúsil som napr. odstrániť to overenie hesla (if($heslo == $heslo_znovu)) atď... potom som sa teda skúsil riadiť podľa návodu tu => https://www.itnetwork.cz/php/databaze/n ... p-tutorial (samozrejme Db::... som zamenil za mysql_...) a stále nič...
Pokud chcete udělat registraci pro veřejnost, tak tento způsob na 100% nedoporučuji, stačí jenom, když vám tam někdo hodí SQL inject s DROP ALL TABLES a máte všechny data v ****.

Btw. chyba by měla být v:

Kód: Vybrat vše

<button name="registrovat">Vytvoriť nový účet</button>
na

Kód: Vybrat vše

<button type="submit" name="registrovat">Vytvoriť nový účet</button>
případně si přes JS udělat nějaký event na kliknutí, v tomto případě byste si musel udělat i id.
Pawn, SourcePawn, Web development, MySQL, Lua, ...

YouTube: https://www.youtube.com/c/Javierko21
Twitch: https://twitch.tv/javierko

Projects:
https://steamid.cz
https://hexmania.eu/

RayCodeCSC
Příspěvky: 48
Registrován: 11 črc 2019 23:52

Příspěvek od RayCodeCSC » 22 říj 2019 19:57

Viem, že tento môj spôsob je nebezpečný, ale tak nemôžem sa učiť 40 vecí naraz.Najprv sa chcem naučiť poriadne pracovať s databázou (zápis, výpis, select atď...) a až potom, keď budem už dačo o databázy vedieť, môžem riešiť ošetrovanie. Takže sa na mňa prosím nehnevajte, ale teraz zo začiatku budem robiť naozaj len basic scripty. Nebude tam nič ošetrené, nič zabezpečené atď...

...Každopádne skúsil som teda opraviť button na ten, čo ste napísali, a stále nefunguje. Takže v tom problém zrejme nie je. Script som trocha upravil, nie o moc:

Kód: Vybrat vše

<?php
	function registruj()
	{
		require_once 'host/functions.php';
		require_once 'sql_connect.php';
		date_timezone_set("Europe/Bratislava");

		$nick = $_POST['nickname'];
		$pass1 = $_POST['pwd1'];
		$pass2 = $_POST['pwd2'];
		$email = $_POST['email'];
		$regme = $_POST['reg'];
		$ip_address = getMyIp();

		$pripoj = mysql_connect($db_host, $db_user, $db_pass, $db_name);

		if(isset($regme))
		{
			if($pass1 == $pass2)
			{
				mysql_query($con, "INSERT INTO users (nickname, password, email, ip_address) VALUES ('$nick', '$pass1', '$email', '$ip_address')");
				echo "Registrácia prebehla úspešne!<br><br>Môžete sa prihlásiť!";
				reload("2", "web.php");
			}
			else
			{
				echo "Heslá sa nezhodujú!";
				reload("2", "web.php");
			}
		}
	}
?>

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Registrácia - Hosting</title>
</head>
<body style="font-family: arial;">
	<h2><center>Registrácia - Hosting</center></h2>

	<form action="#" method="post" style="padding-top: 25px;">
		<center>
			Zadajte nickname: <span style="color: red;">*</span><br>
			<input type="text" name="nick" required=""><br><br>

			Zadajte E-mail: <span style="color: red;">*</span><br>
			<input type="email" name="email" required=""><br><br>

			Zadajte heslo: <span style="color: red;">*</span><br>
			<input type="password" name="pwd1" required=""><br><br>

			Zadajte heslo znovu (overenie) <span style="color: red;">*</span><br>
			<input type="password" name="pwd2" required=""><br><br>

			<button name="reg" style="font-size: 20px;">Zaregistrovať sa</button><br><br>

			<?php registruj(); ?>
		</center>
	</form>
</body>
</html>
V tomto scripte mi všetko funguje presne tak ako má, ale problém bude niekde v mysql_query(), pretože po stlačení tlačítka mi to napíše aj ten text "Registrácia prebehla úspešne...", takže si myslím, že problém bude niekde v mysql_query.

Pozrel som si na youtube nejaké videá, a všetci to mali urobené presne tak, ako ja a im to išlo. Takže skutopčne neviem, prečo mne to nejde...

Uživatelský avatar
Escanor
Příspěvky: 16
Registrován: 17 zář 2019 21:52

Příspěvek od Escanor » 22 říj 2019 21:29

Viem, že tento môj spôsob je nebezpečný, ale tak nemôžem sa učiť 40 vecí naraz.Najprv sa chcem naučiť poriadne pracovať s databázou (zápis, výpis, select atď...) a až potom, keď budem už dačo o databázy vedieť, môžem riešiť ošetrovanie. Takže sa na mňa prosím nehnevajte, ale teraz zo začiatku budem robiť naozaj len basic scripty. Nebude tam nič ošetrené, nič zabezpečené atď...
Tak, tu sa nedá nič iné povedať ako no do pi*.
Po tom čo si napísal, ti garantujem že s teba dobrý programátor nebude.
Prepared statements není ošterovanie ale lepší spôsob ako sa to má robiť, a je doporučovaný ako jediný ktorý by sa mal používať už od PHP 5.6, takže to že sa naučíš ako to urobiť zle, ti nepomôže, skôr ešte viac to zhorší tvôje skillz. Ked chceš vedieť zapís atď do databáze, skúšaj to cez mysql konzolu na VPS.

Uživatelský avatar
lukaskabc
Zákaznická podpora
Příspěvky: 62
Registrován: 09 bře 2019 20:28
Bydliště: Position.Get("UnderYourBed");
Kontaktovat uživatele:

Příspěvek od lukaskabc » 06 lis 2019 17:34

Zdravím,
malá poznamka, doporučuji když už začínat tak rovnou u aktuální technologie.
Doporučuji namísto funkcí mysql použít modernější mysqli
https://www.php.net/manual/en/book.mysqli.php

a v tomto směru si nechat poradit.
Prepared statement doporučuji používat vždy.
mysqli->query pak v případech kdy potřebujete odeslat jednoduchý dotaz databázi, který nebude obsahovat žádnou hodnotu zadanou uživatelem.
CISCO certified
---
Vypnout počítač bez odhlášení
může jen systémový administrátor. - Odborník může pravidla porušovat. Není čas dodržovat všechny zásady pro běžné uživatele.
Jasně, že to opravím. Nemusíš mi to připomínat každých 6 měsíců.

Odpovědět