Php 为什么我的全局变量不起作用?

Php 为什么我的全局变量不起作用?,php,hash,salt,Php,Hash,Salt,我正在尝试创建一个注册表单,允许潜在用户输入他们的名字和姓氏、用户名和密码。有了这个密码,我想使用PHP的哈希函数和一些“盐”来确保密码的安全。为此,我在PHP脚本中创建了一个函数以节省冗余。为了实现这一点,我将变量$connection、$iniSalt和$endSalt更改为全局变量——认为这将允许我在函数addUser()中使用它们。 有人能告诉我我做错了什么吗?任何关于如何进行的建议都将不胜感激。这是我的密码: global $connection; $connection = new

我正在尝试创建一个注册表单,允许潜在用户输入他们的名字和姓氏、用户名和密码。有了这个密码,我想使用PHP的哈希函数和一些“盐”来确保密码的安全。为此,我在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
    ...
}

此处的全局关键字文档:

您需要为函数中的这些变量声明全局范围:

function addUser($conn, $firstname, $lastname, $username, $password) {
    global $connection, $iniSalt, $endSalt;
    // Then use those global variables
    ...
}

这里的全局关键字文档:

全局关键字不是这样工作的。放置
全局$connectionaddUser()
函数顶部的code>以在函数中使用它

function addUser($conn, $firstname, $lastname, $username, $password) {
    global $connection;
    ...
}

这不是环球公司的工作方式。放置
全局$connectionaddUser()
函数顶部的code>以在函数中使用它

function addUser($conn, $firstname, $lastname, $username, $password) {
    global $connection;
    ...
}

除了其他关于全球定位的答案外,我还在关于全球定位的评论中指出:

旁注:参考我的脚注

$token
变量是一个字符串,它也必须被引用

$query = "INSERT INTO users VALUES('$firstname', '$lastname', '$username', $token)";
当您的查询启动时,您将得到一个语法错误

因此,引用变量:

$query = "INSERT INTO users VALUES('$firstname', '$lastname', '$username', '$token')";
ripemd128生成字符串,而不是整数

ripemd128 32 789d569f08ed7055e94b4289a4195012

此外,如果您打算使用它,最好使用
password\u hash()
或其兼容包

这样更安全

参考资料:

  • PHP5.5的函数
  • 兼容性包(如果PHP<5.5)
如果您决定使用
password\u hash()
或crypt,请务必注意,如果当前密码列的长度小于60,则需要将其更改为60(或更高)。手册建议长度为255

您需要更改列的长度,并使用新的哈希重新开始,以使其生效。否则,MySQL将以静默方式失败


脚注:

了解变量范围:

如果您希望防止SQL注入(这是值得做的事情),请参考以下内容:


除了关于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\u hash()
或其兼容包

这样更安全

参考资料:

  • PHP5.5的函数
  • 兼容性包(如果PHP<5.5)
如果您决定使用
password\u hash()
或crypt,请务必注意,如果当前密码列的长度小于60,则需要将其更改为60(或更高)。手册建议长度为255

您需要更改列的长度,并使用新的哈希重新开始,以使其生效。否则,MySQL将以静默方式失败


脚注:

了解变量范围:

如果您希望防止SQL注入(这是值得做的事情),请参考以下内容:


global属于函数内部。红旗=>
password VARCHAR(32)
告诉我们您没有使用安全哈希函数,或者您将其设置得太低。如果
$token
是一个字符串,那么您也需要引用它,并且看起来是一个字符串。这可能会给您带来语法错误,或者会“一次”引发该查询。@Fred ii-使用您的红旗语句…您是在暗示我需要使VARCHAR的数量远远大于32,因为哈希值将返回?@Fred ii-对否决票问题表示抱歉。你帮了我很大的忙。谢谢你花时间给我一个详细的答复。学习这个web编程有着浓厚的Java背景,所以有一个经验丰富的PHP程序员帮我做这件事真的很有帮助。最好。@zhughes3谢谢,但你不需要为那个家伙道歉。他只是有点迟钝和特别。让他投反对票,社区将看到谁对谁错。他。。。嗯,他简直是“出格了”。我们走了很长一段路,哈哈,也不是很好。pffft。我很高兴能“真诚地”帮助你。它是“诚实”和“纯洁”的。享受编码吧,cheersglobal属于函数内部。红旗=>
密码VARCHAR(32)
告诉我们您没有使用安全哈希函数,或者您将其设置得太低。如果
$token
是一个字符串,那么您也需要引用它,并且看起来是一个字符串。这可能会给您带来语法错误,或者会“一次”引发该查询。@Fred ii-使用您的红旗语句…您是在暗示我需要使VARCHAR的数量远远大于32,因为哈希值将返回?@Fred ii-对否决票问题表示抱歉。你帮了我很大的忙。谢谢你花时间给我一个详细的答复。学习这个web编程需要大量的Java背景,因此拥有一个经验丰富的PHP p真的很有帮助