我正在浏览我的网站并试图让它更具前瞻性和更清洁,从而将很多东西转换为常用功能。
我有一个特定的函数,它接受用户会话(会话名称是用户名),并在数据库上运行查询,该查询获取该用户的所有其他数据。
我希望在某些部分使用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未声明的错误。如果我的查询实际上在同一页面上,那么它工作正常,但我不想在任何地方都出现大量的查询。
答案 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。