为什么我的全局变量不起作用?
Why do my global variables not work?
我正在尝试创建一个注册表单,允许潜在用户输入他们的名字和姓氏、用户名和密码。有了这个密码,我想使用 PHP 的散列函数和一些 "salts" 来使密码安全。为此,我在 PHP 脚本中创建了一个函数以节省冗余。为实现这一点,我将变量 $connection、$iniSalt 和 $endSalt 更改为全局变量 - 认为这将允许我在函数 addUser() 中使用它们。
有人可以告诉我我在这里做错了什么吗?任何关于如何解决这个问题的建议将不胜感激。这是我的代码:
global $connection;
$connection = new mysqli($db_host, $user, $pass, $db);
if ($connection->connect_error) {
die($connection->connect_error);
}
$query = "CREATE TABLE users (
firstname VARCHAR(32) NOT NULL,
lastname VARCHAR(32) NOT NULL,
username VARCHAR(32) NOT NULL UNIQUE,
password VARCHAR(32) NOT NULL
)";
$result = $connection->query($query);
if (!$result) {
die($connection->error);
}
global $iniSalt, $endSalt;
$iniSalt = "xb&z*";
$endSalt = "nb!@";
function addUser($conn, $firstname, $lastname, $username, $password) {
$token = hash('ripemd128', "$iniSalt$password$endSalt");
$query = "INSERT INTO users VALUES('$firstname', '$lastname', '$username', $token)";
$result = $connection->query($query);
if (!$result) {
die($connection->error);
}
}
addUser($connection, 'Bill', 'Murray', 'bmurray', 'mysecret');
addUser($connection, 'Jacki', 'Hughes', 'jhughes', 'somepw');
您需要在函数内为这些变量声明全局范围:
function addUser($conn, $firstname, $lastname, $username, $password) {
global $connection, $iniSalt, $endSalt;
// Then use those global variables
...
}
此处为全局关键字的文档:http://php.net/manual/en/language.variables.scope.php
全局变量不是这样工作的。将 global $connection;
放在 addUser()
函数的顶部,以便在您的函数中使用它。
function addUser($conn, $firstname, $lastname, $username, $password) {
global $connection;
...
}
除了关于 global 的位置给出的其他答案,我还在关于它的位置的评论中指出:
旁注:查阅我的脚注。
$token
变量是一个字符串,也必须用引号引起来。
$query = "INSERT INTO users VALUES('$firstname', '$lastname', '$username', $token)";
当您的查询启动时,您会收到一个语法错误。
所以,引用变量:
$query = "INSERT INTO users VALUES('$firstname', '$lastname', '$username', '$token')";
ripemd128 生成一个字符串,而不是一个整数
ripemd128 32 789d569f08ed7055e94b4289a4195012
此外,如果您打算使用它,最好使用 password_hash()
或它的兼容包。
安全多了。
参考文献:
- PHP 5.5 的
password_hash()
函数。
- 兼容包(如果PHP < 5.5)https://github.com/ircmaxell/password_compat/
如果您决定使用 password_hash()
或 crypt,请务必注意,如果您当前密码列的长度低于 60,则需要将其更改为(或更高) ).手册建议长度为255.
您需要更改列的长度并使用新的散列重新开始才能生效。否则,MySQL 将默默地失败。
脚注:
阅读变量作用域:
- http://php.net/manual/en/language.variables.scope.php
- Reference: What is variable scope, which variables are accessible from where and what are "undefined variable" errors?
如果您希望防止 SQL 注入,这是值得做的事情,请参考以下内容:
我正在尝试创建一个注册表单,允许潜在用户输入他们的名字和姓氏、用户名和密码。有了这个密码,我想使用 PHP 的散列函数和一些 "salts" 来使密码安全。为此,我在 PHP 脚本中创建了一个函数以节省冗余。为实现这一点,我将变量 $connection、$iniSalt 和 $endSalt 更改为全局变量 - 认为这将允许我在函数 addUser() 中使用它们。 有人可以告诉我我在这里做错了什么吗?任何关于如何解决这个问题的建议将不胜感激。这是我的代码:
global $connection;
$connection = new mysqli($db_host, $user, $pass, $db);
if ($connection->connect_error) {
die($connection->connect_error);
}
$query = "CREATE TABLE users (
firstname VARCHAR(32) NOT NULL,
lastname VARCHAR(32) NOT NULL,
username VARCHAR(32) NOT NULL UNIQUE,
password VARCHAR(32) NOT NULL
)";
$result = $connection->query($query);
if (!$result) {
die($connection->error);
}
global $iniSalt, $endSalt;
$iniSalt = "xb&z*";
$endSalt = "nb!@";
function addUser($conn, $firstname, $lastname, $username, $password) {
$token = hash('ripemd128', "$iniSalt$password$endSalt");
$query = "INSERT INTO users VALUES('$firstname', '$lastname', '$username', $token)";
$result = $connection->query($query);
if (!$result) {
die($connection->error);
}
}
addUser($connection, 'Bill', 'Murray', 'bmurray', 'mysecret');
addUser($connection, 'Jacki', 'Hughes', 'jhughes', 'somepw');
您需要在函数内为这些变量声明全局范围:
function addUser($conn, $firstname, $lastname, $username, $password) {
global $connection, $iniSalt, $endSalt;
// Then use those global variables
...
}
此处为全局关键字的文档:http://php.net/manual/en/language.variables.scope.php
全局变量不是这样工作的。将 global $connection;
放在 addUser()
函数的顶部,以便在您的函数中使用它。
function addUser($conn, $firstname, $lastname, $username, $password) {
global $connection;
...
}
除了关于 global 的位置给出的其他答案,我还在关于它的位置的评论中指出:
旁注:查阅我的脚注。
$token
变量是一个字符串,也必须用引号引起来。
$query = "INSERT INTO users VALUES('$firstname', '$lastname', '$username', $token)";
当您的查询启动时,您会收到一个语法错误。
所以,引用变量:
$query = "INSERT INTO users VALUES('$firstname', '$lastname', '$username', '$token')";
ripemd128 生成一个字符串,而不是一个整数
ripemd128 32 789d569f08ed7055e94b4289a4195012
此外,如果您打算使用它,最好使用 password_hash()
或它的兼容包。
安全多了。
参考文献:
- PHP 5.5 的
password_hash()
函数。 - 兼容包(如果PHP < 5.5)https://github.com/ircmaxell/password_compat/
如果您决定使用 password_hash()
或 crypt,请务必注意,如果您当前密码列的长度低于 60,则需要将其更改为(或更高) ).手册建议长度为255.
您需要更改列的长度并使用新的散列重新开始才能生效。否则,MySQL 将默默地失败。
脚注:
阅读变量作用域:
- http://php.net/manual/en/language.variables.scope.php
- Reference: What is variable scope, which variables are accessible from where and what are "undefined variable" errors?
如果您希望防止 SQL 注入,这是值得做的事情,请参考以下内容: