准备好的陈述,在结束陈述前返回

时间:2013-07-13 14:02:39

标签: php sql

我在这里有这个函数,它将$ con变量全局化,这是mysql连接变量,主题名称由paramater获取,如你所见。我创建了一个名为count的变量来计算语句返回的行数。

我的问题是,使用这个好吗?还是有更好的方法呢?

function isTopic($topic_name){
    global $con;

    $topic_name=$con->real_escape_string($topic_name);
    $count = 0;
    if($stmt = $con->prepare("SELECT topic_id FROM topics WHERE topic_name = ?")){
        $stmt->bind_param("s",$topic_name);
        $stmt->execute();
        $stmt->store_result();
        $count = $stmt->num_rows;
        $stmt->close();
    }
    return ($count == 1);
}

3 个答案:

答案 0 :(得分:3)

为什么要返回实际的数据行只是为了计算数据?

当MySQL可以为您执行此操作时:

// if you have uniques
SELECT COUNT(`topic_id`) FROM `topics` WHERE `topic_name` = ?;
// if you have duplicates
SELECT COUNT(DISTINCT `topic_id`) FROM `topics` WHERE `topic_name` = ?;

这很简单,MySQL返回的数字不是记录,而是一个整数而不是数据结构数组。

如果您需要使用COUNT()

PS 使用预准备语句转义字符串=冗余+失败。

<强>更新

如果您只是需要检查是否存在topic_name

SELECT `topic_id` FROM `topics` WHERE `topic_name` = ? LIMIT 1; // important!

只需选择topic_id并限制为1匹配即可。仍然是1整数返回。

答案 1 :(得分:2)

这是非常错误的,因为在使用real_escape_string()时不需要使用prepared statements它会破坏使用预准备语句的目的。

其次,正如评论部分所述,由于很多原因,不鼓励使用global来获取资源对象。相反,如果您使用过程样式,则可以将对象作为函数的参数传递,否则,如果您使用OO样式进行编码,则可以应用DI(依赖注入)和获得资源。

我将假设您没有使用OOP并在此处提供程序性答案。

如果你想要返回行计数就行了。

function isTopic($conn, $topic_name){
    $stmt = $conn->prepare("SELECT topic_id FROM topics WHERE topic_name = ?");
                $stmt->bind_param("s", $topic_name);
                $stmt->execute();
         return $stmt->rowCount();
} 

答案 2 :(得分:0)

你的代码很好。但是,根据我的口味,有太多无用的代码。

如果我是你,我至少会成功

function isTopic($topic_name){
    global $con;

    $stmt = $con->prepare("SELECT topic_id FROM topics WHERE topic_name = ?");
    $stmt->bind_param("s", $topic_name);
    $stmt->execute();
    $stmt->store_result();
    return $stmt->num_rows;
}

但如果我是我自己,我就会成功

function isTopic($topic_name){
    global $con;
    $sql = "SELECT topic_id FROM topics WHERE topic_name = ?"
    return $con->getOne($sql, $topic_name);
}