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
的第二种情况实际上可以是任何变量,并且不必与第一个相同。