2013-07-13 129 views
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); 
} 
+0

不要使用全局,因为这使你的代码难以读书! – Perry

回答

2

这是非常错误的,因为你并不需要在您使用prepared statements这defeates的使用预处理语句的目的使用real_escape_string()

其次,如评论部分所述,使用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(); 
} 
+0

是否需要关闭$ stmt? –

+0

@OrelBitton在'mysql'中关闭它是必要的。它是任意的,不是强制性的。 – samayo

+0

@Simon _eQ非常感谢您 –

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字符串与准备语句转义=冗余+失败。

UPDATE:

如果你只需要检查该topic_name的存在:

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

只需选择topic_id和限制1场。仍然有1个整数返回。

+1

不是,他们不是 –

+1

@YourCommonSense太棒了!巨魔的攻击...... – CodeAngry

+1

@YourCommonSense:他们不是什么? –

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

+1但是,在这种情况下,我不会建议使用'global'。 – samayo

+1

我怀疑OP是在使用单元测试。 AFAIK,这是唯一的原因(虽然我不是测试专家)不使用全局状态。 –

+0

@YourCommonSense:这很混乱,是原因。 –