我怎样才能提高效率(一遍又一遍不重复同样的事情)?

时间:2014-08-15 06:14:59

标签: php

我应该如何清理/提高我的PHP“比较此字符串”部分的效率?

    <?php 
session_start();

     $_SESSION['name']  = $_POST['name'];
     $_SESSION['pass']  = $_POST['password'];

     //read the contents of our password file.
     $myFile = "password.txt";
     $fh = fopen($myFile, 'r');
     $data = fgets($fh);
     fclose($fh);

     //echo the data from the text file - I've edited this out so it doesn't display the data
    //echo $data;

     //print out an HTML line break
     //print "<br>";

     //now we need to split our line of data from the text
     //file so that we can do the comparison.

     //split the text into an array
     $text = explode(":",$data);

     //echo the split user name  - I've edited this out so it doesn't display the data
     //echo $text[3];

     //print out an HTML line break
     print "<br>";

     //echo the split password  - I've edited this out so it doesn't display the data
     //echo $text[1];

     //assign the data to variables
     $good_name = $text[0].$text[2];
     $good_pass = $text[1].$text[3];

     //print out an HTML line break
     //print "<br>";

     //compare the strings
     if( $_SESSION['name'] === $text[0] && $_SESSION['pass'] === $text[1] or $_SESSION['name'] === $text[2] && $_SESSION['pass'] === $text[3] or  $_SESSION['name'] === $text[4] && $_SESSION['pass'] === $text[5]){
        //echo "That is the correct log-in information";
        header("Location: home.php");
     }else{
        echo "That is not the correct log-in information.";
     }
  ?>    

我不希望每次添加新用户时都要添加一个全新的 OR 实例,就像在当前代码中完成一样。有没有办法让它更有效率?

3 个答案:

答案 0 :(得分:1)

对于初学者:不要存储明文密码。不在任何数据库中,当然也不在文本文件中。

因此,我从您的评论中收集到的是,您的文件中有一行文本,其中包含用冒号分隔的用户名和密码的交替字段。

在那种情况下:

$data = file_get_contents("password.txt");
$data = explode(":", $data);

if (count($data) % 2 != 0)  // Error, no even number of fields in password file
    return;

$loggedIn = false;
for ($i = 0; $i < count($data) / 2; $i += 2)
{
    $user = $data[$i];
    $pass = $data[$i + 1];

    if ($user == $_SESSION['name'] && $pass == $_SESSION['pass'])
    {
        $loggedIn = true;
        break;
    }
}
if ($loggedIn)
{
    // Do stuff
}

我真的建议不要使用文本文件密码方法并阅读一些MySQL / PDO教程。

您还必须确保没有用户名/密码包含冒号。

答案 1 :(得分:0)

可能Regular Expressions正是你要找的。

根据您对问题的评论,以下是我正在考虑的一些示例代码:

$file = 'user:password:admin:password:Me:MyPass';
$name = preg_quote($_SESSION['name']);
$pass = preg_quote($_SESSION['pass']);
preg_match("/" . $name . ":" . $pass . "/", $file);

您必须立即解析文件的全部内容。 file_get_contents()也应该在此提供帮助。

但总的来说:从不存储纯文本密码。您总是应该使用加密强哈希算法对它们进行哈希处理。不要使用MD5,不要使用SHA。考虑使用bcrypt,scrypt或PBDKF2,成本高,最好是盐。

无论如何:使用数据库,它们可以让您的生活更轻松;)

答案 2 :(得分:-1)

最好重新安排password.txt,将用户分为;,用户名和密码按:分隔,例如:user1:pass1;user2:pass2。然后你可以使用这段代码:

<?php
session_start();

//read the contents of our password file.
$myFile = "password.txt";
$fh = fopen($myFile, 'r');
$data = fgets($fh);
fclose($fh);

$temp = explode(';',$data); // split the file into user:pass
$users = array();
foreach( $temp as $userdata) {
    $user = explode(':', $userdata); // split username and pass
    $users[ $user[0] ] = $user[1]; // put it in an array
}


if( isset( $users[ $_POST['name'] ] ) and $users[ $_POST['name'] ] == $_POST['password']  ) {
     $_SESSION['name']  = $_POST['name'];
     $_SESSION['pass']  = $_POST['password'];
     header("Location: home.php");
}
else {
     echo "That is not the correct log-in information.";
}
?>

首先,从文件中加载内容。内容将在每;分开。然后我们循环到该数组的每一行,将其拆分为用户和密码。

用户名和密码放在新数组$users中。

唯一剩下的就是检查数组中是否存在用户名,以及密码是否与之对应。

登录后,您最好将数据放入会话中。