Problema conectare la baza de date

Întrebări legate de conectarea la baze de date MySQL prin intermediul PHP

Moderatori: Zamolxe, Moderatori

cristivstan
PHPRomania Supporter
Mesaje: 6
Membru din: Joi Noi 17, 2016 6:40 pm

Problema conectare la baza de date

Mesajde cristivstan » Mie Ian 18, 2017 12:19 am

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:

Imagine

Dupa cer introduc datele in campuri si dau click pe "Adauga", imi apare asta:

Imagine

Imi poate spune cineva ce am gresit sau ce am omis?



takedown
Average Member
Mesaje: 149
Membru din: Joi Feb 07, 2013 8:50 pm
Contact:

Re: Problema conectare la baza de date

Mesajde takedown » Mie Ian 18, 2017 12:03 pm

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.

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

cristivstan
PHPRomania Supporter
Mesaje: 6
Membru din: Joi Noi 17, 2016 6:40 pm

Re: Problema conectare la baza de date

Mesajde cristivstan » Mie Ian 18, 2017 12:40 pm

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.

nevvermind
Senior Member
Mesaje: 1224
Membru din: Mar Iun 22, 2010 3:17 pm

Re: Problema conectare la baza de date

Mesajde nevvermind » Mie Ian 18, 2017 12:59 pm

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/

takedown
Average Member
Mesaje: 149
Membru din: Joi Feb 07, 2013 8:50 pm
Contact:

Re: Problema conectare la baza de date

Mesajde takedown » Mie Ian 18, 2017 3:36 pm

Arunca o privire peste ceea ce ti-am facut mai jos, presupun ca esti deabia la inceput, poate te ajuta.

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']);
    }
?>

cristivstan
PHPRomania Supporter
Mesaje: 6
Membru din: Joi Noi 17, 2016 6:40 pm

Re: Problema conectare la baza de date

Mesajde cristivstan » Mie Ian 18, 2017 5:41 pm

@takedown: Am reusit sa adaug in baza de date. Merci frumos!

takedown
Average Member
Mesaje: 149
Membru din: Joi Feb 07, 2013 8:50 pm
Contact:

Re: Problema conectare la baza de date

Mesajde takedown » Mie Ian 18, 2017 6:10 pm

Super, sa te uiti si peste ce ti-am dat eu, te rog.

cristivstan
PHPRomania Supporter
Mesaje: 6
Membru din: Joi Noi 17, 2016 6:40 pm

Re: Problema conectare la baza de date

Mesajde cristivstan » Mie Ian 18, 2017 6:31 pm

Da, m-am uitat. Informatiile tale m-au ajutat.

nevvermind
Senior Member
Mesaje: 1224
Membru din: Mar Iun 22, 2010 3:17 pm

Re: Problema conectare la baza de date

Mesajde nevvermind » Mie Ian 18, 2017 7:08 pm

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/

takedown
Average Member
Mesaje: 149
Membru din: Joi Feb 07, 2013 8:50 pm
Contact:

Re: Problema conectare la baza de date

Mesajde takedown » Mie Ian 18, 2017 10:34 pm

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

nevvermind
Senior Member
Mesaje: 1224
Membru din: Mar Iun 22, 2010 3:17 pm

Re: Problema conectare la baza de date

Mesajde nevvermind » Joi Ian 19, 2017 5:11 pm

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/

takedown
Average Member
Mesaje: 149
Membru din: Joi Feb 07, 2013 8:50 pm
Contact:

Re: Problema conectare la baza de date

Mesajde takedown » Joi Ian 19, 2017 10:50 pm

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


Înapoi la “MySQL”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 2 vizitatori