在php函数中使用变量

在php函数中使用变量,php,database,function,variables,Php,Database,Function,Variables,试图使我的网站更整洁,维护更简单,所以我尝试将大量重复的代码转移到函数中 我有一个函数,它接受一个ID参数,在where claus中使用这个ID运行数据库检查,然后为返回的rowCount设置一个新变量 但是,它始终返回0/无 我举了一个简单的例子来说明我在做什么: $buildID = 5; function select_All_Comments_From_ID($buildID){ $idNew = $buildID; global $idNew } sele

试图使我的网站更整洁,维护更简单,所以我尝试将大量重复的代码转移到函数中

我有一个函数,它接受一个ID参数,在where claus中使用这个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
但是没有运气

代码本身在不在函数中时工作。

更改

$countComments = $stmt->rowCount();
global $countComments;


顺便说一句,注释是正确的,这是一个糟糕的解决方案,您应该真正更改它。

您必须在函数外部定义$countComments,即使它在函数内部定义为全局

例如:

<?php
$a = 1;
$b = 2;

function Sum()
{
    global $a, $b;

    $b = $a + $b;
} 

Sum();
echo $b;
?>

您可以从函数返回值,而不是使用全局值,如下所示:

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;
调用函数时,需要一个变量来捕获返回值,如下所示:

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;
全局$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
}
对你来说呢

function select_All_Comments_From_ID($buildID){
    $idNew = $buildID;
        global $idNew
}
函数将值写入其本地$idNew,然后idNew的查找切换到全局范围-但这不会将本地值复制到全局范围;只是查找已更改

无论如何,正如前面指出的,您确实应该返回值,而不是全局设置它们。如果您感兴趣的只是表中匹配记录的数量,而不是记录的有效负载数据,请使用SELECT计数。。。查询否则,脚本会将所有数据从数据库服务器传输到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();
    }
}

这是一种可怕的方式。只需返回值并将其分配给变量即可。这是一种让下一个做这件事的人变得暴力的代码。我不希望这种事情发生。。。我能问一下为什么很糟糕吗?正确的方法是什么?你说只返回值是什么意思?函数的构建是为了提供一种基于输入和算法生成输出的简单方法。您所做的并不是严格正确的,因为函数正在修改一个全局变量。通常你应该只使用return$countComments;并在外部调用函数,如$myvar=select\u ALL\u Comments\u Fom\u ID$myid。OP询问为什么$idNew aka$countComments将显示0/无。我提供的是为全局变量赋值的正确语法@user2921557抱歉我把事情搞砸了睡意会很糟糕,更新。