我正在登录页面,我是一名初学者程序员到数据库
谢谢
这是我目前所拥有的:
<?php
$Firstname = $_POST['Firstname'];
$Lastname = $_POST['Lastname'];
$Email = $_POST['Email'];
$password = $_POST['password'];
$password2 = $_POST['password2'];
if ($&&$password&&$Email&&$Firstname&&$Lastname)
{
if int strcmp ( string $password , string $password2 )
{
$connect = mysql_connect("localhost","root","power1") or die("couldn't connect!");
mysql_select_db("members") or die ("couldnt find db!");
INSERT INTO users (Firstname, Lastname, Email, password,...)
VALUES ($Firstname, $Lastname, $Email, $password, $password2,...)
}
else
die("Your Passswords do not match")
}
else
die("Please enter your credentials");
?>
最佳答案
我认为你来这里寻求帮助真是太好了,我很高兴你已经深入研究了你想做的事情。
<?php
$Firstname = $_POST['Firstname'];
$Lastname = $_POST['Lastname'];
$Email = $_POST['Email'];
$password = $_POST['password'];
$password2 = $_POST['password2'];
到目前为止,这很棒。您创建了一些变量,例如 $Firstname
,它们比 $_POST['Firstname']
更易于阅读和键入。许多 PHP 程序员都会这样做。
但是,您必须注意的是,$_POST
数组中不能保证存在任何内容。因此,像 $_POST['Firstname']
这样的东西可以是未定义的。因此,您必须先测试您想要的值是否存在。
if ($&&$password&&$Email&&$Firstname&&$Lastname)
{
我相信这里是您想要测试 POST 值是否存在的地方。不幸的是,这为时已晚,因为上面已经发生了错误。您应该考虑以这种方式启动您的程序。
<?php
if (isset($_POST['Firstname']) && isset($_POST['Lastname'])
&& isset($_POST['Email']) && isset($_POST['password'])
&& isset($_POST['password2']))
{
$Firstname = $_POST['Firstname'];
$Lastname = $_POST['Lastname'];
$Email = $_POST['Email'];
$password = $_POST['password'];
$password2 = $_POST['password2'];
// rest of script...
}
在这个例子中,我们在开始使用之前确保我们想要使用的所有 POST 值都确实存在。如果缺少 POST 值,此示例将不会遇到任何错误。
if int strcmp ( string $password , string $password2 )
{
你的想法是对的,但你实际上并不需要在 PHP 中使用 strcmp
来比较两个字符串是否相等。相反,您可以简单地使用 ==
运算符。
if ($password == $password2)
{
如果你真的想使用strcmp
,我们可以引用文档页面http://php.net/strcmp如果字符串相等,函数返回零。因此,我们可以使用它。
if (strcmp($password, $password2) == 0)
{
确定密码匹配后,您就可以对密码进行哈希处理了。请注意,散列与加密不同:散列是单向的,这意味着一旦对密码进行散列,您就无法获取散列码并取回密码;另一方面,加密可以反转。因为我们从不希望坏人知道某人的密码到底是什么,所以我们应该对密码进行散列而不是加密。
当然,哈希的强度仅与哈希算法一样好,并且有很多可用的。 sha1
非常强大,可以在您对编程更加熟悉之前一直使用它。
$password_hash = sha1($password);
您已完美连接到数据库。这里没有错。
$connect = mysql_connect("localhost","root","power1") or die("couldn't connect!");
mysql_select_db("members") or die ("couldnt find db!");
但是,您需要使用一种特殊的方式来查询数据库。
INSERT INTO users (Firstname, Lastname, Email, password,...)
VALUES ($Firstname, $Lastname, $Email, $password, $password2,...)
这个查询需要通过将它作为字符串传递给 mysql_query
函数来提供给数据库。
$sql_Firstname = mysql_real_escape_string($Firstname);
$sql_Lastname = mysql_real_escape_string($Lastname);
$sql_Email = mysql_real_escape_string($Email);
$sql_password_hash = mysql_real_escape_string($password_hash);
$sql = "INSERT INTO users (Firstname, Lastname, Email, password)"
."`VALUES ('$sql_Firstname', '$sql_Lastname', '$sql_Email', '$sql_password_hash')";
mysql_query($sql);
注意几件事。首先,我将 $password_hash
存储在数据库中,而不是 $password
。这就是我们想要的,因为我们永远不希望坏人破解数据库并找出人们的密码。其次,请注意我没有直接使用 $Firstname
来构造 SQL 字符串;相反,我只使用 $sql_Firstname
,它等同于 $Firstname
,但有特殊字符被正确转义——这就是 mysql_real_escape_string
函数做。这对于保护自己免受 SQL 注入(inject)攻击至关重要,我建议您阅读以下内容:http://php.net/manual/en/security.database.sql-injection.php .
}
else
die("Your Passswords do not match")
}
else
die("Please enter your credentials");
你的程序的其余部分做得很好;故意处理这些可能的错误情况对您有好处。确保您继续考虑所有可能性并妥善处理每一种可能性;这样做将有助于防止代码中出现未知错误和安全漏洞。
关于php - 比较php中的密码并将其发送到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6559081/