2

我认为这是一个随机的问题,它更多地与风格和组织有关。我有一个 Web 应用程序,我在其中使用 PDO 与 MySQL 数据库连接,并且在某些脚本中,有很多查询一个接一个,不一定涉及相同的表。即,我将在一个语句中执行一个 SELECT 语句,然后根据某些值,我将更新另一个语句,最后从另一个语句中删除。

问题是我最近才学习 PHP 和 MySQL,因为我不确定并且想要小心并轻松发现任何问题(还有一点是因为我对统一性和编码风格等愚蠢的事情有点强迫症和肛门)我使用以下格式的每个查询

try {
    $statement = "
        UPDATE/SELECT   ...
        FROM/SET    ...
        WHERE   ...";
    $query = $dbcnx->prepare($statement);
    $flag = $query->execute();
}
catch (PDOException $e) {
    $errorMsg = "...";
    error_log($errorMsg,3,'../../xxx.log');
    $response = ...;
    $dbcnx->null;
    return $response;
}
$result = $query->fetch/fetchAll/fetcColumn...

所以我可以找到任何问题会发生的地方(尝试/捕获)并防止注入和无效字符(准备)(我进行了一些个人检查,但我很确定专门为之设计的功能会更好)。

当我有一个或两个查询时,它很好,但是在代码增长之后,对于小动作/物质来说它变得有点太多了(比如一个查询需要 16 行......)

所以我想要一些建议。如何使我的代码更易于管理?我的结构逻辑(我写它的方式)是否存在一些基本错误?使用 try/catch 有什么规则吗?是否更多用于开发和调试,然后您可以删除其中的一些块?

我正在考虑制作一个仅包含这段代码的函数,并将语句作为参数调用它。所以我只需在主体中“键入”查询,然后调用准备、执行并返回结果的函数。当然,我总是会使用 fetchAll 并返回一个关联数组,但我认为只要数据集很小,内存使用量就可以了(无论如何,在当今的系统中,我认为应该花很多时间才能注意到差异)。 ..

欢迎任何想法。

我意识到这实际上不是代码和设置以及软件和程序的问题,就像这里的其他问题一样,但我确实希望它仍然遵循这种精神。

4

1 回答 1

4

首先,感谢您提出的精彩问题。
令我惊讶的是,这里很少有问题要求更好的代码实践。
没有人关心他们的代码质量,但每个人都要求复制/粘贴代码,而不管他们有什么。

接下来,您需要了解两件重要的事情:

  1. Try..catch 是一个特殊的(不是双关语)运算符。它必须很少使用,因为您可以从错误中恢复,按照代码处理。用它来记录错误是一种致命的罪恶,也是对宝贵而强大的机制的浪费。
  2. 您真正需要的是一个数据库抽象层来完成所有繁琐的工作并处理复杂的情况。

您需要阅读异常。
这是自语法高亮以来编程语言的最大改进。
他们不打算立即被抓住。这一点恰恰相反——以集中的方式捕获异常,只有一个异常处理程序。

但即使没有处理程序例外也足够好。错误的查询将停止您的脚本,将显示 503 错误,并将记录错误消息或根据 PHP 设置将其显示在屏幕上 - 无需更多!

因此,只需摆脱所有处理代码并告诉 PHP 使用哪个文件来记录错误

ini_set('log_errors',1);
ini_set('error_log','/path/to/log');

并且您将使用更少的代码获得相同的结果。

至于抽象库,看你的代码:

$statement = "UPDATE/SELECT  FROM/SET    ...         WHERE   ...";
$query = $dbcnx->prepare($statement);
$flag = $query->execute();
$result = $query->fetch/fetchAll/fetcColumn...

四行,只有其中一行有意义。

为什么不让它成为一条线 -

$result = $db->getRes( $statement); //okay, leaving query separate for readability

只是为了让您了解它是如何实现的-我自己的数据库抽象类
基于 mysqli,但可以在包括 PDO 在内的任何其他驱动程序上轻松重写

于 2013-02-26T19:23:22.093 回答