2013-09-21 29 views
-2

非常基本的問題,我正在做的功能,將生成查詢數據庫。我有兩種方法來解決這個問題,我不知道哪個更好。php函數生成查詢到數據庫

首先是製作一個更大的功能產生任何查詢我所需要的,所以基本上:

function generateQuery($object, $queryType, $tableName, $conditions = null) { 
    //Then in here some more complex code that generates query, 
    //some of stuff like double if shorthands etc, for example: 

    $string = ($queryType === "INSERT") ? "INSERT INTO {$table} (" : (($queryType === "UPDATE") ? "UPDATE {$table} SET" : "SELECT"); 

    //So all the code for generating INSERT, UPDATE and SELECT in one function 
    //full of conditions. 
} 

或者我可以只寫單獨的功能,每個類型的查詢。最後,第一個解決方案根本就沒有那麼複雜,第二個解決方案會在代碼中做一些重複,但它確實感覺有點不對勁。

再說我以後要使用PDO的交易,所以我會像這樣的功能:

function launchQueries($list) { 
    $this->handler->beginTransaction(); 

    for($i = 0; $i < count($list); $i++) 
    { 
     $this ->launchQuery($list[i]->object, $list[i]->$table, $list[i]->queryType, $list[i]->conditions); 
    } 
    $this->handler->commit(); 
} 

或者類似的東西,不知道這個確切的代碼會工作,因爲我還沒有使它然而。

無論如何,通過在一個函數中生成查詢,我可以在列表中傳遞查詢,並執行一個循環來生成並執行它們。但它仍然感覺不對。它是這樣完成的,還是我錯過了不同的更好的解決方案?

+1

還有就是皮膚貓不止一種方法。沒有人會在所有情況下都做到最好。 – 2013-09-21 10:58:22

+2

最好的方法顯然是** NOT **來生成查詢。 SQL比你想像的要豐富得多。它不是幾個愚蠢的運營商的限制。 –

+0

我對這個主題比較陌生,所以還有其他方法可以在PHP中對MySQL數據庫進行操作,而不是在最後查詢字符串?無論我做什麼操作,似乎PHP和MySQL之間的唯一媒介最終是查詢?也許我的項目很容易超出查詢範圍?你到底什麼意思? –

回答

0

對我來說感覺不對的是重新發明輪子。

如何使用固體的現有庫如Doctrine DBAL

它是跨平臺,並提供方便的方法,如insert()update()delete()

$conn->insert('user', array('username' => 'jwage')); 
$conn->update('user', array('username' => 'jwage'), array('id' => 1)); 
$conn->delete('user', array('id' => 1)); 
+0

這是一個大學項目,所以不幸的是我需要重新發明輪子。我想我應該提到這一點。這就是爲什麼我的問題不是關於現成的解決方案,而是關於如何自己做。不過,我很欣賞你的答案,因爲我可以看到這個庫中的事情是如何完成的。 –

+0

好吧,我明白了。要看到更好的想法,請查看Doctrine [QueryBuilder](http://www.doctrine-project.org/api/dbal/2.1/class-Doctrine.DBAL.Query.QueryBuilder.html),它允許您可以使用OOP方式構建SQL查詢。 – Benjamin