PDO - 准备好的陈述

时间:2012-08-16 10:06:43

标签: php mysql pdo prepared-statement

我有两个递归函数:

1)

function getCategories($id)
{
    global $con;
    $select = $con->prepare('SELECT * FROM categories WHERE parent_category_id = :parent_category_id OR (parent_category_id IS NULL AND :parent_category_id IS NULL)');
    $select->bindValue(':parent_category_id', $id, PDO::PARAM_NULL || PDO::PARAM_INT);
    $select->execute();
    // fetching.........
    for() ... getCategories(.......);
}

2)

$select = $con->prepare('SELECT * FROM categories WHERE parent_category_id = :parent_category_id OR (parent_category_id IS NULL AND :parent_category_id IS NULL)');

function getCategories($id)
{
    global $select;
    $select->bindValue(':parent_category_id', $id, PDO::PARAM_NULL || PDO::PARAM_INT);
    $select->execute();
    // fetching.........
    for() ... getCategories(.......);
}

哪个更好/更快? 是否最好只提前一次提出这一规定?

3 个答案:

答案 0 :(得分:1)

第二个应该更快,因为你没有调用不需要的语句。准备好的陈述的想法是你必须准备一次。但最好的方法是剖析。

这是一个简单的方法:

$start = microtime(true);

for ($i = 0; $i < 1000000; $i++){
     //your code here
}

echo microtime(true) - $start;

答案 1 :(得分:0)

你的第二个功能肯定要快得多,特别是当它经常执行时。因为这是发明预准备语句的主要原因:您的SQL服务器只需解析和优化您的查询一次。但在你的第一个解决方案中,你甚至不需要准备好的陈述。因此,在我看来,仅需要进行性能分析测试才能找出第二个更快,而不是发现它更快。

答案 2 :(得分:0)

第二个变体更快,因为您准备“模板”(使用prepare()方法),然后您将值发送到模板并在每次迭代中执行查询。