2012-04-18 9 views
7

Estoy creando una API de php restful y actualmente tengo la información de conexión de la base de datos en cada función.¿Necesito una conexión php mysql en cada función que utiliza la base de datos?

//Connect To Database 
    $hostname=host; 
    $username=username; 
    $password=password; 
    $dbname=dbname; 

    mysql_connect($hostname, $username, $password) OR DIE('Unable to connect to database! Please try again later.'); 
    mysql_select_db($dbname); 
mysql_query($sqlApiAccess) or die('Error, insert query failed'); 

¿Cuál es la mejor manera de hacerlo, puedo tener una conexión de base de datos por archivo php? ¿O debo hacerlo por función que usa la base de datos?

+0

sólo uno por qué cree que necesita más? – Vytautas

+1

Por cierto, eche un vistazo a la biblioteca 'PDO'. Proporciona la forma agradable orientada a objetos para trabajar con DB (a diferencia de 'mysql' y' mysqli'); también permite declaraciones preparadas (mientras que 'mysql' IIRC no las admite, dejando todo el material de escape al desarrollador). – penartur

+0

Soy nuevo en PHP y no estaba seguro sobre los requisitos de las conexiones de db. Veré la biblioteca PDO – Moltra

Respuesta

12

Crear un config.php y añadir el código:

config.php:

$hostname=host; 
$username=username; 
$password=password; 
$dbname=dbname; 

mysql_connect($hostname, $username, $password) OR DIE('Unable to connect to database! Please try again later.'); 
mysql_select_db($dbname); 

Luego, en cualquier archivo que desea utilizar MySQL, añada lo siguiente:

script2.php

<?php 
require_once 'config.php'; 

mysql_query($sqlApiAccess) or die('Error, insert query failed'); 
?> 
+1

También; Mensaje de los profesionales: P Asegúrese de desinfectar su entrada;) – Menztrual

+0

Esto funciona muy bien. Ejecuto todos mis parámetros api a través de htmlspecialchars y mysql_real_escape_string. Eso es probablemente una muerte excesiva, pero quiero proteger mi DB. – Moltra

+0

No se preocupe por html_entities() en la entrada, solo salida. Y asegúrese de usar ENT_QUOTES también con las entidades/specialchars;) – Menztrual

2

No hay necesidad de hacer conexión en cada función. necesita hacer un archivo de conexión como conn.php y hacer las consultas de conexión.

<?php 
mysql_connect("localhost", "admin", "1admin") or die(mysql_error()); 
mysql_select_db("test") or die(mysql_error()); 
?> 

en cualquier otro archivo en el que desea conectar la base de datos se limite a escribir esta línea

<?php include("conn.php");?> 

En este archivo son capaces de ejecutar cualquier consulta.

1

haga esto:

$db_connection= mysql_connect($hostname, $username, $password) OR DIE('Unable to connect to database! Please try again later.'); 

Y cada vez que desea consultar:

mysql_query("my_query",$db_connection); 

Nota, si se conecta a la base de datos en una función, que se necesitan para $db_connection mundial.

Y cuando se desea cerrar la conexión DB:

mysql_close($db_connection); 
0

¿Por qué no salir la información de conexión en la configuración y el llamado a mysql_connect en una fábrica?

E.g.

class ConnectionFactory { 
    public static MysqlConnection CreateConnection() { 
     $connection = mysql_connect(Config::$host, Config::$port etc); 
     mysql_select_db($connection, Config::$schema); 
     return $connection; 
    } 
} 

y luego en el código

$connection = ConnectionFactory::CreateConnection(); 
mysql_query($connection, $sqlApiAccess) or die('Error, insert query failed'); 
+2

Para alguien que solo está preguntando si necesita poner el mismo código en cada archivo, creo que tener ConnectionFactory es demasiado caro y, en todo caso, le hará que se rasque la cabeza aún más. – Menztrual

+0

@tehlulz Bueno, tal vez. Leí hace un par de años "The Easy Way to Stop PHPing" de Allen Carr, y ya olvidé qué tan malo podría ser el software escrito en PHP. – penartur

+0

Hay una diferencia entre aprender a usar un idioma y escribir una aplicación completa: P – Menztrual

12

Para evitar la creación de una nueva conexión de base de datos cada vez, podemos utilizar Singleton design pattern -

necesitamos tener una base de datos de clase para manejar la Conexión de DB:

Database.class.php

<?php 
     class Database 
     { 
      // Store the single instance of Database 
      private static $m_pInstance; 

      private $db_host='localhost'; 
      private $db_user = 'root'; 
      private $db_pass = ''; 
      private $db_name = 'databasename'; 

      // Private constructor to limit object instantiation to within the class 
      private function __construct() 
      { 
       mysql_connect($this->db_host,$this->db_user,$this->db_pass); 
       mysql_select_db($this->db_name); 
      } 

      // Getter method for creating/returning the single instance of this class 
      public static function getInstance() 
      { 
       if (!self::$m_pInstance) 
       { 
        self::$m_pInstance = new Database(); 
       } 
       return self::$m_pInstance; 
      } 

      public function query($query) 
      { 
       return mysql_query($query); 
      } 

     } 
?> 

& podemos llamarlo desde otra Files-

other.php

<?php 
     include 'singleton.php'; 
     $pDatabase = Database::getInstance(); 

     $result = $pDatabase->query('...'); 
?> 
+0

Estaba usando este patrón, pero a veces recibía un error que decía 'Demasiadas conexiones a la base de datos' ... ¿Por dónde debería cerrar la conexión de la base de datos? – ELITE

Cuestiones relacionadas