Problema conectare la baza de date
Moderatori: Zamolxe, Moderatori
- cristivstan
- PHPRomania Supporter
- Mesaje: 9
- Membru din: Joi Noi 17, 2016 6:40 pm
Problema conectare la baza de date
Salut! Am creat o baza de date in mysql (am folosit easyphp) si vreau sa adaug informatii intr-o tabela folosind un form html si php.
Am creat doua fisiere:
phpinfo.php - are urmatorul cod:
<html>
<head>
</head>
<body>
<form action="adaugare_clienti.php" method="post" />
Id: <input type="text" name="id" />
<br/>
Nume: <input type="text" name="nume" />
<br/>
Prenume: <input type="text" name="prenume" />
<br /><br/>
<input type="submit" value="Adaugare!">
</form>
</body>
</html>
adaugare_clienti.php
<html>
<head>
</head>
<body>
<?php
$servername='127.0.0.1';
$dbname='mydb';
$username='root';
$password='';
$conn=mysqli_connect($servername, $dbname, $username, $password);
if($conn)
{
echo "Conectare reușită";
}
else
{
echo "Conectare nereușită";
}
if (!mysqli_select_db($conn, 'mydb'))
{
echo "Nicio baza de date selectata";
}
$ID = $_POST['id'];
$Nume = $_POST['nume'];
$Prenume = $_POST['prenume'];
$sql = "INSERT INTO test (id, nume, prenume) VALUES ('$ID', '$Nume', '$Prenume)";
mysqli_query($sql);
if (!mysqli_query($sql))
{
echo "Datele nu au fost adaugate";
}
else
{
echo "Datele au fost adaugate";
}
mysql_close();
?>
</body>
</html>
Tabela in cauza este:
Dupa cer introduc datele in campuri si dau click pe "Adauga", imi apare asta:
Imi poate spune cineva ce am gresit sau ce am omis?
Am creat doua fisiere:
phpinfo.php - are urmatorul cod:
<html>
<head>
</head>
<body>
<form action="adaugare_clienti.php" method="post" />
Id: <input type="text" name="id" />
<br/>
Nume: <input type="text" name="nume" />
<br/>
Prenume: <input type="text" name="prenume" />
<br /><br/>
<input type="submit" value="Adaugare!">
</form>
</body>
</html>
adaugare_clienti.php
<html>
<head>
</head>
<body>
<?php
$servername='127.0.0.1';
$dbname='mydb';
$username='root';
$password='';
$conn=mysqli_connect($servername, $dbname, $username, $password);
if($conn)
{
echo "Conectare reușită";
}
else
{
echo "Conectare nereușită";
}
if (!mysqli_select_db($conn, 'mydb'))
{
echo "Nicio baza de date selectata";
}
$ID = $_POST['id'];
$Nume = $_POST['nume'];
$Prenume = $_POST['prenume'];
$sql = "INSERT INTO test (id, nume, prenume) VALUES ('$ID', '$Nume', '$Prenume)";
mysqli_query($sql);
if (!mysqli_query($sql))
{
echo "Datele nu au fost adaugate";
}
else
{
echo "Datele au fost adaugate";
}
mysql_close();
?>
</body>
</html>
Tabela in cauza este:
Dupa cer introduc datele in campuri si dau click pe "Adauga", imi apare asta:
Imi poate spune cineva ce am gresit sau ce am omis?
Ofer servicii de administrare si creare site-uri si scriu despre istoria fotbalului si statistici pe 90deminute.ro
Re: Problema conectare la baza de date
Ai incurcat parametrii functiei mysqli_connect(), trebuie sa ai ceva de genul mysqli_connect(hostname, username, password, dbname);
Apoi, nu mai este necesar sa folosesti mysqli_select_db($conn, 'mydb')) deoarece atunci cand te conectezi, selectezi si baza de date.
Daca conectarea la baza de date nu a reusit, vrei sa opresti definitiv executia scriptului.
Functia die() opreste executia scriptului.
Mai departe, trebuie sa faci "escape" la datele primite deoarece pot contine caractere care pot crea probleme de securitate.Apropo, nu ai nevoie si de campul pentru ID, cand introduci date in baza de date, mai precis in acel tabel, daca este bine configurat, acel ID este adaugat automat, valoare curenta fiind data de valoarea recenta a ID-ului + 1.
Apropo, inainte trebuie sa verifici daca formularul a fost completat, dat fiind faptul ca tu folosesti metoda POST, trebuie sa verifici daca o cerere de tip POST a fost trimisa.
Tine minte, numele variabilelor, numele functiilor trebuie scrise cu litere mici, dar daca numele este format din mai multe cuvinte, fiecare cuvant dupa primul cuvant incepe cu litera mare, de exemplu.
O alta bresa de securitate este data de faptul ca tu introduci acele variabile in propozitia SQL.Nu este bine, cineva poate modifica propozitia SQL datorita modului in care ai scris-o, distrugandu-ti baza de date, Arunca o privire aici --> http://www.w3schools.com/php/php_mysql_ ... ements.asp
Apoi, nu mai este necesar sa folosesti mysqli_select_db($conn, 'mydb')) deoarece atunci cand te conectezi, selectezi si baza de date.
Daca conectarea la baza de date nu a reusit, vrei sa opresti definitiv executia scriptului.
Cod: Selectaţi tot
if(!$conn) {
die("Conexiunea cu baza de date nu a reusit");
}
Functia die() opreste executia scriptului.
Mai departe, trebuie sa faci "escape" la datele primite deoarece pot contine caractere care pot crea probleme de securitate.Apropo, nu ai nevoie si de campul pentru ID, cand introduci date in baza de date, mai precis in acel tabel, daca este bine configurat, acel ID este adaugat automat, valoare curenta fiind data de valoarea recenta a ID-ului + 1.
Cod: Selectaţi tot
$nume = htmlspecialchars($_POST['nume']);
$prenume = htmlspecialchars($_POST['prenume']);
Apropo, inainte trebuie sa verifici daca formularul a fost completat, dat fiind faptul ca tu folosesti metoda POST, trebuie sa verifici daca o cerere de tip POST a fost trimisa.
Cod: Selectaţi tot
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// validezi datele
// introduci datele in baza de date
}
Tine minte, numele variabilelor, numele functiilor trebuie scrise cu litere mici, dar daca numele este format din mai multe cuvinte, fiecare cuvant dupa primul cuvant incepe cu litera mare, de exemplu.
Cod: Selectaţi tot
<?php
$firstName = 'Catalin';
O alta bresa de securitate este data de faptul ca tu introduci acele variabile in propozitia SQL.Nu este bine, cineva poate modifica propozitia SQL datorita modului in care ai scris-o, distrugandu-ti baza de date, Arunca o privire aici --> http://www.w3schools.com/php/php_mysql_ ... ements.asp
Mobila la comanda http://mobilacupersonalitate.ro
- cristivstan
- PHPRomania Supporter
- Mesaje: 9
- Membru din: Joi Noi 17, 2016 6:40 pm
Re: Problema conectare la baza de date
takedown scrie:Apropo, inainte trebuie sa verifici daca formularul a fost completat, dat fiind faptul ca tu folosesti metoda POST, trebuie sa verifici daca o cerere de tip POST a fost trimisa.Cod: Selectaţi tot
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// validezi datele
// introduci datele in baza de date
}
Imi poti arata cum fac aici? tot nu imi introduce datele in tabela.
Ofer servicii de administrare si creare site-uri si scriu despre istoria fotbalului si statistici pe 90deminute.ro
-
- Senior Member
- Mesaje: 1264
- Membru din: Mar Iun 22, 2010 3:17 pm
Re: Problema conectare la baza de date
takedown scrie:Mai departe, trebuie sa faci "escape" la datele primite deoarece pot contine caractere care pot crea probleme de securitate.Apropo, nu ai nevoie si de campul pentru ID, cand introduci date in baza de date, mai precis in acel tabel, daca este bine configurat, acel ID este adaugat automat, valoare curenta fiind data de valoarea recenta a ID-ului + 1.Cod: Selectaţi tot
$nume = htmlspecialchars($_POST['nume']);
$prenume = htmlspecialchars($_POST['prenume']);
Nu are rost sa faci asta daca deja aplici prepared statements, ceea ce deja ai sugerat corect. Plus ca htmlspecialchars() nu este o functie de securizare a datelor ce urmeaza sa fie trimise unui DB. Introduci datele asa cum le-a dat utilizatorul, si le faci escape cand printezi, nu cand le stochezi in DB.
takedown scrie:Apropo, inainte trebuie sa verifici daca formularul a fost completat, dat fiind faptul ca tu folosesti metoda POST, trebuie sa verifici daca o cerere de tip POST a fost trimisa.Cod: Selectaţi tot
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
Nu prea vad metoda asta sa fie folosita. Vad mai degraba !empty($_POST).
takedown scrie:Tine minte, numele variabilelor, numele functiilor trebuie scrise cu litere mici, dar daca numele este format din mai multe cuvinte, fiecare cuvant dupa primul cuvant incepe cu litera mare, de exemplu.
Asta-i doar o conventie. Nu trebuie sa faca ce spui tu. O faci sa sune ca PHP-ul va da eroare daca n-o face. Ce - $nume_var n-ai vazut pana acu?
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/
Re: Problema conectare la baza de date
Arunca o privire peste ceea ce ti-am facut mai jos, presupun ca esti deabia la inceput, poate te ajuta.
init.php
index.php
init.php
Cod: Selectaţi tot
<?php
/**
* In acest fisier vom avea tot ceea ce avem nevoie ca aplicatia noastra sa functioneaze
* Includem acest fisier oriunde avem nevoie.
*/
// pornim sistemul de sesiuni
session_start();
// stocam datele de conectare la baza de date sub forma de constante ( valori care nu se schimb )
// folosind functia define(nume, valoare) vom crea aceste constante
// prin conventie, numele constantelor trebuie scrise cu majuscule
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_NAME', 'mydb');
// ne conectam la baza de date
$db = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
// daca conexiunea nu functioneaza
if (!$db) {
// oprim executia scriptului si afisam un mesaj simplu
die('Conexiunea cu baza de date nu functioneaza.');
}
index.php
Cod: Selectaţi tot
<?php
// includem fisierul de initializare a aplicatiei
require 'init.php';
// verificam daca o cerere HTTP folosnd metoda POST a fost trimisa
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// validam datele, daca ambele sau unul dinte campuri nu a fost completat
if (empty($_POST['nume']) || empty($_POST['prenume'])) {
// stocam eroarea de validare intr-o sesiune
$_SESSION['message'] = 'Ambele campuri trebuie completate';
// facem redirect catre acelasi fisier, vrem sa afisam eroarea
header('Location: index.php');
// oprim executia scriptului, nu vrem sa continue
exit;
}
// salvam si prelucram datele trimise
// functia trim() elemina spatiile albe ( whitespaces ), de exemulu "Catalin " => "Catalin"
// functia mysqli_real_escape_string() este folosita pentru a evita SQL Injection ( o bresa de securitate )
$nume = mysqli_real_escape_string($db, trim($_POST['nume']));
$prenume = mysqli_real_escape_string($db, trim($_POST['prenume']));
// executam propozitia SQL
$query = mysqli_query($db, "INSERT INTO users (nume, prenume) VALUES ('$nume', '$prenume')");
// daca ceva nu a mers bine
if (!$query) {
$_SESSION['message'] = 'Datele nu au fost introduse.';
header("Location: index.php");
exit;
}
$_SESSION['message'] = 'Datele au fost introduse.';
header("Location: index.php");
exit;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Tutorial</title>
</head>
<body>
<?php
// daca exista, afisam mesajul de validare
if (isset($_SESSION['message'])) {
echo '<p>' . $_SESSION['message'] . '</p>';
}
?>
<form action="" method="POST">
<p>
Nume: <input type="text" name="nume">
</p>
<p>
Prenume: <input type="text" name="prenume">
</p>
<button type="submit">Adauga</button>
</form>
</body>
</html>
<?php
// stergem sesiunea cu mesajul de validare
if (isset($_SESSION['message'])) {
unset($_SESSION['message']);
}
?>
Mobila la comanda http://mobilacupersonalitate.ro
- cristivstan
- PHPRomania Supporter
- Mesaje: 9
- Membru din: Joi Noi 17, 2016 6:40 pm
Re: Problema conectare la baza de date
@takedown: Am reusit sa adaug in baza de date. Merci frumos!
Ofer servicii de administrare si creare site-uri si scriu despre istoria fotbalului si statistici pe 90deminute.ro
Re: Problema conectare la baza de date
Super, sa te uiti si peste ce ti-am dat eu, te rog.
Mobila la comanda http://mobilacupersonalitate.ro
- cristivstan
- PHPRomania Supporter
- Mesaje: 9
- Membru din: Joi Noi 17, 2016 6:40 pm
Re: Problema conectare la baza de date
Da, m-am uitat. Informatiile tale m-au ajutat.
Ofer servicii de administrare si creare site-uri si scriu despre istoria fotbalului si statistici pe 90deminute.ro
-
- Senior Member
- Mesaje: 1264
- Membru din: Mar Iun 22, 2010 3:17 pm
Re: Problema conectare la baza de date
Ma bag din nou in seama, dar tre sa va reamintesc ca mysqli_real_escape_string() nu este recomandata pt evitarea SQL injection. Intotdeauna prepared statements.
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/
Re: Problema conectare la baza de date
Da, nu este cea mai "buna" solutie, dar presupun ca este la inceput, asa ca nu am vrut sa complic lucrurile cu OOP, important este sa inteleaga despre ce-i vorba.Evident, se pot folosi prepared statements folosind stilul procedural, dar nu cred ca este necesar, dat fiind faptul ca, ma repet, probabil el este la inceput...
Mobila la comanda http://mobilacupersonalitate.ro
-
- Senior Member
- Mesaje: 1264
- Membru din: Mar Iun 22, 2010 3:17 pm
Re: Problema conectare la baza de date
Eu as spune ca este cu atat mai important sa invete bine din prima, tocmai fiindca este la inceput. Acu i-a mers cu functia aia si nu cred c-o va schimba prea curand.
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/
Re: Problema conectare la baza de date
Ai dreptate, dar i-am sugerat prepared statements de la bun inceput.
Las mai jos un link catre un curs pe YT ce ofera o introducere buna in lucru cu PDO si prepared statements.
https://www.youtube.com/watch?v=QtCdk45 ... KtWVjA46HC
De asemenea, mai ales un link tot catre un curs pe YT in legatura cu securizarea aplicatiilor in PHP.
https://www.youtube.com/watch?v=a_kTH5y ... hCbCwKWF_N
Las mai jos un link catre un curs pe YT ce ofera o introducere buna in lucru cu PDO si prepared statements.
https://www.youtube.com/watch?v=QtCdk45 ... KtWVjA46HC
De asemenea, mai ales un link tot catre un curs pe YT in legatura cu securizarea aplicatiilor in PHP.
https://www.youtube.com/watch?v=a_kTH5y ... hCbCwKWF_N
Mobila la comanda http://mobilacupersonalitate.ro
Cine este conectat
Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 26 vizitatori