2012-11-17 68 views
1

我有一个while循环遍历从SQL查询返回的行。该行中特定列的值存储在一个数组中。然后迭代数组,并将每个元素与来自用户的输入进行比较。如果输入匹配一个数组元素,那么布尔变成true。我正在尝试这样做,以便用户可以输入密码以访问特定页面。但它不起作用。我已经打印了数组中的所有值以及输入,所以我知道那里没有问题。但由于某种原因,if语句并没有对它们进行比较。代码如下:为什么if语句在这个循环中不起作用? PHP

if (isset($_POST['ok'])) { 
    $password = $_POST['pass']; 
    $matched = false; 
    $pw = array(); 
    mysql_connect("localhost", "xxx", "xxx")or die("Error"); 
    mysql_select_db("details")or die("Error"); 
    $query="SELECT * FROM members"; 
    $result=mysql_query($query); 
    while ($row = mysql_fetch_assoc($result)){ 
    $pw[] = $row["pass"]; 
    } 
    foreach($pw as $p){ 
    if(strcmp($p, $password) == 0){ 
     $matched = true; 
    } 
    } 
    if ($matched==true) { 
    //Membership page 
    } else { 
    //Error message 
    } 
} else { 
    .... 
+1

试着改变你的循环中的foreach($ PW为$ P){ 如果($ P == $密码){$ 匹配= TRUE;打破; } } –

+5

不要忘记**不要**存储简单的密码,使用**哈希算法**! – HamZa

+1

你有没有想过大小写敏感的问题? –

回答

0

找到一个匹配后需要休息一下,这样$ matched才会等于true。

if (isset($_POST['ok'])) { 

$password = $_POST['pass']; 
$matched = false; 
$pw = array(); 

mysql_connect("localhost", "xxx", "xxx")or die("Error"); 
mysql_select_db("details")or die("Error"); 
$query="SELECT * FROM members"; 
$result=mysql_query($query); 

while ($row = mysql_fetch_assoc($result)){ 
$pw[] = $row["pass"]; 
} 

foreach($pw as $p){ 
    if(strcmp($p, $password) == 0){ 
    $matched = true; // found match so break out and do the membership. 
    break; 
} 
} 

    if ($matched==true) { 

     //Memebrship page 

    } else { 

     //Error message 
    } 

} else { 

.... 
+2

,它可以更快地执行脚本,但不会改变结果行为中的任何内容,因为他没有'else {$ matched = false}块在第二个(不必要的)循环 –

+0

Unfortunatley这不会做任何事情 – Matt9Atkins

1

这将是更加容易和高效的查询更改为类似这样

$dbh = mysql_connect("localhost", "xxx", "xxx") or die("Error"); 
mysql_select_db("details", $dbh) or die("Error"); 

$pass = mysql_real_escape_string($_POST['pass'], $dbh); 
$user = mysql_real_escape_string($_POST['user'], $dbh); 

$sqlQuery = <<< EOQ 
    SELECT 
     * 
    FROM 
     `members` 
    WHERE 
     `user` COLLATE utf8_bin = '{$user}' COLLATE utf8_bin 
     AND 
     `password` COLLATE utf8_bin = '{$pass}' COLLATE utf8_bin 
EOQ; 

$result = mysql_query($sqlQuery); 
if ($result and (mysql_num_rows($result) === 1) { 
     echo "success"; 
     $userDetails = mysql_fetch_assoc($result); 
} else { 
     echo "username or password wrong"; 
} 

编辑:更新后的用户名和密码检查是情况在任何情况下

EDIT2敏感:以上评论提醒不要存储密码明文。要更改为散列密码

UPDATE members SET pass = SHA1(pass); 

然后你的支票改为

... AND pass = SHA1('{$pass}') 
+0

我不这样做的原因是因为我需要将列值存储在一个数组中,因为它们将在以后再次用于 – Matt9Atkins

+0

如果您需要所有用户记录稍后会将其取出。特别是在这种情况下,保持干净和简单,并分开不属于这里的东西(单独的认证和其他用户数据处理) –

+0

我不明白为什么人们仍然使用过时的'mysql'模块而不是'mysqli '模块或PDO与预处理语句... – leemes

0

Sugestions:

1)更换直接MySQL的函数PDO调用:(这将不需要任何转义,因为PDO将处理一切)

$mysql_host = "localhost"; 
$mysql_user = "xxx"; 
$mysql_password = "xxx"; 
$mysql_database = "details"; 
$dbLink = new PDO("mysql:host=$mysql_host;dbname=$mysql_database;charset=utf8", $mysql_user, $mysql_password, array(PDO::ATTR_PERSISTENT => true)); 
$query = db()->prepare("select * from members WHERE pass = ? limit 1"); 
$query->execute(array($_POST['pass'])); 
$query->setFetchMode(PDO::FETCH_ASSOC); 
$myMember = $query->fetch(); 
$query->closeCursor(); 

2)如果你想坚持你的代码,y您可以使用$pwd = mysql_real_escape_string($_POSt['pass'])作为发布的密码,然后选择包含转义接收密码$pwd的行。另外,别忘了mysql_free_result($result); !!!

3)做一个密码的哈希值,因此你不需要使用mysql_real_escape_string。使用$pwHash = md5($_POST['pass'])$pwHash = sha1($_POST['pass'])或任何组合。

4)请对齐您的代码。它将使人们更容易理解回答您的问题(提供帮助)以及将来的维护(您或其他人;相信我,您将在2-3年内忘记代码)。

5)你的代码应该工作,我不知道为什么它不。尝试为$pw添加var_dump,并在密码匹配时在屏幕上写入内容。也许你换了页面(成员有错误)

+0

我为$ pw添加了var_dump,并且我还为输入文本做了var_dump ....并且从中我可以看到该数组包含输入字符串。所以我知道有一个匹配,它只是看起来不是做实际比较,然后将布尔值更改为true – Matt9Atkins

+0

连接到数据库时使用了什么字符编码?字符编码可能会改变比较吗? – ro0ter

+0

也尝试在'for'循环内回显您正在与'strcmp'比较的参数。看你在哪里。你可以在你设置匹配为真的地方添加一个echo来说服你自己,代码运行良好 – ro0ter

0

为什么foreach循环?你可以这样说:

if (isset($_POST['ok'])) { 
    $password = $_POST['pass']; 
    $matched = false; 
    $pw = array(); 
    mysql_connect("localhost", "xxx", "xxx")or die("Error"); 
    mysql_select_db("details")or die("Error"); 
    $query="SELECT * FROM members"; 
    $result=mysql_query($query); 
    while ($row = mysql_fetch_assoc($result)){ 
    $pw[] = $row["pass"]; 
    } 
    $pw_tmp = flip_array($pw); 

    if(isset($pw_tmp[$password])){ 
     //Membership page 
    }else{ 
     //Error message 
    } 
}else{ 
    // something else ... 
} 
相关问题