2011-06-17 96 views
3

我是OOP PHP的初學者。 我試圖做一個類,將連接,查詢和獲取數據 我做下面的編碼使用OOP從MySQL獲取數據

class MySQL { 

    private $set_host; 
    private $set_username; 
    private $set_password; 
    private $set_database; 

    public function __Construct($set_host, $set_username, $set_password){ 
     $this->host = $set_host; 
     $this->username = $set_username; 
     $this->password = $set_password; 
     $con= mysql_connect($this->host, $this->username, $this->password); 
     if(!$con){ die("Couldn't connect"); } 
    } 


    public function Database($set_database) 
    { 
     $this->database=$set_database; 
     mysql_select_db($this->database)or die("cannot select Dataabase"); 
    } 

    public function Fetch($set_table_name){ 
     $this->table_name=$set_table_name; 
     $query=mysql_query("SELECT * FROM ".$this->table_name); 
    $result= mysql_fetch_array($query); 
    } 
} 

$connect = new MySQL('localhost','root',''); 
$connect->Database('cms'); 
$connect->Fetch('posts'); 

我想要達到這是

$connect = new MySQL('localhost','root',''); 
$connect->Database('cms'); 
$connect->Fetch('posts'); 

,我想提取使用的格式像這樣

echo $result[0]; 

的數據,但我沒有得到這個邏輯來實現這一目標 請幫助

謝謝!

+1

$這是用來訪問對象的變量,而不是局部變量。你還應該看看MySQLi和PDO。 – Manhim 2011-06-17 04:18:36

+0

你不應該在你的班級中死()。對於Manhim關於['PDO'](http://php.net/manual/en/book.pdo.php)和['Mysqli'](http:// php。)的評論,向上拋出異常 – JohnP 2011-06-17 04:19:09

+0

+1更好。淨/手動/ EN/book.mysqli.php)。從這些開始,然後擴展它們,而不是圍繞舊的'mysql'擴展構建一些東西。事實上,除非你必須支持舊版本的PHP,否則需要解決遺留代碼,你甚至不應該使用'mysql'擴展名。 – prodigitalson 2011-06-17 04:21:42

回答

10

Fetch功能只從數據庫中提取一行,而不必返回的結果...

的方法是不是最好的,但爲了達到你想要什麼更多信息:

public function Fetch($set_table_name){ 
    $query=mysql_query("SELECT * FROM ".$set_table_name); 
    $result = array(); 
    while ($record = mysql_fetch_array($query)) { 
     $result[] = $record; 
    } 
    return $result; 
} 

這將使得每行$結果的一部分,但你必須訪問它是這樣的:

你會調用此類抓取功能:

$result = $connect->Fetch('posts'); 

echo $result[0]['columnName']; // for row 0; 

或循環:

for ($x = 0; $x < count($result); $x++) { 
    echo $result[$x][0] . "<BR>"; // outputs the first column from every row 
} 

也就是說,取集到內存整個結果是不是一個好主意(有些人會說這是一個非常糟糕的主意。)

編輯:也看起來像你有你的班級其他問題...我必須跑,但會明天檢查,如果其他人沒有讓你直我會擴大。

EDIT2:好的,打算做一次,在你的類並試圖解釋一些事情:

class MySQL { 

    //declaring the private variables that you will access through $this->variable; 
    private $host; 
    private $username; 
    private $password; 
    private $database; 
    private $conn; // Adding the connection, more on this later. 

    public function __Construct($set_host, $set_username, $set_password){ 
    $this->host = $set_host; 
    $this->username = $set_username; 
    $this->password = $set_password; 
    // Combining the connection & connection check using 'or' 
    // Notice that I removed the semi-colon after the mysql_connect function 
    $this->conn = mysql_connect($this->host, $this->username, $this->password) 
        or die("Couldn't connect"); 
    } 

    public function Database($set_database) 
    { 
    $this->database=$set_database; 
    // Adding the connection to the function allows you to have multiple 
    // different connections at the same time. Without it, it would use 
    // the most recent connection. 
    mysql_select_db($this->database, $this->conn) or die("cannot select Dataabase"); 
    } 

    public function Fetch($table_name){ 
    // Adding the connection to the function and return the result object instead 
    return mysql_query("SELECT * FROM ".$table_name, $this->conn);   
    } 

} 

$connect = new MySQL('localhost','root',''); 
$connect->Database('cms'); 
$posts = $connect->Fetch('posts'); 

if ($posts && mysql_num_rows($posts) > 0) { 
    echo "Here is some post data:<BR>"; 
    while ($record = mysql_fetch_array($posts)) { 
     echo $record[0]; // or a quoted string column name instead of numerical index. 
    } 
} else { 
    echo "No posts!"; 
} 

我希望這可以幫助...它應該讓你至少開始。如果你有更多的問題,你應該單獨問問他們。

+1

對於內存中的整個結果集,設置爲+1 ===壞主意。 – Timothy 2011-06-17 04:19:47

+0

非常感謝man.this是我正在尋找。 非常感謝:) + 100Likes :) – Mixin 2011-06-17 04:22:35

+0

我有很多類似的問題需要問及我需要多少回答我的荒謬瘋狂問題? 我不想惹惱你,這就是爲什麼 :) – Mixin 2011-06-17 04:24:03

1

這是因爲在result函數中設置了$ result。它在提取功能之外將不可用。

而不是這條線$result= mysql_fetch_array($query);,你會想要像return mysql_fetch_array($query);

然後在你的代碼

$row = $connect->Fetch('posts'); 
// do something with $row 

在另一方面,你取功能僅適用於返回一行數據庫查詢。如果要循環查詢結果中的行,則必須將mysql_query & mysql_fetch_array調用分隔到另一個函數中。

另一方面,你不應該需要將這些代碼封裝到類中。 PHP已經提供了基於OOP的數據庫類,稱爲PDO或PHP數據對象。這有一條學習曲線,但它是最好的練習,並且有助於保護您的代碼免受SQL注入等事情的影響。

這是一個很好的教程:http://www.giantflyingsaucer.com/blog/?p=2478

+0

謝謝大家: ) – Mixin 2011-06-17 04:34:11

0

我會提出這樣的返回對象的值的函數。

public function returnData($data){ 
    return $this->$data; 
} 

然後在頁面中,您希望獲取數據,只需啓動該類並調用該類中的函數。

$post->returnDate("row name here");