Php 准备好的报表,结账前返回报表

Php 准备好的报表,结账前返回报表,php,sql,Php,Sql,我这里有一个函数,它全局调用$con变量,这是mysql连接变量,正如您所看到的,主题名由一个参数获取。我创建了一个名为count的变量,用于计算语句返回的行数 我的问题是,使用这个可以吗?还是有更好的方法 function isTopic($topic_name){ global $con; $topic_name=$con->real_escape_string($topic_name); $count = 0; if($stmt = $con->

我这里有一个函数,它全局调用$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);
}

这是非常错误的,因为在使用
prepared语句时,不需要使用
real\u escape\u string()
,这就违背了使用prepared语句的目的

其次,正如注释部分所述,出于很多原因,不鼓励使用
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();
} 

这是非常错误的,因为在使用
prepared语句时,不需要使用
real\u escape\u string()
,这就违背了使用prepared语句的目的

其次,正如注释部分所述,出于很多原因,不鼓励使用
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();
} 

为什么要返回实际的数据行来进行计数?

当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:使用准备好的语句进行字符串转义=冗余+失败

更新:

如果您只需要检查是否存在该
主题\u名称


只需选择
主题id
,并限制为1个匹配项。仍然返回1个整数。

为什么要返回实际的数据行来进行计数?

当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:使用准备好的语句进行字符串转义=冗余+失败

更新:

如果您只需要检查是否存在该
主题\u名称


只需选择
主题id
,并限制为1个匹配项。仍然是1整数返回。

您的代码非常正确。然而,有太多无用的代码符合我的口味

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

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);
}

你的代码很好。然而,有太多无用的代码符合我的口味

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

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);
}


是否需要关闭$stmt?@OrelBitton它与在
mysql
中关闭它一样需要。这是任意的,不是强制性的。@Simon _eQ非常感谢你。如果你告诉我我应该使用全局变量,我应该在每个类中创建一个私有变量来存储数据库,构造函数会将数据库作为参数并将其设置为类数据库吗?这取决于你是否使用
OOP
。如果你是,那么将你的财产私有化,并通过你的承包商注入资源。否则,只需传递一个参数(如我的答案所示)一个变量,即
$conn
将资源传递给您的查询,是否需要关闭$stmt?@OrelBitton它与在
mysql
中关闭它一样需要。这是任意的,不是强制性的。@Simon _eQ非常感谢你。如果你告诉我我应该使用全局变量,我应该在每个类中创建一个私有变量来存储数据库,构造函数会将数据库作为参数并将其设置为类数据库吗?这取决于你是否使用
OOP
。如果你是,那么将你的财产私有化,并通过你的承包商注入资源。否则,只需传递一个参数(如我的答案所示)一个变量,即
$conn
就可以将资源传递给查询,不要使用全局变量,因为这会使代码难以阅读!不要使用global,因为这会使您的代码难以阅读!我怀疑OP使用的是单元测试。好吧,这是不使用全局状态的唯一原因(尽管我不是测试专家)。@YourCommonSense:这很混乱,这就是原因。好吧,这就是原因。假设它对我来说从来没有混乱过,那就让它保持原样吧。我怀疑OP使用的是单元测试。好吧,这是不使用全局状态的唯一原因(尽管我不是测试专家)。@YourCommonSense:这很混乱,这就是原因。好吧,这就是原因。假设这件事对我来说从来都不是乱七八糟的,那就让它保持原样吧。@YourCommonSense:他们不知道什么?如果这个简单的案子需要一个答案,他们不想数一行explanation@YourCommonSense他使用
rowCount
。如果他只是想检查是否存在。。。我将更新这个示例。条件($count==1)是非常自我的-explanatory@YourCommonSense编辑了答案。看见在你的第一次评论中提到这一点是多么容易。有时我看不到森林,因为有那么多树:)@YourCommonSense:他们不知道什么?如果这个简单的案件需要一个答案,他们不想数一数explanation@YourCommonSense他使用
rowCount
。如果他只是想