Interacţiunea PHP-MySQL

MySQL – utilizează la realizarea interogărilor standartul SQL (Server Query Language) cu anumite mici modificări. Pentru interactiunea PHP-MySQL sunt utilizate mai multe funcţii. Majoritatea funţiilor returnează un array sau un număr, care reprezintă datele referitor la numărul de coloane, tabele, inregistrări etc. Sau reprezintă un array cu inregistrările dintr-o tabelă sau mai multe tabele, sau numele coloanelor, tabelelor etc.
Pentru a putea realiza cererile MySQL este necesar să stabilim o legatură cu serverul MySQL. Pentru a stabili această legatură trebuie specificaţi 4 parametri strict necesari şi unul secundar :

1. Numele hostului unde este stocată baza de date MySQL.
2. Numele utilizatorului.
3. Parola
4. Numele Bazei de Date necesare.
5. Time zone (secundar)

Interacţiunea PHP-MySQL ar fi bine să o realizăm într-o clasă. Asta ne va permite implementarea interacţiunii PHP-MySQL oriunde unde vom avea nevoie de ea.
În baza acestor 5 parametri se stabileşte legatura cu serverul. Această legatură cu serverul ar fi bine să o realizăm în constructorul clasei. Asta ne va asigura că la utilizarea instanţelor de tip clasă, va fi realizată legatura cu serverul. Aceşti 5 parametri DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_TIME vor fi definiţi ca constante în fişierul de config.

clasa db :

<?php
class db {
  private $connection;
  public function __construct($host = DB_HOST,$user = DB_USER,
            $pass = DB_PASS,$name = DB_NAME,$time_zone = DB_TIME) {
    $this -> connection = mysql_connect($host,$user,$pass) or 
           DIE("Can't connect to host with param : HOST = ".DB_HOST);
    mysql_select_db($name,$this->connection);
    if( mysql_errno( $this->connection ) ) {
      DIE("MySQL Error ".mysql_errno($this->connection).
        ": ".mysql_error($this -> connection).".");
    }
    mysql_query("SET time_zone = '".$time_zone."'");
  }

  public function db_general_query( $sql ) {
    $result = mysql_query($sql,$this->connection);
    if(mysql_errno($this -> connection)){
      DIE("MySQL Error ".mysql_errno($this -> connection).
        ": ".mysql_error($this -> connection)."\n".
        "When executing:\n".$sql."\n");
    }
    return $result;
  }

  public function db_array_result( $sql ) {
    $que = $this->db_general_query($sql);
    if($que){
      $result = mysql_fetch_array($que);
    }
    return $result;
  }

  public function  db_result_num_rows( $sql ) {
    $que = $this -> db_general_query($sql);
    if($que){
      $result = mysql_num_rows($que);
    }else{
      $result = 0;
    }
    return $result;
  }

  public function  db_uniq_result( $sql ) {
    $que = $this -> db_general_query($sql);
    if(mysql_num_rows($que)== 1){
      $result = mysql_fetch_array($que);
    }else{
      $result = array();
    }
    return $result;
  }

  public function db_multiple_result($sql) {
    $result = array();
    $que = $this->db_general_query($sql);
    while($masiv = mysql_fetch_array($que,MYSQL_ASSOC)) {
      $result[] = $masiv;
    }
    return $result;
  }
}
?>

NOTĂ : dacă dorim ca SCRIPTUL sa nu fie vulnerabil la SQL inections trebuie de filtrat datele care se inserează în script ex: $sql = mysql_real_escape_string(stripslashes(trim($sql)));
unde de exemplu $sql = ‘Andrei’. Iar cererea arată aşa $sel = “SELECT * FROM Login = ‘”.$sql.”‘”;. Dacă ar fi $sql = ” don’t exist “; atunci am obţine o eroare la executarea cererii $sel.

Astfel noi am realizat o clasă care ne permite să facem uşor o cerere de la un server MySQL prin intermediul PHP-ului. Pentru funcţionarea acestui cod şi ca un exemplu demonstrativ vom face următoarele operaţii:
1. Vom specifica fişierul de config : config.php.
2. Vom include fişierul de config şi clasa db în fişierul index.php.

Conţinutul fişierului config.php

&lt;?php
define('DB_HOST','localhost');
define('DB_USER','root');
define('DB_PASS','');
define('DB_NAME','test');
define('DB_TIME','+02:00');
?&gt;

Antetul fişierul index.php

&lt;?php
include 'config.php';
include 'db.php';
$sql = new db();
$sel = "SELECT NOW() FROM users";
print_r($sql -&gt; db_multiple_result($sel));
?&gt;

În cazul că nu sa stabilit legătura cu serverul în baza celor 5 parametri se va afişa aşa o eroare:

// În caz că este gresită parola sau hostul
Can't connect to host with param : HOST = localhost, USER = root, PASSWORD = 1
// În caz că userul este greşit
MySQL Error 1044: Access denied for user ''@'localhost' to database 'test'.
//În caz că este greşit numele bazei de date
MySQL Error 1049: Unknown database 'test'.

În cazul cînd legatura se stabileste corect însă sa greşit undeva în cerea MySQL exemple :

// Caz 1
MySQL Error 1146: Table 'test.users' doesn't exist
When executing:
SELECT * FROM users
// Caz 2
MySQL Error 1054: Unknown column 'idusers' in 'where clause'
When executing:
SELECT * FROM users WHERE idusers = 1
// etc

Această clasă este un instrument bun pentru practicarea dezvoltării aplicaţiilor web deoarece arată cu exactitate ce eroare şi unde sa produs această eroare. Cea ce uşurează mult munca unui dezvoltator.
Rezultatele care pot fi obţinute, în urma execuţiei cererilor prin intermediul metodelor acestei clase, în anumite cazuri trebuie prelucrate.

De exemplu avem o tabelă users în baza de date test. Tabela are urmatoarea structură :

CREATE TABLE users (
IdUser int(3) NOT NULL AUTO_INCREMENT,
Login varchar(16),
Email varchar(32),
PRIMARY KEY(IdUser))ENGINE = innoDB
-- inseram ceva date in tabela users
-- script
INSERT INTO `test`.`users` (
`IdUser` ,
`Login` ,
`Email`
)
VALUES (
NULL , 'Sasa', 'sasa@gmail.com'
), (
NULL , 'Ion', 'ion@gmail.com'
);

Iar index.php îl rescriem cu urmatorul cod :

<?php
include 'config.php';
include 'db.php';
$sql = new db();
$sel = "SELECT * FROM users WHERE iduser = 1";
if($sql -> db_result_num_rows($sel) == 1){
  $data = $sql -> db_uniq_result($sel);
}else{
  $data = array();
}
print "Pentru IdUser : ".$data['IdUser']."\n";
print "Login : ".$data['Login']." Email : ".$data['Email'];
?>

Acesta este un exemplu unde rezultatul reprezintă o înscriere din tabelă.
Pentru a citi mai multe inregistrari facem urmatorul exemplu:

<?php
include 'config.php';
include 'db.php';
$sql = new db();
$sel = "SELECT * FROM users";
if($sql -> db_result_num_rows($sel) > 0){
  $date = $sql -> db_multiple_result($sel);
}else{
  $date = array();
}
foreach($date as $key => $value){
  print "------------------------\n";
  print "Pentru IdUser : ".$value['IdUser']."\n";
  print "Login : ".$value['Login']." Email : ".$value['Email'];
}
?>

Acest exemplu ne arată cum am putea citi mai multe înscrieri dintr-o tabelă. În cazul nostru el va citi toate datele din tabelă.
Dacă să facem legatura cu postul anterior, cu titlul postului “Cum să facem un site de la zero în PHP ?”, am putea să unim aceste 2 instrumente şi am putea obţine un mecanizm complex care ne va permite să lucrăm şi cu bazele de date MySQL.
Cum vom uni aceste doua instrumente ?
1. ne ducem în directoriul unde a fost realizat şi stocat proiectul din postul trecut.
2. modificăm config.php, adaugăm între tagurile <?php ?> la început codul :

define('DB_HOST','localhost');
define('DB_USER','root');
define('DB_PASS','');
define('DB_NAME','test');
define('DB_TIME','+02:00');

Adica adăugăm în config şi specificările din configul pentru lucru cu clasa db.
3. la începutul fişierului index.php, index.php al proiectului pentru citirea parţilor dinamice şi statice din postul anterior, după ce se include ‘config.php’ adaugăm un rînd:

include 'system/db.php';

4. În directoriul părinte al proiectului anterior facem directoriul system, şi în el copiem fişierul db.php cu clasa db.
5. sfirşit.

astfel acum noi avem urmatoare structură a proiectului:
index.php
config.php
system
dinamic
template

unde config.php are urmatorul conţinut :

&lt;?php
// data base defines
define('DB_HOST','localhost');
define('DB_USER','root');
define('DB_PASS','');
define('DB_NAME','test');
define('DB_TIME','+02:00');
// constanta pentru resursa de implicita
define('BASE','home.php');
// daca pagina home este mai speciala si necesita un template aparte
// il definim cu BASET;
define('BASET','home.phtml'); // daca este necesar
// template care va fi utiliza in caz general
define('DEF','default.phtml');
// pagina cu erore 404 in caza ca URI este cules cu mina si este cules gresit
define('ERRORT','error.php');
// template pentru pagina cu erore 404
define('ERROR','error.phtml');
// directoriu pentru stocarea templaturilor
define('TEMPLATE','template/');
// directoriu pentru stocarea resurcelor dinamice
define('RESURCE','dinamic/')
?&gt;

iar în index.php unica modificare este că la inceputul fişierului după ce se include ‘config.php’ se include şi ‘system/db.php’.
Astfel acum oriunde în orice parte dinamică se poate de declarat o variabilă de tip db şi de operat cu metodele clasei db pentru citirea sau scrierea datelor din baza de date.

NOTĂ : Personal am verificat toate scriputurile prezentate.
sursa finala : arhivă

Published by

Ticnitul

eu is student