在php函数中使用变量

时间:2014-03-31 20:23:58

标签: php database function variables

试图让我的网站更整洁,更简单,所以我试图将很多重复的代码转移到函数中。

我有一个函数,它接受一个I​​D参数,在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

但没有运气。

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

4 个答案:

答案 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();
    }
}