[mysql]何时应使用预准备的语句到底?

标签: MySQL PHP
发布时间: 2017/4/9 23:07:21
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想知道,可我只是使用预准备的语句一次吗?

这里是我的脚本︰

$stm = $db->prepare("UPDATE
                     qanda AS ans1
                     JOIN qanda AS ans2 ON ans2.related = ans1.related
                     JOIN qanda AS ques ON ans2.related = ques.id
                     SET ans1.acceptedanswer = 1,
                         ans1.aadate = IF( ans1.id <> ?, ans1.aadate, ?)
                     WHERE ques.author_id = ? AND ans2.author_id = ? 
                                        ");
$stm->execute(array($answer_id, time(), $_SESSION["Id"], $author_id));
$done = $stm->rowCount();

if ($done){
    /* I don't use prepared statement here */
    $stm1 = $db->prepare("UPDATE user SET rep = rep + 15 WHERE id = $author_id");
    $stm1->execute();
}

正如你看到的我没有为第二个查询使用预准备语句。因为我是为第一个查询,如果第一个查询工作,我肯定参数有效,不需要将它们绑定的预准备语句

请不要问我为什么你不想使用准备好的 statemen't 的第二个查询,原因就是太久了

所以我在做什么是正确的吗?没有任何安全问题吗?

解决方法 1:

直接的回答是︰ 是的你可以。

为什么实际上达你,因为无论如何,它很好的做法是使用准备的原因只要你传递的值的语句。

也考虑,是否你不具有约束力的任何参数,它更有意义使用 query () 方法,只是要明确的事实你都不会绑定任何东西。所以你的第二个查询将

$stm1 = $db->query("UPDATE user SET rep = rep + 15 WHERE id = $author_id");

http://php.net/manual/en/pdo.query.php

而不是

$stm1 = $db->prepare("UPDATE user SET rep = rep + 15 WHERE id = $author_id");
$stm1->execute();

此外,你刚才提到动态查询,但这不是您的示例代码。不管怎么说会你如何使用的示例两个预准备的语句也上动态生成查询。

它是一个愚蠢的例子,但应该足以给你一个想法。

假设我们有一些更新 '电子邮件'、 'date_of_birth' 和 '网站' 的价值观。让我们说我们想要做一些检查对此数据之前插入它们。我会假装我们有一个 valid() 函数已经到位。

    $dynamic_sql = array();
    $parameters[':date_of_bird'] = $date_of_birth;

    if(valid($email)) {
        $dynamic_sql['email_sql'] = "email = :email";
        $parameters[':email'] = $email;

    }
    if(valid($website)) {
        $dynamic_sql['website_sql'] = "website = :website";
        $parameters[':website'] = $website;
    }

    if(count($dynamic_sql)>0) {
        $dynamic_sql = ','.implode($dynamic_sql);
    }

    $query = "UPDATE user
    SET date_of_birth = :date_of_birth $dynamic_sql
    WHERE
    user_id = :user_id";

    $stm = $db->prepare($query);
    $stm->execute($parameters);

这种方法将允许您继续使用预准备的语句也与动态生成的 SQL。

官方微信
官方QQ群
31647020