Php &引用;注意:未定义变量";但变量是在函数中声明的

Php &引用;注意:未定义变量";但变量是在函数中声明的,php,function,variables,pdo,undefined,Php,Function,Variables,Pdo,Undefined,我正在浏览我的网站,并试图使其更具前瞻性和更干净,以便将许多东西转换为通用功能 我有一个特殊的函数,它接受用户会话(会话名称是用户名),并在数据库上运行查询,为该用户获取所有其他数据 我希望在某些部分使用userID,但我收到错误“注意:未定义变量” 这是一个例子: function getUserData_FromSession() { if (isset($_SESSION['user'])) { $username = "root"; $password = "root

我正在浏览我的网站,并试图使其更具前瞻性和更干净,以便将许多东西转换为通用功能

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

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

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

函数确实返回一个值。您尚未使用该功能,但应该使用

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

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

函数确实返回一个值。您尚未使用该功能,但应该使用

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

您的变量是在函数的局部范围内定义的,在函数外部永远无法访问。当然,除非你把它定义为全局的

因此,快速修复方法如下所示:

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

您的变量是在函数的局部范围内定义的,在函数外部永远无法访问。当然,除非你把它定义为全局的

因此,快速修复方法如下所示:

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

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

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

echo $bar;
上述代码还将输出
未定义变量
错误

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

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

$bar = test(); // $bar could be any other variable
echo $bar; // => stuff
请注意,变量名并不重要。也就是说,
$bar=test()中的
$bar
可以是
$foo
$baz
$bak
。我们只是将函数的返回值赋给一个变量,所以名称并不重要

如果出于某种原因不能使用上述方法,则可以将该变量声明为
全局
,如下所示:

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

test();
echo $bar; // => stuff
使用
global
s通常被认为是不好的做法,但这样做可以完成任务


使用PDO查询数据库是一件好事,但为了让它更好,可以使用参数化查询。它有助于防止。

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

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

echo $bar;
上述代码还将输出
未定义变量
错误

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

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

$bar = test(); // $bar could be any other variable
echo $bar; // => stuff
请注意,变量名并不重要。也就是说,
$bar=test()中的
$bar
可以是
$foo
$baz
$bak
。我们只是将函数的返回值赋给一个变量,所以名称并不重要

如果出于某种原因不能使用上述方法,则可以将该变量声明为
全局
,如下所示:

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

test();
echo $bar; // => stuff
使用
global
s通常被认为是不好的做法,但这样做可以完成任务


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

initalize$userid=“”;在起始级别,可以使用userid的返回类型,也可以包含函数文件,如include('./includes/yourfuntion.php');您想要$userid值的地方。很抱歉,您的代码既不能证明未来,也不能保持干净。而且使用PDO也做得不好!如果您可以将此更改为使用参数化,您将更加安全-这是避免SQL注入的最佳方法。@halfer您是认真的吗?你称之为“很多”?表示目前存在任何保护?初始化$userid=“”;在起始级别,可以使用userid的返回类型,也可以包含函数文件,如include('./includes/yourfuntion.php');您想要$userid值的地方。很抱歉,您的代码既不能证明未来,也不能保持干净。而且使用PDO也做得不好!如果您可以将此更改为使用参数化,您将更加安全-这是避免SQL注入的最佳方法。@halfer您是认真的吗?你称之为“很多”?意味着现在有任何保护吗?为了清楚起见,值得指出的是,
$variable
的第二种情况实际上可以是任何变量,并且不必与第一种情况相同。为了清楚起见,值得指出的是,
$variable
的第二种情况实际上可以是任何变量,并且不必与第一个相同。