“注意:未定义的变量”但变量在函数中声明

时间:2013-11-09 11:20:47

标签: php function variables pdo undefined

我正在浏览我的网站并试图让它更具前瞻性和更清洁,从而将很多东西转换为常用功能。

我有一个特定的函数,它接受用户会话(会话名称是用户名),并在数据库上运行查询,该查询获取该用户的所有其他数据。

我希望在某些部分使用userID,但我收到错误“通知:未定义的变量”

这是一个例子:

function getUserData_FromSession() {
if (isset($_SESSION['user'])) {

    $username = "root"; 
    $password = "root"; 
    $host = "localhost"; 
    $dbname = "06vids";

    $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); 
    try 
    { 
    $db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options); 
    } 
    catch(PDOException $ex) 
    { 
    die("Failed to connect to the database: " . $ex->getMessage()); 
    } 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 

    $stmt = $db->prepare('SELECT * FROM users WHERE username = "' . $_SESSION['user']. '"');
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    while($row = $stmt->fetch()){
    $userid = $row['id'];
    $usernameuser = $row['username'];
    }

}
 }

该功能位于页面中包含的函数文件中,在该页面上执行此操作:

 getUserData_FromSession();

 if ($userid == $userbuildid) {
    $editenabled = 'edity';
} else if ($userid !== $userbuildid) {
    $editenabled = 'editx';
}

这给出了$ userid未声明的错误。如果我的查询实际上在同一页面上,那么它工作正常,但我不想在任何地方都出现大量的查询。

3 个答案:

答案 0 :(得分:2)

函数内部使用的变量在外面无效!这实际上是一件好事,因为如果你在函数中,你不需要记住哪些名字已被用作变量。

函数确实返回一个值。你没有使用过这个功能,但你应该这样做。

function whatever() {
    $variable = "bar"; // no effect outside this function!
    return "foo";
}

echo $variable; // Notice: undefined variable

$variable = whatever();
echo $variable; // outputs foo

$anythingelse = whatever();
echo $anythingelse; // outputs foo

答案 1 :(得分:1)

您的变量在函数的本地范围内定义,永远不会在其外部访问。当然,除非你把它定义为全球。

http://php.net/manual/en/language.variables.scope.php

所以快速解决方案看起来像这样:

function getUserData_FromSession() {
    global $userid;
    (...)
}

答案 2 :(得分:1)

$userid变量在函数范围之外不存在。如果你想在函数之外使用它,也许你应该return它。

function test() {
   $bar = 'stuff';  // references to local scope variable
}

echo $bar;

上述代码也会输出Undefined variable错误。

如果您想在函数外部访问$bar变量,可以执行以下操作:

function test() {
    $bar = 'stuff'; 
    return $bar;
}

$bar = test(); // $bar could be any other variable
echo $bar; // => stuff

请注意,变量名称无关紧要。也就是说,$bar中的$bar = test();可以是$foo$baz$bak。我们只是将函数的返回值赋给变量,因此名称无关紧要。

如果由于某种原因你不能使用上述方法,那么你可以将变量声明为global,如下所示:

function test() {
    global $bar;
    $bar = 'stuff'; 
}

test();
echo $bar; // => stuff

使用global通常被认为是不好的做法,但这可以完成工作。

使用PDO查询数据库是一件好事,但为了使其更好,您可以使用参数化查询。它可以帮助您阻止SQL injections