2013-02-26 28 views
2

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

事情是我最近才学会了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... 

所以我能找到的地方会出现的任何问题(try/catch语句),并要对注射和无效字符(准备)安全(我有一些个人支票但我非常确定这个功能会更好)。

当我有一个或两个查询,这是好的,但代码后长大成为对小的动作/物质有点太代码(如16行一个查询...)

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

我在想这个代码块的功能,并用语句作为参数调用它。因此,我只需在主体中键入查询,然后调用函数进行准备,执行并返回结果。当然,我会一直使用fetchAll,并且会返回一个关联数组,但我认为只要数据集很小,内存使用情况就会好(在任何情况下,在现在的系统中,我认为它应该使用LOT来注意差异)。 ..

任何想法都欢迎。

我意识到这实际上并不是代码和设置,s/w和其他问题的程序问题,但我希望它仍然遵循这一精神。

+3

您的问题可能更适合codereview.stackexchange.com – j08691 2013-02-26 18:24:21

+2

此问题不适用于codereview。没有什么可以审查。该代码是一个草图,以显示OP目前正在使用的练习。这对于Stackoverflow来说是个完美的问题。比99%的“找到一个错字”的问题要好得多。 **为什么大家都急于从Stackoverflow中赶走好的编程问题?**如果你唯一的原因是你不知道该怎么回答,请不要closevote。 – 2013-02-26 18:55:14

回答

3

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

下,有2件你需要知道的伟大的事情:

  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 

只是给你怎么可能会想法 - 我自己database abstraction class
它是基于mysqli的顶部,但可以很容易的被改写无论其他驱动程序包括PDO

+0

谢谢。我知道我的try/catch使用很浪费......很明显,在某种感觉上..我会检查你的代码,希望我能理解 – 2013-02-26 19:31:04

+0

好吧......我想我明白了......我会不得不在课堂上多读一些,但我想我明白了。我有点困惑,因为我正在考虑更经典的程序中的类的实例,它们在创建后始终可用。在脚本的每一个新的调用中,你都会重新创建一个实例,并且执行你将要做的事情,并在它结束时被销毁。我在前面做了很多工作......我几乎完成了我的小网站......噢,生活和学习 – 2013-02-26 19:44:52