2012-11-03 33 views
0

我是PHP新手 - >第一次開發人員。我正在處理我的Web應用程序,並且幾乎完成了;不過,我的大部分sql都是通過使用直接mysql請求的代碼直接完成的。這是我接近它的方式:使用PHP和MySQL - 需要一個好的和安全的OO設計

classes_db.php我聲明瞭db設置並創建了用於打開和關閉數據庫連接的方法。我宣佈我的普通頁面的那些對象:

class classes_db { 

    public $dbserver = 'server; 
    public $dbusername = 'user'; 
    public $dbpassword = 'pass'; 
    public $dbname = 'db'; 

    function openDb() { 
     $dbhandle = mysql_connect($this->dbserver, $this->dbusername, $this->dbpassword); 
     if (!$dbhandle) { 
      die('Could not connect: ' . mysql_error()); 
     } 
     $selected = mysql_select_db($this->dbname, $dbhandle) 
       or die("Could not select the database"); 

     return $dbhandle; 
    } 


    function closeDb($con) { 
     mysql_close($con); 
    } 
} 

在我的正常的網頁,我這樣做:

<?php 
require 'classes_db.php'; 
session_start(); 

//create instance of the DB class 
$db = new classes_db(); 

//get dbhandle 
$dbhandle = $db->openDb(); 

//process query 
$result = mysql_query("update user set username = '" . $usernameFromForm . "' where iduser= " . $_SESSION['user']->iduser); 

//close the connection 
if (isset($dbhandle)) { 
    $db->closeDb($dbhandle); 
} 

?> 

我的問題是:如何做是正確的,並使其OO和安全性?我知道我需要合併準備好的查詢 - >如何以最好的方式做到這一點?請提供一些代碼

+5

使用停止'mysql_ *'和使用PDO與準備好的查詢。就目前而言,您可能會對SQL注入攻擊敞開大門。 – Brad

+0

我知道,這是我的問題的目的 - >請提供一些改進它的最佳方法。謝謝 – Andrew

+0

這應該在http://codereview.stackexchange.com – goat

回答

1

停止使用mysql_ *,使用的mysqli和PDO 代替

PHP PDO vs normal mysql_connect

mysql_ *功能變老。很長一段時間,mysql_ *有 與其他常見的SQL數據庫編程接口不一致。它 不支持現代SQL數據庫概念,如準備好的 語句,存儲過程,事務等...這是用mysql_real_escape_string轉義 參數並連接成SQL的方法 字符串容易出錯並且老式。 mysql_ * 的另一個問題是最近開發人員缺乏注意力,它不是 未被維護......這可能意味着像安全 等安全漏洞沒有得到修復,或者它可能會一起停止工作 更新版本的MySQL。此外,最近PHP社區 已經適合開始mysql_ *的軟棄用,這意味着您將開始看到最終從語言中刪除mysql_ * 函數的緩慢過程(不要擔心這可能會在 之前一段時間實際上發生!)。

PDO有一個更好的接口,你將最終產生更高的效率, 並寫出更安全,更乾淨的代碼。 PDO也爲不同的SQL數據庫供應商提供不同的驅動程序,這將允許您輕鬆使用其他供應商而不必重新學習不同的接口。 (儘管 你可能需要學習略有不同的SQL)。而不是 將轉義字符串連接到SQL中,在PDO中,綁定參數 這是保護查詢更簡單,更簡潔的方法。綁定 參數還允許在多次調用相同的 SQL查詢時使用略有不同的參數來提高性能。 PDO也有多種錯誤處理方法。我在 mysql_ *代碼中看到的最大問題是它缺少一致的處理,或者在 都沒有處理! PDO處於異常模式時,您可以獲得一致的錯誤處理 ,最終可以節省您追蹤問題的時間。

現在在PHP安裝中默認啓用PDO,但是您需要 兩個擴展才能使用PDO:PDO以及要使用的 數據庫的驅動程序,例如pdo_mysql。安裝MySQL驅動程序 與在大多數 發行版中安裝php-mysql軟件包一樣簡單。

http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

+0

有趣的閱讀! – Andrew

0

我強烈推薦RedBeanPHP。這是一個非常穩定的MySQL數據庫庫,可以抽象出數據庫交互的所有連接,查詢,清理,準備,使用PDO等(考慮到您對PHP開發不熟悉,這對您很有用)。

看看這裏:http://redbeanphp.com/

是多麼容易建立一個連接一個例子:

require('rb.php'); 
R::setup('mysql:host=localhost; dbname=mydatabase','user','password'); 

設置RedBeanPHP:http://redbeanphp.com/manual/setup

當創建一個類來處理你的數據庫對象,你會想要使用一個接口和/或一個抽象類來設置某些對象行爲規則(認爲CRUD ...)。

您只需將該數據庫連接包含在一個通用文件中,將其包含在所有PHP腳本中,然後全部設置好。

+0

我不同意使用這樣的庫對於新開發者來說很好。他們需要知道PHP和MySQL如何在嘗試使用庫之前工作,以便他們知道如何在庫出現時解決問題。 – Codeguy007

+0

完全不同意。新手應該從確保正確模式和實踐的工具入手,並發現更深層次的語言/堆棧的更精細的點。作爲一名新開發人員,你想做的最後一件事是在不知道如何游泳的情況下跳入深淵。 –