Diskuze: PHP+MsQL Jedna chyba v kódu server.php Poradí někdo? Díky!
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.


Tomáš Novotný:19.7.2019 6:34
Ahoj,
problém bude na konci řádku.. ";" ukončuje příkaz tj. array_push,
složené závorky ohraničují blok většinou více příkazů.. ty jsi
ukončil blok příkazů aniž bys ukončil array_push
if(empty($username)) {array_push ($errors, "Zadejte uživatelské jméno / Username is required");}
Tano7:20.7.2019 22:38
Ahoj, vidím, že jsi profík.
Díky za radu, bylo to v závorkách, misto ) hranata ]
správně je:
"if(empty($username)) [array_push ($errors, "Zadejte uživatelské jméno /
Username is required")];
Odladil jsem ostatni errory a zbývá poslední:
Parse error: syntax error,
unexpected end of file in C:\wamp64\www\registrace\server.php on line 85
Zkoušel jsem to v poslednim radku ukončit vším možným ) } ] ?>
a nic nefunguje
Prosím o pomoc... díky mooc
<?php
session_start();
//inicializace proměnných
$username = "";
$email = "";
$errors = array(); // error v poli
// spojeni s databazi
$db = mysqli_connect('localhost', 'root', '', 'practice') or die("Nelze se připojit k databázi / Could not connect to database");
//registrace uzivatele
$username = mysqli_real_escape_string($db, $_POST['username']);
$email = mysqli_real_escape_string($db, $_POST['email']);
$password1 = mysqli_real_escape_string($db, $_POST['password1']);
$password2 = mysqli_real_escape_string($db, $_POST['password2']);
//validace formuláře, overeni vstupnich udaju
//jestlize promenna "username" je prazdna(empty), uzivatel nezadal jmeno, vypis
promennou $errors s textem "Zadejte uživatelské jméno/ Username is
required"
if(empty($username)) [array_push ($errors, "Zadejte uživatelské jméno /
Username is required")];
if(empty($email)) [array_push($errors, "Zadejte email / Email is
required")];
if(empty($password1)) [array_push($errors, "Zadejte heslo / Password is
required")];
if($password1 != $password2) [array_push($errors, "Hesla se neshodují /
Passwords do not match")];
// zkontrolujte existujícího uživatele se stejným uzivatelem, jestli se
shoduji
$user_check_query = "SELECT * FROM user WHERE username= '$username' OR email =
'$email' LIMIT 1"; //$user_check_query kontrola pripojeni k databazi
$result = mysqli_query($db, $user_check_query); //mysqli_fetch_assoc ()
vrátí řádky z počtu záznamů dostupných v databázi jako asociativní
pole
$user = mysqli_fetch_assoc($result);
if($user){ //jestlize v jmeno uzivatele je jiz v databazi, === pokud je
rovno, vypis hlasku "Uživatelské jméno již existuje / Username already
exists"
if($user['username'] === $username){
array_push($errors, "Uživatelské jméno již existuje / Username already
exists");
}
if($user['email'] === $email){
array_push($errors, "Toto e-mailové ID již existuje / This email id already
exists registered username");
}
}
//Zaregistrujte uživatele bez chyb / Register the userif no errors
if(count($errors) == 0){
$password = md5($password1); //toto heslo se zašifruje, vlozi do tabulky "user"
hodnoty pro username, email, passport
print $password; //query je dotaz
$query = "INSERT INTO user (username, email, password)";
VALUES ('$username', '$email', '$password');
mysqli_query($db, $query);
$_SESSION['username'] = $username; //Session (relace)představuje permanentní
síťové spojení mezi klientem a serverem, zahrnující výměnu paketů, do
Cookies se ukladaji
$_SESSION['success'] = "Nyní jste přihlášen / You are now logged in";
header('location: index.php'); //header - Odeslání nezpracované HTTP
hlavičky. napr. header ( "Location: http://www.example.com/" )
}
//Přrihlášení uživatele / Login user
if(isset($_POST['login_user'])){
$username = mysqli_real_escape_string($db, $_POST)['username'];
$password = mysqli_real_escape_string($db, $_POST)['password'];
if(empty($username)) [array_push($errors, "Je vyžadováno uživatelské jméno / Username is required")];
if(empty($password)) [array_push($errors, "Je vyžadováno heslo /
Password is required")];
}
if(count($errors) == 0) { //count - Spočítá prvky v poli, případně v objektu
$password = md5($password); //md5 - zasifruj heslo
$query = "SELECT * FROM user WHERE username = '$username' AND password =
'$password'"; //dotaz> vyber vsechno z tabulky z nazvem user kdyz
username-jmeno uzivatele je shodne z jeho heslem
$results = mysqli_query($db, $query); //results - vysledek
if (mysqli_num_rows($results)) {
$_SESSION['username'] = $username;
$_SESSION['success'] = "Jste úpěšně přihlášen / Logged in
successfully";
header('location: index.php');
} else[(array_push($errors,
"Nesprávná kombinace uživatelského jména a hesla. Prosím zkuste to
znovu.
/ Wrong username/password combination. Please try again."))];
radek 85
Neaktivní uživatel:20.7.2019 22:58
Ahoj, příště odesílej kód jako kód (když dáš </>). Dále jsem
si všiml že hesla hashuješ pomocí funkce MD5, což je dost nebezpečná
funkce a neměla by se používat pro hesla. Pro hesla se používá např.
bcrypt, který je implementovaný ve funkci password_hash a ověřuje se pomocí
password_verify.
https://www.php.net/…ord-hash.php
https://www.php.net/…d-verify.php
Matúš Olejník:20.7.2019 23:08
Ahoj, nerobím v php, ale ako si prišiel na to, že tam má byť hranatá
zátvorka a ako si prišiel na to, že je to správne?
Zkus takhle.
<?php
session_start();
//inicializace proměnných
$username = "";
$email = "";
$errors = array(); // error v poli
// spojeni s databazi
$db = mysqli_connect('localhost', 'root', '', 'practice') or die("Nelze se připojit k databázi / Could not connect to database");
//registrace uzivatele
$username = mysqli_real_escape_string($db, $_POST['username']);
$email = mysqli_real_escape_string($db, $_POST['email']);
$password1 = mysqli_real_escape_string($db, $_POST['password1']);
$password2 = mysqli_real_escape_string($db, $_POST['password2']);
//validace formuláře, overeni vstupnich udaju
//jestlize promenna "username" je prazdna(empty), uzivatel nezadal jmeno, vypis promennou $errors s textem "Zadejte uživatelské jméno/ Username is required"
if (empty($username))
array_push($errors, "Zadejte uživatelské jméno / Username is required");
if (empty($email))
array_push($errors, "Zadejte email / Email is required");
if (empty($password1))
array_push($errors, "Zadejte heslo / Password is required");
if ($password1 != $password2)
array_push($errors, "Hesla se neshodují / Passwords do not match");
// zkontrolujte existujícího uživatele se stejným uzivatelem, jestli se shoduji
$user_check_query = "SELECT * FROM user WHERE username= '$username' OR email = '$email' LIMIT 1"; //$user_check_query kontrola pripojeni k databazi
$result = mysqli_query($db, $user_check_query); //mysqli_fetch_assoc () vrátí řádky z počtu záznamů dostupných v databázi jako asociativní pole
$user = mysqli_fetch_assoc($result);
if ($user) { //jestlize v jmeno uzivatele je jiz v databazi, === pokud je rovno, vypis hlasku "Uživatelské jméno již existuje / Username already exists"
if ($user['username'] === $username) {
array_push($errors, "Uživatelské jméno již existuje / Username already exists");
}
if ($user['email'] === $email) {
array_push($errors, "Toto e-mailové ID již existuje / This email id already exists registered username");
}
}
//Zaregistrujte uživatele bez chyb / Register the userif no errors
if (count($errors) == 0) {
$password = md5($password1); //toto heslo se zašifruje, vlozi do tabulky "user" hodnoty pro username, email, passport
print $password; //query je dotaz
$query = "INSERT INTO user (username, email, password)";
VALUES('$username', '$email', '$password');
mysqli_query($db, $query);
$_SESSION['username'] = $username; //Session (relace)představuje permanentní síťové spojení mezi klientem a serverem, zahrnující výměnu paketů, do Cookies se ukladaji
$_SESSION['success'] = "Nyní jste přihlášen / You are now logged in";
header('location: index.php'); //header - Odeslání nezpracované HTTP hlavičky. napr. header ( "Location: http://www.example.com/" )
}
//Přrihlášení uživatele / Login user
if (isset($_POST['login_user'])) {
$username = mysqli_real_escape_string($db, $_POST['username']);
$password = mysqli_real_escape_string($db, $_POST['password']);
if (empty($username))
array_push($errors, "Je vyžadováno uživatelské jméno / Username is required");
if (empty($password))
array_push($errors, "Je vyžadováno heslo / Password is required");
}
if (count($errors) == 0) { //count - Spočítá prvky v poli, případně v objektu
$password = md5($password); //md5 - zasifruj heslo
$query = "SELECT * FROM user WHERE username = '$username' AND password = '$password'"; //dotaz> vyber vsechno z tabulky z nazvem user kdyz username-jmeno uzivatele je shodne z jeho heslem
$results = mysqli_query($db, $query); //results - vysledek
if (mysqli_num_rows($results)) {
$_SESSION['username'] = $username;
$_SESSION['success'] = "Jste úpěšně přihlášen / Logged in successfully";
header('location: index.php');
} else {
array_push($errors, "Nesprávná kombinace uživatelského jména a hesla. Prosím zkuste to znovu.
/ Wrong username/password combination. Please try again.");
}
}
Díky moc všem za zkušené rady
Zkoušel jsem tyto možnosti a výsledek:
Správně:
if(empty($username)) [array_push ($errors, "Zadejte uživatelské jméno /
Username is required")];
if(empty($username)) array_push ($errors, "Zadejte uživatelské jméno /
Username is required");
Špatně:
if(empty($username)) {array_push ($errors, "Zadejte uživatelské jméno /
Username is required")};
**
Díky Matěj**i za password_hash, použil jsem
$password = BCRYPT($password1);
$password = BCRYPT($password);
Ještě verify musím nějak přidat.
Díky Pavle, použil jsem Tvůj kód a uzavřelo se to, už
né chyba na posledním řádku 85.
server.php hlásí v něm chyby na řádcích 10,11,12,13
<?php
session_start();
//inicializace proměnných
$username = "";
$email = "";
$errors = array(); // error v poli
// spojeni s databazi
$db = mysqli_connect('localhost', 'root', '', 'practice') or die("Nelze se připojit k databázi / Could not connect to database");
//registrace uzivatele
$username = mysqli_real_escape_string($db, $_POST['username']);
$email = mysqli_real_escape_string($db, $_POST['email']);
$password_1 = mysqli_real_escape_string($db, $_POST['password_1']);
$password_2 = mysqli_real_escape_string($db, $_POST['password_2']);
//validace formuláře, overeni vstupnich udaju
//jestlize promenna "username" je prazdna(empty), uzivatel nezadal jmeno, vypis promennou $errors s textem "Zadejte uživatelské jméno/ Username is required"
if(empty($username)) array_push ($errors, "Zadejte uživatelské jméno / Username is required");
if(empty($email))
array_push($errors, "Zadejte email / Email is required");
if(empty($password_1))
array_push($errors, "Zadejte heslo / Password is required");
if($password_1 != $password_2)
array_push($errors, "Hesla se neshodují / Passwords do not match");
// zkontrolujte existujícího uživatele se stejným uzivatelem, jestli se shoduji
$user_check_query = "SELECT * FROM user WHERE username= '$username' OR email = '$email' LIMIT 1"; //$user_check_query kontrola pripojeni k databazi
$result = mysqli_query($db, $user_check_query); //mysqli_fetch_assoc () vrátí řádky z počtu záznamů dostupných v databázi jako asociativní pole
$user = mysqli_fetch_assoc($result);
if($user){ //jestlize v jmeno uzivatele je jiz v databazi, === pokud je rovno, vypis hlasku "Uživatelské jméno již existuje / Username already exists"
if($user['username'] === $username){
array_push($errors, "Uživatelské jméno již existuje / Username already exists");
}
if($user['email'] === $email){
array_push($errors, "Toto e-mailové ID již existuje / This email id already exists registered username");
}
}
//Zaregistrujte uživatele bez chyb / Register the userif no errors
if(count($errors) == 0){
$password = BCRYPT($password_1); //toto heslo se zašifruje, vlozi do tabulky "user" hodnoty pro username, email, passport
print $password; //query je dotaz
$query = "INSERT INTO user (username, email, password)";
VALUES ('$username', '$email', '$password');
mysqli_query($db, $query);
$_SESSION['username'] = $username; //Session (relace)představuje permanentní síťové spojení mezi klientem a serverem, zahrnující výměnu paketů, do Cookies se ukladaji
$_SESSION['success'] = "Nyní jste přihlášen / You are now logged in";
header('location: index.php'); //header - Odeslání nezpracované HTTP hlavičky. napr. header ( "Location: www.neco_cz" )
}
//Přrihlášení uživatele / Login user
if (isset($_POST['login_user'])) {
$username = mysqli_real_escape_string($db, $_POST)['username'];
$password = mysqli_real_escape_string($db, $_POST)['password'];
if(empty($username))
array_push($errors, "Je vyžadováno uživatelské jméno / Username is required");
if(empty($password))
array_push($errors, "Je vyžadováno heslo / Password is required");
}
if(count($errors) == 0) { //count - Spočítá prvky v poli, případně v objektu
$password = BCRYPT($password); // zasifruj heslo
$query = "SELECT * FROM user WHERE username = '$username' AND password = '$password'"; //dotaz> vyber vsechno z tabulky z nazvem user kdyz username-jmeno uzivatele je shodne z jeho heslem
$results = mysqli_query($db, $query); //results - vysledek
if (mysqli_num_rows($results)) {
$_SESSION['username'] = $username;
$_SESSION['success'] = "Jste úpěšně přihlášen / Logged in successfully";
header('location: index.php');
} else {
array_push($errors, "Nesprávná kombinace uživatelského jména a hesla. Prosím zkuste to znovu.
/ Wrong username/password combination. Please try again.");
}
}
Tano7:21.7.2019 2:57
Pavle, posílám ten login.php, dikes.
<!DOCTYPE html>
<!--
Created by PhpStorm
User: Vít Šoukal
Date: 18.07.2019
-->
<html>
<head>
<meta charset="UTF-8">
<title>Login UK</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div class="container">
<div class="header">
<picture>
<img src="UK_logo.png" alt="logo UK">
</picture>
<p>
<h2>Přihlásit se / Log in</h2>
</p>
</div>
<form action="login.php" method="POST">
<div>
<label for="username" >Jméno / Username </label>
<input type="text" name="username" required>
</div>
<p>
<div>
<label for="password" >Heslo / Password </label>
<input type="password" name="password1" required>
</div>
</p>
<p>
<button type="submit" name="login_user"> Přihlásit se / Log in </button>
<p> Nejste uživatelem? / Not a user? <a href="registration.php">
<p> <b> Registrujte se zde / Register Here </b></a>
</p>
<div>
═════════════════════════════════ <p>
<label> Naprogramoval v PHP, MySQL: Vít Šoukal / 2019 <p>
[email protected]
</label>
</p>
</div>
</form>
</body>
</html>
Jaroslav Smrž:21.7.2019 9:51
Na první pohled chybu nevidím, ale neuvažuješ spíš o přepsání aplikace na ovladač PDO? Odpadlo by ti spousty problémů s ošetřením. Mysql_li se dnes již nepoužívá. Přikládám kód třídy connection pro připojení k databázi a názornou ukázku jak připojení volat.
<?php
Class Connection
{
// Nastaveni PDO a prihlasovaci udaje k DB
private $server = "mysql:host=localhost;dbname=nazevDB";
private $username = "root";
private $password = "";
private $options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,);
protected $conn;
//Otevreni spojeni
public function open()
{
try
{
$this->conn = new PDO($this->server, $this->username, $this->password, $this->options);
return $this->conn;
}
catch (PDOException $e)
{
echo "Ooops... Spojení nelze navázat: " . $e->getMessage();
}
}
//Ukonceni spojeni
public function close()
{
$this->conn = null;
}
}
Ukázka volání připojení:
<?php
include_once('cesta/connection.php');
$database = new Connection();
$db = $database->open();
try
{
$sql = "SELECT * FROM tabulka WHERE podminka='podminka'";
foreach ($db->query($sql) as $row)
{
?>
<table>
<tr>
<td><?php echo $row['napr_uzivatel_jmeno']; ?></td>
<td><?php echo $row['napr_uzivatel_role']; ?></td>
</tr>
</table>
<?php
}
}
catch (PDOException $e)
{
echo "Oooops! Našel se problém s připojením k databázi: " . $e->getMessage();
}
$database->close();
?>
Tano7:21.7.2019 19:59
Díky, to jsem nevěděl, jsem začátečník, i když kdysi jsem to
zkoušel,ale chce to pravidelně studovat.Už jsem se do toho obul naplno.
vytvořil jsem tedy server.php a dal cestu k databazi "practice"
<?php
Class Connection //ulozit jako server.php
{
// Nastaveni PDO a prihlasovaci udaje k DB PHP Data Objects = je to objektové rozhraní databází pro PHP
private $server = "mysql:host=localhost;dbname=practice"; //nazev me databaze je "practice"
private $username = "root";
private $password = "";
private $options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,);
protected $conn;
//Otevreni spojeni
public function open()
{
try
{
$this->conn = new PDO($this->server, $this->username, $this->password, $this->options);
return $this->conn;
}
catch (PDOException $e)
{
echo "Ooops... Spojení nelze navázat: " . $e->getMessage();
}
}
//Ukonceni spojeni
public function close()
{
$this->conn = null;
}
}
a do registration.php To je ma cesta "localhost/registrace/server.php" Jedna tabulka "user" se sloupci: id, username, email, password, ale v kodu PHPStorm hlasi chybu řádek 8 "$database = practice Connection(); "
Taky nevim, jak oddělit php od HTML a provázat vzájemě soubor registration.php
Prosím o pomoc, díky
<?php
include_once('localhost/registrace/server.php'); //include_once('localhost/registrace/server.php');
//to je ma cesta localhost/registrace/server.php, kde volam DB SQL pres PDO
//include_once('cesta/connection.php');
//ulozit jako registration.php
$database = practice Connection(); //nazev databaze je "practice" a tabulky "user"
$db = $database->open();
try
{
//$sql = "SELECT * FROM tabulka WHERE podminka='podminka'";
$sql = "SELECT * FROM user WHERE username='username'";
foreach ($db->query($sql) as $row)
{
?>
<table>
<tr>
<td><?php echo $row['user']; ?></td> //$row['napr_uzivatel_jmeno']
<td><?php echo $row['email']; ?></td>
</tr>
</table>
<?php
}
}
catch (PDOException $e)
{
echo "Oooops! Našel se problém s připojením k databázi: " . $e->getMessage();
}
$database->close();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Registrace</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div class="container">
<div style="width: 40%; margin: 20 auto;">
<!-- <div class="header"> -->
<picture>
<img src="UK_logo.png" width = "" height = "" alt="logo UK">
</picture>
<p>
<h2>R E G I S T R A C E</h2>
</p>
<form action="registration.php" method="post">
<?php
include('errors.php')
?>
<div>
<label for="username" >Jméno / Username </label>
<input type="text" name="username" required> <!-- required = povinny udaj-->
</div>
<div>
<p>
<label for="email" >E-mail </label>
<input type="email" name="email" required>
</p>
</div>
<div>
<p>
<label for="password" >Heslo / Password </label>
<input type="password" name="password1" required>
</p>
</div>
<div>
<p>
<label for="password" >Potvrď heslo / Confirm Password </label>
<input type="password" name="password2" required>
</p>
</div>
<div>
<p>
<button type="submit" name="reg_user"> Odeslat / Send </button>
</p>
</div>
<div>
<p>
Jste již uživatelem? / Already a user? <a href="login.php">
</p>
</div>
<a> <b> Přihlásit se / Log in </b></a>
</form>
</body>
</html>
Jaroslav Smrž:21.7.2019 20:42
Jéééé, všechno špatně.
- Kód pro volání třídy Connection se vkládá (v tvém případě) až do těla html tam, kde to potřebuješ. Jako názornou ukázku tam máš tu html tabulku
- Cestu k souboru Connection.php zapisuj na localhostu dle složek s tím, že kořenová je ta, ve které máš index.php (např. App/Assets/connection.php)
- Dále máš chybu v syntaxi!!!** $database = practice Connection();** , musí být vytvoření instance $database = new Connection();
V tvém případě registračního formuláře tam stejně nic volat nemusíš. Na to ti stačí jen html, form action a method. Až v obslužném souboru budeš potřebovat pracovat s databází. Je vidět, že se v tom vůbec nevyznáš, měl bys začít od úplných základů, ale stejně ti sem dám příklad:
<?php
include_once('connection.php');
if (isset($_POST['uloz'])) {
$database = new Connection();
$db = $database->open();
try {
//příprava dotazu
$stmt = $db->prepare("INSERT INTO tabulka (jmeno) VALUES (:jmeno)");
//provedení dotazu s hláškou o úspěchu či neúspěchu
$_SESSION['message'] = ( $stmt->execute(array(':jmeno' => $_POST['jmeno'])) ) ? 'Záznam úspěšně přidán' : 'Něco je špatně, záznam nelze přidat';
} catch (PDOException $e) {
$_SESSION['message'] = $e->getMessage();
}
$database->close();
} else {
$_SESSION['message'] = 'Nejprve vyplňte formulář';
}
header('location: index.php');
?>
+20 Zkušeností
+2,50 Kč

Jinak zde krásně vidíš výhody PDO ovladače a jeho metod. V dotazu se nemusíš o nic starat díky metodě prepare. PDO si hodnoty samo ošetří a dosadí. Další metoda execute provede samotný výkon. PDOException je samotná vyjímka a getMessage ji vypíše (předá).
Jaroslav Smrž:22.7.2019 6:28
Namáš za co. Jestli ti ještě mohu poradit, tak asi začni u
procedurálního programování (html i php dohromady v jednom souboru). Je tu
kurz na tvorbu jednoduchého redakčního systému v PHP . Tam se celkem
dobře naučíš práci s databází za použití wrapperu. Příklad, který
jsem ti sem dával je objektový a na objektové programování se vrhni, až
plně porozumíš základním principům, ať v tom nemáš zmatek. Na
začátcích je těch informací vždycky hodně. Přeji mnoho zdaru a
trpělivosti
Samozrejme souhlas, kod obalovat do funkci a ne psat primo radky. Ale uz bych
to zrovna tridil do vetsich soucasti class, OOP.
Jak tam pouzivas to echo, tak to preci muzes ulozit do promene a to echo pouzit
az v casti html.
foreach ($db->query($sql) as $row)
{
?>
<table>
<tr>
<td><?php echo $row['user']; ?></td> //$row['napr_uzivatel_jmeno']
<td><?php echo $row['email']; ?></td>
</tr>
</table>
<?php
}
----
$table1 = '';
foreach ($db->query($sql) as $row)
{
$table1 .= '
<table> --- a taky by mozna bylo fajn, kdby jsi uvnitr cyklu mel jen tagy tr, td, zkoukni si pak html kod, jaky vytvoris a porovnej s jakpsatweb.cz
<tr>
<td>'.$row['user'].'</td> <!--$row['napr_uzivatel_jmeno']-->
<td>'.$row['email'].'</td>
</tr>
</table>
';
}
...<body>...
<?php echo $table1; ?>
Zobrazeno 15 zpráv z 15.