0

我在这里有这个函数,它全局化了 $con 变量,它是 mysql 连接变量,主题名称由参数获取,如您所见。我创建了一个名为 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);
}
4

3 回答 3

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 个整数返回。

于 2013-07-13T14:05:31.147 回答
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();
} 
于 2013-07-13T14:05:23.910 回答
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);
}
于 2013-07-13T14:17:25.450 回答