2012-04-18 13 views
7

Tôi đang tạo một API yên tĩnh php và hiện tại tôi có thông tin kết nối cơ sở dữ liệu trong từng chức năng.Tôi có cần kết nối mysql php trong mỗi chức năng sử dụng cơ sở dữ liệu không?

//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'); 

Cách tốt nhất để làm điều này, Tôi có thể có một kết nối cơ sở dữ liệu cho mỗi tệp php không? Hoặc tôi cần phải làm điều đó cho mỗi chức năng sử dụng cơ sở dữ liệu.

+0

chỉ là một lý do tại sao bạn nghĩ cần nhiều hơn? – Vytautas

+1

Nhân tiện, hãy xem thư viện 'PDO'. Nó cung cấp cách thức hướng đối tượng tốt đẹp để làm việc với DB (trái ngược với 'mysql' và' mysqli'); nó cũng cho phép các câu lệnh được chuẩn bị (trong khi 'mysql' IIRC không hỗ trợ các câu lệnh này, để lại tất cả các công cụ thoát cho nhà phát triển). – penartur

+0

Tôi mới sử dụng PHP và không chắc chắn về các yêu cầu về kết nối db. Tôi cũng sẽ xem thư viện PDO – Moltra

Trả lời

12

Tạo một config.php Và thêm mã:

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); 

Sau đó, trong bất kỳ tập tin bạn muốn sử dụng mysql, thêm dòng sau:

script2.php

<?php 
require_once 'config.php'; 

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

Ngoài ra; Thông điệp từ những thuận: P Hãy chắc chắn để khử trùng đầu vào của bạn;) – Menztrual

+0

Điều này hoạt động tuyệt vời. Tôi chạy tất cả các thông số api của tôi thông qua htmlspecialchars và mysql_real_escape_string. Đó có lẽ là một giết hơn, nhưng tôi muốn bảo vệ db của tôi. – Moltra

+0

Đừng lo lắng về html_entities() trên đầu vào, chỉ cần đầu ra. Và hãy chắc chắn sử dụng ENT_QUOTES cũng như với các thực thể/specialchars;) – Menztrual

2

Không cần kết nối trong mỗi chức năng. bạn cần tạo một tệp kết nối như conn.php và thực hiện các truy vấn kết nối.

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

trong bất kỳ tập tin khác mà bạn muốn kết nối cơ sở dữ liệu chỉ cần viết dòng này

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

Mở tập tin này, bạn có thể chạy bất kỳ truy vấn.

1

làm điều này:

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

Và mỗi khi bạn muốn truy vấn:

mysql_query("my_query",$db_connection); 

Lưu ý, nếu bạn kết nối với DB trong một hàm, bạn sẽ cần phải toàn cầu $db_connection.

Và khi bạn muốn đóng kết nối DB:

mysql_close($db_connection); 
0

Tại sao sẽ không di chuyển ra khỏi các thông tin kết nối vào cấu hình và các cuộc gọi đến mysql_connect vào một số nhà máy?

Ví dụ:

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

và sau đó trong mã của bạn

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

Đối với một người chỉ yêu cầu nếu anh ta cần phải đặt cùng một mã trong mỗi tập tin, tôi nghĩ rằng có một ConnectionFactory là waay overkill và nếu bất cứ điều gì, sẽ có anh gãi đầu của mình nhiều hơn. – Menztrual

+0

@tehlulz Có thể. Tôi đã đọc bài viết của Allen Carr * Cách dễ dàng để dừng PHPing * cách đây vài năm, và đã quên cách phần mềm xấu được viết bằng PHP có thể như thế nào. – penartur

+0

Có một sự khác biệt giữa việc học cách sử dụng ngôn ngữ và viết một ứng dụng đầy đủ: P – Menztrual

12

Để tránh tạo ra một kết nối cơ sở dữ liệu mới mỗi lần, chúng ta có thể sử dụng Singleton design pattern -

chúng ta cần phải có một cơ sở dữ liệu class- để xử lý Kết nối DB-

Cơ sở dữ liệu.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); 
      } 

     } 
?> 

& chúng ta có thể gọi nó là từ khác files-

other.php

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

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

Tôi đang sử dụng mẫu này, nhưng đôi khi tôi gặp lỗi khi nói 'Quá nhiều kết nối cơ sở dữ liệu' .. Tôi nên đóng kết nối cơ sở dữ liệu ở đâu. – ELITE

Các vấn đề liên quan