PHP/SQL:框架查询构建与字符串连接


PHP/SQL: framework query building vs string concatenation

考虑两种查询数据库的方法:

使用框架(Yii):

$user = Yii::app()->db->createCommand()
->select('id, username, profile')
->from('tbl_user u')
->join('tbl_profile p', 'u.id=p.user_id')
->where('id=:id', array(':id'=>$id))
->queryRow();

使用字符串串联(分隔SQL语句的各个部分):

$columns = "id,username,profile"; // or =implode(",",$column_array);
//you can always use string functions to wrap quotes around each columns/tables
$join = "INNER JOIN tbl_profile p ON u.id=p.user_id";
$restraint = "WHERE id=$id ";//$id cleaned with intval()
$query="SELECT $columns FROM tbl_user u {$restraint}{$join}";
//use PDO to execute query... and loop through records...

用于分页的字符串串联示例:

$records_per_page=20;
$offset = 0;
if (isset($_GET['p'])) $offset = intval($_GET['p'])*$records_per_page;
Squery="SELECT * FROM table LIMIT $offset,$records_per_page";

哪种方法的性能更好?

  • PHP的PDO允许代码移植到不同的数据库
  • 第二个方法可以封装在一个函数中,这样就不会重复任何代码
  • 字符串串联允许以编程方式(通过操纵字符串)构建复杂的SQL语句

使用适合您和您的项目团队的。框架是有原因的,所以如果合适的话就使用它们,但如果不合适(也有不合适的原因),那么就会失效。

我不知道Yii,但如果你看看很多框架,它们所做的只是在一天结束时从部分构建一个字符串查询,希望能利用参数化,但并不总是如此。因此,就速度而言,字符串concat可能是"最快的",但你不太可能真正看到秒表的区别(如果需要1000个查询,你可以进行基准测试,但其他功能,如更好的错误检查或缓存,可能会不公平地减慢或加快结果)。

但框架的一个优势是,它们可以添加上下文敏感的缓存,并且在更新表X时知道需要删除A、D和F的查询缓存,但查询B、C和E都很好。

您还需要担心"易于阅读"、"调试"answers"功能"。上面的例子更容易阅读,这在共享项目中很重要。

你还需要考虑准备好的陈述——框架是否使用了它们?如果是这样,它是否允许您重用它们(而不仅仅是出于语法目的使用它们)。

但是这个框架可以进行子选择吗?它能在"JOIN ON"中进行参数化吗?如果没有,则使用PDO的字符串连接可能更合适。

这不是一个简单明了的答案,但希望能提供你需要考虑的所有要点。

建议:使用框架,除非你真的注意到它很慢,使用了太多内存,或者有其他很好的理由不使用。