Controlador de base de dades MySQL

Quan es comença una web dinàmica des de cero i es pretén prescindir de qualsevol framework, es bo aturar-se a rumiar com serà la interacció entre el servidor web i el sistema de gestió de base de dades.

Sempre tens l’opció de anar obrint i tancant connexions contra la bd, quan sigui necessari, enmig del codi, però, la meva pròpia experiència em diu que es millor centralitzar-lo tot en una funció o classe que gestioni la connexió al SBGD i, si s’ha de realitzar qualsevol canvi, nomes es tingui que realitzar en un sol lloc per aplicar-lo a tot el projecte.

En la majoria de projectes en els que he participat, la formula era Apache + MySQL Server per la qual cosa una de les meves propostes es la de la funció que us presento a continuació:

En la primera part del fitxer, definim les constants on indicarem els paràmetres a utilitzar per connectar-nos al MySQL Server.

1
2
3
4
5
6
<?php
  define('DB_USER','Usuari de la base de dades');
  define('DB_PASS','Contrasenya de la base de dades');
  define('DB_NAME','Nom de la base de dades a atacar');
  define('DB_HOST','IP on esta hostatjat la base de dades');
?>

La funció NetejarSql netejara els valors que li passem. Esta funció serà molt útil per netejar valors agafats per formularis i evitar el SQL Injection.

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function NetejarSql( $valor, $usar_trim = 1, $usar_urldecode = 1 ){
  $valor = strip_tags( $valor );
 
  $conn = @mysql_connect( DB_HOST, DB_USER, DB_PASS );
 
  if( get_magic_quotes_gpc() ) $valor = stripslashes( $valor );
    $valor = mysql_real_escape_string( $valor, $conn );
 
    @mysql_close();
 
    if ( $usar_urldecode ){
      $valor = urldecode( $valor );
    }
    if ( $usar_trim ){
      $valor = trim( $valor );
    }
    return $valor;
}

I a continuació, les dos funcions que gestionen la connexió. ExecutarSQL e InserirSQL, executaran la sentència sql que li passem per paràmetre. La diferencia entre aquestes funcions es que la funció ExecutarSQL tornarà nomes true (1) o false (0) si ha pogut executar la sentència SQL de manera correcte i la funció InserirSQL tornarà false (0) si no ha pogut executar el sql passat o, en cas de que tot hagi funcionat be, tornarà el id de la fila inserida en el mysql.

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
* Executa una sentencia SQL en una SGBD MYSQL Configurat
* Atenció: $sql no pot ser nul.
*
* Torna el resultat de la sentencia sql en format resource.
* Mes info en http://es.php.net/manual/en/function.mysql-query.php
* Si hi ha un error al connectar-se a la BD, tornarà -1;
*/
function ExecutarSql( $sql ){
  $resultat = -1;
  $conn = @mysql_connect( DB_HOST, DB_USER,DB_PASS );
  if ( ! $conn ){
    $resultat = -1;
  } else {
    if ( ! @mysql_select_db( DB_NAME ) ){
      $resultat = -1;
    } else {
      $resultat = mysql_query( $sql );
    }
  }
  @mysql_close();
  return $resultat;
}
 
/*
* Executa una sentencia SQL insert en una SGBD MYSQL Configurat
* Atenció: $sql no pot ser nul.
*
* Retorna el id de la sentencia inserida
* Si hi ha una fallida al inserir tornarà 0;
* Si hi ha una fallida al connectar a la BD, tornarà -1;
*/
function InserirSql( $sql ){
 
  $id = 0;
  $conn = @mysql_connect( DB_HOST, DB_USER,DB_PASS );
  if ( ! $conn ){
    $id = -1;
  } else {
    if ( ! @mysql_select_db( DB_NAME ) ){
      $id = -1;
    } else {
      $resultat = mysql_query( $sql );
      if ( $resultat ){
        $id = mysql_insert_id();
      }
    }
  }
  @mysql_close();
  return $id;
}
?>

S’ha de tenir en compte que aquestes dues funcions no comproven que la sentencia SQL sigui valida o no, per tant, es molt important quan es construeix la sentencia SQL, abans de enviar-la a executar a aquestes funcions, verificar que es valida i que s’han netejat els paràmetres amb la funció NetejarSQL per evitar errors.

També s’ha de tenir present que cada funció te la seva comesa. Si tenim una sentència SQL que fa un SELECT, no te sentit que se la passem a la funció InserirSQL perquè probablement, ens donara un error.

A continuació os detallo un exemple d’us d’aquestes funcions.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
include('controlador-bd.php'); //Seria la suma del codi que hem descrit avanç.
 
$movil = NetejarSql( $_REQUEST["movil"] );
 
$sql = "SELECT * FROM usuari WHERE telefon = '$movil' LIMIT 1";
$resUsuari = ExecutarSql( $sql );
 
if ( $resUsuari != 0 && ! mysql_num_rows( $resUsuari ) ){
  $sql = "INSERT INTO usuari (telefon) VALUES ('$movil')";
  $idres = InserirSql( $sql );
  if( $idres != 0 ){
    echo "Inserció de sql realitzada correctament amb id $idres";
  } else {
    echo 'Error al inserir el sql.';
  }
} else {
  echo 'Error al executa la sentencia sql.';
}
?>

Be, no es una gran funció però ens pot ajudar a començar aquest petits projectes curts i simples que no requereixen d’una gran enginyeria.

Descarregar controlador-bd.php

Deixa un comentari

L'adreça electrònica no es publicarà Els camps necessaris estan marcats amb *