2013-09-21 31 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