Diskuze: Správný zápis dotazu SELECT
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 49 zpráv z 49.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Hm, to bude takto asi ťažká otázka. podla mňa si poskytol málo informácii na konkrétnu radu.
takto môžeme iba všeobecne diskutovať napr:
máš definovanú a naplnenú $_SESSION["id"] ?
spracovávaš $dotaz ?
čo ti vracia ?
před html
<?php
Session_Start();
if(isset($_SESSION["login"])){
$_SESSION["id"]=$loguser["id"];
$_SESSION["jmeno"]=$loguser["jmeno"];
$_SESSION["prijmeni"]=$loguser["prijmeni"];
$_SESSION["login"]=$loguser["login"];
}
?>
chyba: Notice: Undefined index: id in C:\wamp\www\MH\profila.php on line 38
výpis "
select * from admin where id =
$_SESSION["id"] přece naplníš při přihlášení. Ostatní údaje tam jsou zbytečné, protože je vždy najdeš v databázi podle toho id.
no najskôr musíš nájisť uživatela poďla kombinácie nick a heslo. tak získaš ID, ktoré môžeš používať zo session
$sql=' select uzivatel_id as id from uzivatel where uzivatel_nick='".$_POST["nick"]."' and uzivatel_heslo='".$_POST["heslo"]."';
$sql=mysql_query($sql);
if(mysql_num_rows($sql)== NULL) echo "nespravne meno alebo heslo"; // uživateľ sa nenašiel
else //uživatel sa našiel, a prihlásil. pridanie do session
{
$sql=mysql_fetch_assoc($sql);
$_SESSION["id"]=$sql["id"];
}
pozor nie je to vôbec ošetrený kód!!! iba ukážka ako to funguje
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="generator" content="PSPad editor, www.pspad.com">
<link rel="stylesheet" href="css/logadmin.css" type="text/css">
<title>Přihlášení - Admin</title>
</head>
<body>
<a href="index.php">Vrať se zpět</a>
<br><br><br><br><br><br>
<h1>Administrace - Haus-Moto</h1>
<br><br><br>
<center>
<form action="menuadmin.php" method="POST">
<table>
<tr><td>Login:</td><td><input type="text" name="login" style="width:150px"></td></tr>
<tr><td>Heslo:</td><td><input type="password" name="heslo" style="width:150px"></td></tr>
<tr><td><input type="submit" value="Přihlásit"></td></tr>
</table>
</form>
</center>
<?php
require("connect.php");
if($_POST and (empty($_POST["login"]) or empty($_POST["heslo"]))){
echo ("Nevyplnil si Login nebo Heslo.");
}
else{
if(isset($_POST["login"]) and (isset($_POST["heslo"]))){
$login = $_POST["login"];
$heslo = $_POST["heslo"];
$dotaz = "SELECT * FROM admin where login=\"$login\" and heslo =\"$heslo\"";
$vysledek = mysql_query($dotaz) or die ("Vyplnil si špatně login nebo heslo");
$loguser=mysql_fetch_array($vysledek);
if(mysql_num_rows($vysledek)==1){
Session_start();
$_SESSION["id"] = $loguser["id"];
$_SESSION["jmeno"] = $loguser["jmeno"];
$_SESSION["prijmeni"] = $loguser["prijmeni"];
$_SESSION["login"]= $loguser["login"];
header("location:menuadmin.php");
}
}
}
?>
</body>
</html>
To já mám....
Nedávej nám sem SQL injection.
$sql=mysql_query($sql);
Fuj, velebnosti. Takovou zrůdnost si také nechej od cesty.
ten session_start(); máš ešte predtým ako sa odošlú hlavičky stránky
?
existuje $_SESSION["login"] ?
session_start() musí byť úplne na začiatku. predtým ako sa čokolvek vypíše. máš ho na zlom mieste
<? require("udrzeni.php"); ?>
<!DOCTYPE HTML PUBLIC "-W3CDTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="generator" content="PSPad editor, www.pspad.com">
<link rel="stylesheet" href="css/logadmin.css" type="text/css">
<title>Přihlášení - Admin</title>
</head>
<body>
<a href="index.php">Vrať se zpět</a>
<br><br><br><br><br><br>
<h1>Administrace - Haus-Moto</h1>
<br><br><br>
<center>
<form action="menuadmin.php" method="POST">
<table>
<tr><td>Login:</td><td><input type="text"
name="login" style="width:150px"></td></tr>
<tr><td>Heslo:</td><td><input type="password"
name="heslo" style="width:150px"></td></tr>
<tr><td><input type="submit"
value="Přihlásit"></td></tr>
</table>
</form>
</center>
<?php
require("connect.php");
if($_POST and (empty($_POST["login"]) or empty($_POST["heslo"]))){
echo ("Nevyplnil si Login nebo Heslo.");
}
else{
if(isset($_POST["login"]) and (isset($_POST["heslo"]))){
$login = $_POST["login"];
$heslo = $_POST["heslo"];
$dotaz = "SELECT * FROM admin where login=\"$login\" and heslo =\"$heslo\"";
$vysledek = mysql_query($dotaz) or die ("Vyplnil si špatně login nebo
heslo");
$loguser=mysql_fetch_array($vysledek);
if(mysql_num_rows($vysledek)==1){
header("location:menuadmin.php");
}
}
}
?>
</body>
</html>
Vše, co máš mezi <?php ... ?>
patří na úplný
začátek skriptu. Na druhém řádku bude session_start();
Hlavička HTML musí být až za celým skriptem.
Řeknu ti jednoduchou radu, smaž to a začni odznova. Přečti si zdejší seriál nejen o OOP ale i základy PHP.
<?
require("connect.php");
require("udrzeni.php");
if($_POST and (empty($_POST["login"]) or empty($_POST["heslo"]))){
echo ("Nevyplnil si Login nebo Heslo.");
}
else{
if(isset($_POST["login"]) and (isset($_POST["heslo"]))){
$login = $_POST["login"];
$heslo = $_POST["heslo"];
$dotaz = "SELECT * FROM admin where login=\"$login\" and heslo =\"$heslo\"";
$vysledek = mysql_query($dotaz) or die ("Vyplnil si špatně login nebo heslo");
$loguser=mysql_fetch_array($vysledek);
if(mysql_num_rows($vysledek)==1){
header("location:menuadmin.php");
}
}
}
?>
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="generator" content="PSPad editor, www.pspad.com">
<link rel="stylesheet" href="css/logadmin.css" type="text/css">
<title>Přihlášení - Admin</title>
</head>
<body>
<a href="index.php">Vrať se zpět</a>
<br><br><br><br><br><br>
<h1>Administrace - Haus-Moto</h1>
<br><br><br>
<center>
<form action="menuadmin.php" method="POST">
<table>
<tr><td>Login:</td><td><input type="text" name="login" style="width:150px"></td></tr>
<tr><td>Heslo:</td><td><input type="password" name="heslo" style="width:150px"></td></tr>
<tr><td><input type="submit" value="Přihlásit"></td></tr>
</table>
</form>
</center>
</body>
</html>
tak?
Stejně se vyhazuje stejná chyba.
vidíš, nám zase nadávali keď sme to písali priamo. Že aby sa to
lahšie "debuggovalo" keď si pred spracovaním možes nechat echovať $sql tak to tak mám zafixované.
už sa ale snažím prejisť na PDO a tam to nepoužívam.
tu injection si myslel ako že som to napísal tak do tej ukázky, či ako ?
No vida, konečně jsi to pochopil. A teď můžeme teprve začít hledat chybu.
teraz tam nevidím to session_start(); ale je pravda že tu na mňa moc rýchlo pribúdaju príspevky
Použil jsi stejnou proměnnou pro parametr funkce a pro výsledek. To se
prostě nedělá. Kromě toho výsledkem funkce mysql_query($sql)
není SQL dotaz, proto neexistuje důvod, proč by se měl ukládat do
proměnné s názvem $sql
. To jméno proměnné je prostě matoucí
a proto je ten zápis špatně.
Před řádek
require("connect.php");
dej řádek
session_start();
Uvažoval jsi, co se stane, když uživatel zadá heslo
0'; DROP DATABASE; #
?
Ach ták. beriem a budem si to pamätať.
Obávam sa, že takýchto "zrúdnosti" budem mať zafixovaných asi viac :/
na druhú stranu, každý deň ktorý sa nič nové človek nenaučí, je zbytočný deň.
Ještě k té zrůdnosti. Místo:
$sql = mysql_query($sql);
je mnohem lepší použít
$vysledek = mysql_query($sql);
Nikdy nedávej výsledek do stejné proměnné. Kromě toho, že je to nepřehledné, je to i pomalejší a zabere to víc paměti - mám to změřeno.
V SQL dotazu máš chybně
... where login=\"$login\" and heslo =\"$heslo\"
patří tam
... where login='$login' and heslo ='$heslo'
Vďaka za radu. Sa obávam, že by bolo na facku aj dve, keby si videl môj
kód.
Začnem na tom pracovať inak
Nechápu, vše to klapalo. Od včerejška co napíšu, tak už server nebere.
nebude problém v tom že ten formulár posielaš do menuadmin.php ?
<form action="menuadmin.php" method="POST">
Posílám to kvůli tomu,že zkouším jestli se naplnil login, protože zatím ne.
a v súbore menuadmin.php je čo ? to je ten kód čo si tu vypísal ?
Místo
<form action="menuadmin.php" method="POST">
dej jen
<form method="POST">
a místo
header("location:menuadmin.php");
patří
header("Location: .");
Ta mezera za dvojtečkou musí být a s malým "l" to tuším také nefunguje.
Nikde nevidím, že bys do $_SESSION['id']
ukládal id
uživatele, kterého jsi při přihlašování našel v databázi.
Stále ti tam chybí
$login = mysql_real_escape_string($_POST["login"]);
$heslo = mysql_real_escape_string($_POST["heslo"]);
skript moze byt aj medzi html tagmi, ale suhlasim s tym, ze session_start(),
ako aj header() patri na zaciatok scriptu, pred <html> tagom
cize nejako takto:
<?php
session_start();
header(...);
.
.
.
?>
<html>
.
.
.
V každém skriptu mám jen jedno <?php
na 1. řádku a nikde
jinde. Ukončení ?>
do skriptů nedávám vůbec. Všechny
výstupy dělám příkazem echo
a to až tehdy, když mám
veškerá výstupní data připravena. Je to i nejrychlejší.
Abych uvedl nějaký příklad:
<?php
session_start();
header(...);
.
.
.
$title = "Titulek stránky";
$clanek = new Clanek($_POST['clanek']);
echo <<<EOT
<!DOCTYPE html>
<html>
<head><title>$title</title></head>
<body>
$clanek
</body>
</html>
EOT;
Je to trochu zajímavá kombinace PHP a HTML, ale budiž. Lepší než výchozí <??>. Já echo moc nepoužívám, lépe se dají využít šablony.
Vždycky se mi šablony nechtějí dělat, raději dělám výstup objektově. Když už, tak udělám pro jeden projekt jen jednu šablonu. Víc jich obvykle ani není třeba dělat.
myslim, ze tvoj sposob je aj prehladnejsi a nedochadza tu k tvorbe tzv. gulasu z kodu...
V reálu to vypadá ještě trochu jinak, ale to je vedlejší. Dospěl jsem k tomu po vyzkoušení spousty jiných variant. Heredoc se mi prostě líbí a používám ho i pro zápis víceřádkových SQL dotazů. Pro HTML má nespornou výhodu v tom, že mohu ve výstupu používat apostrofy a uvozovky bez omezení a bez nějakého escapování.
Mno nejlepší je už mít hotový systém, ale jinak je samozřejmě tenhle přístup také dobrý.
PHP má hotový systém, dokonce jich má několik. Stačí si některý z nich vybrat a použít.
Jedno to je, ale první znak výstupu můžeš odeslat až po odeslání session a všech ostatních hlaviček HTTP. Jinak se s tím nedomluvíš. Proto je jednodušší dát celý výstup jako samostatný modul, který se zavolá úplně na konci skriptu.
Zdravím vás,
problém jsem vyřešil. Měl jsem špatně zapsaný SESSION. Nyní vše funguje jak má.
Děkuji všem za pomoc.
Přesto mám ještě jeden dotaz...
Pokud do databáze vložím fotky, když je pak v dalším souboru chci
vypsat a udělat aby byl náhled fotografie? Jak na to?
Zobrazeno 49 zpráv z 49.