我在这里有这个函数,它将$ 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);
}
答案 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);
}