Diskuze: Správný zápis dotazu SELECT

Ostatní jazyky SQL SQL a databáze Správný zápis dotazu SELECT

Avatar
Salieri
Člen
Avatar
Salieri:

Dobrý večer,

když se chci zalogovat do systému, přihlásím se a zmáčknu odkaz můj profil, jak zapsat dotaz, který by mi vypsal údaje o daném uživateli.

Zkoušel jsem, kde nazačátku souboru, před html kodem jsem napsal session...

$dotaz = ("SELECT * FROM admin  where id=".$_SESSION["id"]."");

Děkuji vám za řešení.

Odpovědět 27.11.2013 19:40
Hlavní zlo? **Školství a Matematika**!
Avatar
Peco
Člen
Avatar
Odpovídá na Salieri
Peco:

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 ?

Nahoru Odpovědět  +1 27.11.2013 19:44
Každý deň vstávam, aby som sa niečo nové naučil.
Avatar
Salieri
Člen
Avatar
Odpovídá na Peco
Salieri:

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\pro­fila.php on line 38

výpis "

select * from admin where id =
Nahoru Odpovědět 27.11.2013 20:02
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

$_SESSION["id"] náš prázdné.

Nahoru Odpovědět  +2 27.11.2013 20:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Salieri
Člen
Avatar
Salieri:

Proto píšu, jak ho mám naplnit,nevím.

Nahoru Odpovědět 27.11.2013 20:05
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

$_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.

Nahoru Odpovědět  +1 27.11.2013 20:13
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Peco
Člen
Avatar
Peco:

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

Editováno 27.11.2013 20:19
Nahoru Odpovědět 27.11.2013 20:18
Každý deň vstávam, aby som sa niečo nové naučil.
Avatar
Salieri
Člen
Avatar
Odpovídá na Kit
Salieri:

Ale to já mám.... Nechápu proč to nejde..

Nahoru Odpovědět 27.11.2013 20:20
Hlavní zlo? **Školství a Matematika**!
Avatar
Salieri
Člen
Avatar
Odpovídá na Peco
Salieri:
<!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....

Nahoru Odpovědět 27.11.2013 20:22
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Peco
Kit:

Nedávej nám sem SQL injection.

$sql=mysql_query($sql);

Fuj, velebnosti. Takovou zrůdnost si také nechej od cesty.

Editováno 27.11.2013 20:24
Nahoru Odpovědět  +1 27.11.2013 20:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Peco
Člen
Avatar
Odpovídá na Salieri
Peco:

ten session_start(); máš ešte predtým ako sa odošlú hlavičky stránky ?
existuje $_SESSION["login"] ?

Nahoru Odpovědět 27.11.2013 20:23
Každý deň vstávam, aby som sa niečo nové naučil.
Avatar
Peco
Člen
Avatar
Odpovídá na Salieri
Peco:

session_start() musí byť úplne na začiatku. predtým ako sa čokolvek vypíše. máš ho na zlom mieste

Nahoru Odpovědět 27.11.2013 20:26
Každý deň vstávam, aby som sa niečo nové naučil.
Avatar
Salieri
Člen
Avatar
Odpovídá na Peco
Salieri:

<? require("udrze­ni.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/logad­min.css" type="text/css">
<title>Přihlášení - Admin</title>
</head>
<body>
Vrať se zpět







<h1>Administrace - Haus-Moto</h1>





<center>
<form action="menuad­min.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("connec­t.php");
if($_POST and (empty($_POST["lo­gin"]) or empty($_POST["hes­lo"]))){
echo ("Nevyplnil si Login nebo Heslo.");

}
else{
if(isset($_POS­T["login"]) and (isset($_POST["hes­lo"]))){
$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_fet­ch_array($vys­ledek);
if(mysql_num_row­s($vysledek)==1){

header("locati­on:menuadmin.php");

}
}
}

?>

</body>
</html>

Nahoru Odpovědět  -1 27.11.2013 20:28
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

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.

Nahoru Odpovědět 27.11.2013 20:28
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Salieri
Petr Nymsa:

Ř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.

  1. Session musí být na začátku souboru - před jakýmkoliv výpisem
  2. Máš tam SQL injkece, kdokoliv ti databázi smaže
  3. používáš zastaralý ovladač, mrkni na PDO, má pěknou vlastnost jménem prepared statements
Nahoru Odpovědět 27.11.2013 20:29
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Salieri
Člen
Avatar
Odpovídá na Kit
Salieri:
<?
     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.

Nahoru Odpovědět 27.11.2013 20:29
Hlavní zlo? **Školství a Matematika**!
Avatar
Peco
Člen
Avatar
Odpovídá na Kit
Peco:

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 ?

Nahoru Odpovědět 27.11.2013 20:30
Každý deň vstávam, aby som sa niečo nové naučil.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

No vida, konečně jsi to pochopil. A teď můžeme teprve začít hledat chybu.

Nahoru Odpovědět 27.11.2013 20:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Salieri
Člen
Avatar
Odpovídá na Kit
Salieri:

Chyba je stálá.

Nahoru Odpovědět 27.11.2013 20:32
Hlavní zlo? **Školství a Matematika**!
Avatar
Peco
Člen
Avatar
Odpovídá na Salieri
Peco:

teraz tam nevidím to session_start(); ale je pravda že tu na mňa moc rýchlo pribúdaju príspevky

Nahoru Odpovědět 27.11.2013 20:33
Každý deň vstávam, aby som sa niečo nové naučil.
Avatar
Kit
Redaktor
Avatar
Kit:

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ě.

Nahoru Odpovědět 27.11.2013 20:34
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

Před řádek

require("connect.php");

dej řádek

session_start();
Nahoru Odpovědět 27.11.2013 20:37
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Peco
Kit:

Uvažoval jsi, co se stane, když uživatel zadá heslo

0'; DROP DATABASE; #

?

Nahoru Odpovědět  +1 27.11.2013 20:42
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Peco
Člen
Avatar
Odpovídá na Kit
Peco:

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ň.

Nahoru Odpovědět 27.11.2013 20:42
Každý deň vstávam, aby som sa niečo nové naučil.
Avatar
Salieri
Člen
Avatar
Odpovídá na Kit
Salieri:

Pořád stejná chyba.

Nahoru Odpovědět 27.11.2013 20:50
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Peco
Kit:

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.

Nahoru Odpovědět  +1 27.11.2013 20:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

V SQL dotazu máš chybně

... where login=\"$login\" and heslo =\"$heslo\"

patří tam

... where login='$login' and heslo ='$heslo'
Nahoru Odpovědět  +1 27.11.2013 20:54
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Peco
Člen
Avatar
Odpovídá na Kit
Peco:

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 :)

Nahoru Odpovědět 27.11.2013 20:57
Každý deň vstávam, aby som sa niečo nové naučil.
Avatar
Salieri
Člen
Avatar
Salieri:

Nepomohlo.

Nahoru Odpovědět 27.11.2013 20:58
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

Mně to také nepomohlo.

Nahoru Odpovědět 27.11.2013 21:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Salieri
Člen
Avatar
Odpovídá na Kit
Salieri:

Nechápu, vše to klapalo. Od včerejška co napíšu, tak už server nebere.

Nahoru Odpovědět 27.11.2013 21:06
Hlavní zlo? **Školství a Matematika**!
Avatar
Peco
Člen
Avatar
Odpovídá na Salieri
Peco:

nebude problém v tom že ten formulár posielaš do menuadmin.php ?

<form action="menuadmin.php" method="POST">
Nahoru Odpovědět 27.11.2013 21:07
Každý deň vstávam, aby som sa niečo nové naučil.
Avatar
Salieri
Člen
Avatar
Odpovídá na Peco
Salieri:

Posílám to kvůli tomu,že zkouším jestli se naplnil login, protože zatím ne.

Nahoru Odpovědět  +1 27.11.2013 21:18
Hlavní zlo? **Školství a Matematika**!
Avatar
Peco
Člen
Avatar
Odpovídá na Salieri
Peco:

a v súbore menuadmin.php je čo ? to je ten kód čo si tu vypísal ?

Nahoru Odpovědět 27.11.2013 21:20
Každý deň vstávam, aby som sa niečo nové naučil.
Avatar
Kit
Redaktor
Avatar
Kit:

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.

Nahoru Odpovědět 27.11.2013 21:24
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Salieri
Člen
Avatar
Salieri:

Dobře, dál mě to nepřihlási.

Nahoru Odpovědět 27.11.2013 21:27
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

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"]);
Nahoru Odpovědět  +1 27.11.2013 21:38
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
mkub
Redaktor
Avatar
Odpovídá na Kit
mkub:

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>
.
.
.
 
Nahoru Odpovědět 28.11.2013 13:04
Avatar
Kit
Redaktor
Avatar
Odpovídá na mkub
Kit:

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ší.

Nahoru Odpovědět 28.11.2013 13:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na mkub
Kit:

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;
Editováno 28.11.2013 13:20
Nahoru Odpovědět 28.11.2013 13:19
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na Kit
Inoue Yūki:

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.

Nahoru Odpovědět 28.11.2013 13:35
Avatar
Kit
Redaktor
Avatar
Odpovídá na Inoue Yūki
Kit:

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.

Nahoru Odpovědět 28.11.2013 13:51
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
mkub
Redaktor
Avatar
Odpovídá na Kit
mkub:

myslim, ze tvoj sposob je aj prehladnejsi a nedochadza tu k tvorbe tzv. gulasu z kodu...

 
Nahoru Odpovědět 28.11.2013 14:02
Avatar
Kit
Redaktor
Avatar
Odpovídá na mkub
Kit:

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í.

Nahoru Odpovědět 28.11.2013 14:27
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na Kit
Inoue Yūki:

Mno nejlepší je už mít hotový systém, ale jinak je samozřejmě tenhle přístup také dobrý.

Nahoru Odpovědět 28.11.2013 15:24
Avatar
Kit
Redaktor
Avatar
Odpovídá na Inoue Yūki
Kit:

PHP má hotový systém, dokonce jich má několik. Stačí si některý z nich vybrat a použít.

Nahoru Odpovědět  +1 28.11.2013 15:27
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Salieri
Člen
Avatar
Salieri:

Pár změn jsem provedl, zjistil jsem,že je to uplně jedno kdy ten php kod je.....

Nahoru Odpovědět 29.11.2013 12:43
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

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.

Nahoru Odpovědět 29.11.2013 13:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Salieri
Člen
Avatar
Salieri:

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?

Nahoru Odpovědět 29.11.2013 16:35
Hlavní zlo? **Školství a Matematika**!
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 49 zpráv z 49.