密码比较,为什么不工作?

时间:2010-10-13 18:46:14

标签: php

我用它来比较输入的密码和确认密码。无论如何,它都会创造用户。为什么这样?

这是数据库代码 -

$connect = @mysql_connect ($host, $username, $password) or die ('error');
$select = @mysql_select_db($db_name, $connect) or die('check');
$username=stripslashes(trim($_POST['username']));
$select_record="select * from users where username=' ".$username."' ";
$select_query=mysql_query($select_record)  or die (mysql_error());
if(mysql_num_rows($select_query)==0)

{
    $fullname = stripslashes(trim($_POST['fullname']));
    $email = stripslashes(trim($_POST['email']));
    $website = stripslashes(trim($_POST['website']));
    $username = stripslashes(trim($_POST['username']));
    $password = stripslashes(trim($_POST['password']));
    $add_new="insert into users (fullname,email,website,username,password) values ('$fullname','$email','$website','$username','$password')";
    $add_query=mysql_query($add_new) or die(mysql_error());
    if($add_query)
    {
        echo "Awesome! You are now a member";
    }
}
else
echo "Please try again";
?>

以上连接,我有我的数据库用户名和密码。

修改,这是我目前的代码 -

<div id="form"><form action="registersuccess.php" method="post">
Full Name<br />
<input type="text" name="fullname"/>
<br /><br />
Website<br />
<input type="text" name="site"/><br /><br />
Email<br />
<input type="text" name="email"/><br /><br />
Username<br />
<input type="text" maxlength="255" name="username"/><br />
<br />
Password<br />
<input type="password" name="password"/><br />
<br />
Confirm Password<br />
<input type="password" name="confirmpass"/><br />
<br />
<p class="submit"><input type="submit" value="Create my Account"/></p>

</form>

<?php
$pass = $_POST['password']; 
$cpass = $_POST['confirmpass'];
$cmp = strcmp($pass, $cpass);

if ($cmp != 0)
{
    echo "check password";
}
else
{
    return true;
}
?>

7 个答案:

答案 0 :(得分:10)

这里有许多明显的语法。您似乎甚至没有看到任何通知/警告(关于未定义的变量,未定义的常量等),因此您最好编辑php.ini以启用错误报告(至少为E_NOTICE或所以),或者在脚本的开头添加:

error_reporting(E_ALL);

这将使语法“错误”(意味着它们不是实际的解析错误,但仍然是键入错误,这些错误被PHP识别为其他东西)更容易捕获,因为PHP会打印告诉它的消息如果您的代码有任何可疑之处,以及哪些文件/行。

现在解决代码的实际问题。


您需要将strcmp()的结果分配给变量,然后检查该变量。此外,您可以将if条件更改为$cmp != 0,因为您正在测试任何类型的不等式,即您正在测试is not 0

$cmp = strcmp($pass, $cpass);

if ($cmp != 0)
...

实际上,通过这样做,您可以完全绕过必须使用临时变量,并将函数调用的结果传递给条件语句:

if (strcmp($pass, $cpass) != 0)

或直接比较字符串而不是比较strcmp()结果:

if ($pass != $cpass)

此外,正如其他人指出的那样,您的POST值分配错误,它们应该是相反的方式,否则您将覆盖$_POST的值。您也可以删除数组键的括号( ),因为它们根本不需要:

$pass = $_POST['password']; 
$cpass = $_POST['confirmpass']; 

答案 1 :(得分:3)

如果你想使用strcmp,你需要以某种方式处理它的返回值,或者将它临时存储在一个变量中,例如:

$cmpResult = strcmp($pass, $cpass);
if ($cmpResult > 0 || $cmpResult < 0) {
    // …
}

或者您直接使用返回的值并将其与0进行比较:

if (strcmp($pass, $cpass) !== 0) {
    echo "password check";
}

但您也可以直接比较变量值:

if ($pass !== $cpass) {
    echo "password check";
}

答案 2 :(得分:1)

Password<br />
<input type="password" name="password"/><br />
<br />
Confirm Password<br />
<input type="password" name="confirmpass"/><br />
<br />
<?php
  $pass = $_POST['password']; // previously you assigned undefined variable to $_POST element. Also no need for () when accessing array element
  $cpass = $_POST[('confirmpass')]; 
  $compare = strcmp($pass, $cpass);  //previously function return value wasn't assigned to any variable

 if ($compare !== 0) //some optimization
   {
     echo "password check";
   }
 else
 {
   return true;
 }
?>

答案 3 :(得分:1)

$_POST[('password')] = $pass; 
$_POST[('confirmpass')] = $cpass;

不应该是其他方式吗?

$pass = $_POST['password'];
$cpass= $_POST['confirmpass'];

答案 4 :(得分:0)

您是否在表格中查看同一页面?如果是,则未设置$_POST,因此$pass = $cpass = ''

答案 5 :(得分:0)

我可以看到的一些问题:

您需要从$_POST数组中获取值而不为其赋值。
在访问数组元素时,您实际上不需要括号(尽管它的不是使用它的错误。),因此要获取数组'foo'中的键$arr的值,您可以使用$arr['foo']

所以你需要:

$pass = $_POST['password']; 
$cpass = $_POST['confirmpass']; 

接下来,使用strcmp函数比较两个字符串,如果两个字符串相等则返回0,如果不同则返回非零。所以你可以这样做:

if( strcmp($pass, $cpass) !== 0) {
  // passwords differ
}

答案 6 :(得分:0)

如果您实际将值分配给已发布的数据而不是相反,则可能会有所帮助。在提出这些问题之前,请花些时间学习基础知识。

即。 $ pass = $ _POST ['pass'];等