试图让我的网站更整洁,更简单,所以我试图将很多重复的代码转移到函数中。
我有一个函数,它接受一个ID参数,在where子句中使用此ID运行数据库检查,然后为返回的rowCount设置一个新变量。
然而它一直返回0 /没有。
我已经做了一个简单的例子:
$buildID = 5;
function select_All_Comments_From_ID($buildID){
$idNew = $buildID;
global $idNew
}
select_All_Comments_From_ID($buildID);
echo $idNew;
知道为什么会这样吗?
以下是它的实际情况:
function select_All_Comments_From_ID($buildID){
$query = " SELECT * FROM comments WHERE buildID = :buildID";
$query_params = array(':buildID' => $buildID);
try {
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
$row = $stmt->fetch();
$countComments = $stmt->rowCount();
global $countComments;
}
catch(PDOException $ex) { die();
}
}
我正在尝试使用
$countComments
但没有运气。
代码本身在不在函数中时起作用。
答案 0 :(得分:0)
变化
$countComments = $stmt->rowCount();
global $countComments;
在
$GLOBALS['countComments'] = $stmt->rowCount();
顺便说一下,评论是对的,这是一个糟糕的解决方案,你应该真的改变它。
答案 1 :(得分:0)
您必须在函数外部定义$ countComments,即使它在函数内部定义为全局。
示例:
<?php
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
?>
答案 2 :(得分:0)
您可以从函数返回一个值,而不是使用Global,如下所示:
function select_All_Comments_From_ID($buildID){
$query = " SELECT * FROM comments WHERE buildID = :buildID";
$query_params = array(':buildID' => $buildID);
try {
$stmt = $db->prepare($query);
$stmt->execute($query_params);
$row = $stmt->fetch();
$countComments = $stmt->rowCount();
return $countComments; //sends the value back outside the scope of the function
}
catch(PDOException $ex) { die(); }
}
调用函数时,需要一个变量来捕获返回值,如下所示:
$buildID = 5;
$countComments = select_All_Comments_From_ID($buildID);
echo $countComments;
答案 3 :(得分:0)
global $idNew
会在执行变量查找时影响变量查找 - 而不是之前。例如。看看
<?php
$a = 9;
foo();
function foo() {
$a = 5; // this sets the value for the variable in the local lookup table
echo $a, "\r\n"; // scope of $a is still local -> 5
global $a; // now the lookup for "a" is switched to the global scope
echo $a, "\r\n"; // $a "points" to the global value -> 9
}
输出
5
9
,在你的情况下
function select_All_Comments_From_ID($buildID){
$idNew = $buildID;
global $idNew
}
函数将值写入其本地$ idNew,然后idNew
的查找切换到全局范围 - 但是不会将本地值复制到全局范围;只是查找已更改。
无论如何,如前所指出的,你真的应该返回值而不是全局设置它们。如果您感兴趣的只是表中(匹配)记录的数量 - 而不是记录的有效负载数据 - 请使用SELECT Count(...)
查询。否则,您的脚本会将数据库服务器中的所有数据传输到您的php实例的内存空间......除了加热CPU和内存之外什么都没有。
function select_All_Comments_From_ID($buildID){
$query = " SELECT Count(*) as c FROM comments WHERE buildID = :buildID";
$query_params = array(':buildID' => $buildID);
try {
// what's $db here ?
// neither has it been passed to the function nor is it fetched from the global scope
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
$row = $stmt->fetch();
return $row['c'];
}
catch(PDOException $ex) {
// using die(...) is crude, even more so without any notice/text
die();
}
}