1

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

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

我希望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 未声明的错误。如果我实际上在同一页面上有查询,那么它可以正常工作,但我不希望到处都弹出大量查询。

4

3 回答 3

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
于 2013-11-09T11:24:39.950 回答
1

您的变量是在函数的本地范围内定义的,并且永远无法在函数之外访问。当然,除非您将其定义为全局。

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

所以快速修复看起来像这样:

function getUserData_FromSession() {
    global $userid;
    (...)
}
于 2013-11-09T11:26:02.757 回答
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

请注意,变量名无关紧要。也就是说,$barin$bar = test();可以是$foo$baz$bak。我们只是将函数的返回值分配给一个变量,所以名称并不重要。

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

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

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

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

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

于 2013-11-09T11:26:45.030 回答