编写自己的MySQL库?这是个好主意吗?

时间:2013-01-20 16:50:15

标签: php mysql mysqli

更新:感谢所有帮助人员,我决定尝试编写自己的PHP类来处理MySQL请求。

当我尝试从mysql_切换到mysqli_函数时,我现在遇到了一个问题,因为我有几万行PHP / MySQL代码分散在数百个文件中的查询,并且它们都使用mysql_querymysql_num_rowsmysql_fetch_assoc等功能。逐行更改这些功能(即使使用find /用预先准备好的语句替换mysqli_函数,所有这些都很痛苦,但是如果将来PHP.net决定发布其他会弃用mysqli_函数的东西会怎样呢?

所以现在我正在考虑编写我自己的MySQL库(你会称它为什么?)调用mysqli_函数并将其包含在我的所有文件中。这样,如果我将来需要更改其他内容,理论上我可以更改“库”中的功能一次,更改将反映在所有页面上,而不是手动完成并手动更改所有内容。

这会是个好主意吗?我在网上发现了一些名为MeekroDB的东西,但首先我不确定它是不是我正在寻找的东西,其次他们收取50美元用于商业用途(我想做的)。有其他免费解决方案,还是我只是在浪费时间?

感谢任何意见/反馈:)

编辑:如果不清楚,那就好像我正在向数据库查询的每个文件中建立与数据库的连接。我有一个function.php文件,用于连接到MySQL数据库,我include该文件存放在我的所有其他文件中。我的问题与mysql_querymysql_num_rowsmysql_fetch_assoc等功能更相关。

4 个答案:

答案 0 :(得分:4)

从查看引用的MeekroDB链接,我不认为你所写的是像mysql_* / mysqli_*方法那样的MySQL API。

您实际上想要编写的是数据库抽象层,尽管它特定于MySQL。

事实是,除非你要编写自己的底层模块与MySQL进行通信(当然,你也可以在PHP中执行 ),你可能会去最后还是以mysqli_方法作为后盾。

有很多这些图层可用,但我老实说考虑使用PDO而不是编写自己的图层,或者如果您担心函数被弃用,请使用mysqli_*。 PDO使用自己的MySQL驱动程序,因此如果需要,将更新。它还支持您需要的所有内容,包括易于使用的事务,准备好的语句和诸如此类的内容。

如果您想创建自己的简单访问方法,例如DB::Query(..),可以通过将PDO包装得足够简单来实现。

总的来说,我不知道这对组织代码有何帮助。您可能希望在您的数据库中查找类似ORM(对象关系映射器)的内容,您可以在其中定义直接映射到表中的自己的类,除了边缘情况之外,这应该可以减少几乎完全运行查询的需要。最全面的ORM可能是Doctrine,尽管你可以很容易地编写自己的ORM,包装PDO。

就像使用ORM可以实现的一个例子一样,这里有一段代码来演示:

$blogPost = BlogPosts::Load(123);
$blogPost->title = 'New Title';
$blogPost->save();

答案 1 :(得分:3)

围绕基本的PHP数据库函数包装代码是一个好主意,否则已经有一些很好的解决方案,你不应该建立自己的库。也许ORM(Object-relational_mapping)会让你感兴趣,流行的库是doctrinepropel

答案 2 :(得分:2)

  

这会是一个好主意吗?

事实上,这是处理SQL查询的唯一理智的方式。

我建议你library, designed to protect your queries against SQL injections。它绝对是免费的,比任何花费50美元或5000美元的东西要好。

在开始使用它之前,你唯一需要学习的是类型提示的占位符,但这个概念非常简单,我相信你会在一秒钟内得到它。不过,请随时提出任何问题。

顺便说一句,PDO显然不是可行的方式 - 它是丑陋的,使用起来很烦人,而且对于几乎超出几个基本情况的任何查询都是不安全的。
例如:

// SafeMySQL: only 2 lines and not a sign of injection
$sql  = "SELECT * FROM goods WHERE category IN(?a) ORDER BY ?n";
$data = $db->getAll($sql, $_GET['categories'], $_GET['orderby']);

// PDO
// errr... (massive headscratching resulting with something like 
// 2 screens of code with manual escaping and all that stuff 
// but most likely still unsdafe as only few PHP developers
// actually have an idea how to properly handle such cases )

答案 3 :(得分:1)

您正在寻找类似于“数据库包装类”的东西。

PHP 5.1以来有一个内置的抽象层,称为PDO。