【问题标题】:PHP Class Function Ignores Return StatementPHP 类函数忽略返回语句
【发布时间】:2012-06-03 04:55:39
【问题描述】:

由于某种原因,当 check_em() 成功时返回不起作用。我是php新手,所以在这里不知所措。

<?php

//Class to handle mysql
class db_handler {
    private $db_host = 'localhost';
    private $db_name = 'project';
    private $db_user = 'project';
    private $db_pass = 'dbpassword';
    private $db_con_mysql = '';
    private $db_con_db = '';

    public function check_em($username, $password) {
        $db_query = "SELECT password FROM user WHERE name='".$username."' LIMIT 1;";
        if($this->db_con_mysql!='') {
            $db_query_response = mysql_query($db_query) or die('Query failed: '.mysql_error());
            $db_query_return = mysql_fetch_row($db_query_response);
            $db_sha1_hash = $db_query_return[0];
            echo $db_sha1_hash."<br>";
            echo sha1($password)."<br>";
            if(sha1($password)==$db_sha1_hash) {
                return 'user valid'; //THIS DOESN'T WORK!?!?!?
            } else {
                return 'no good';
            }
        } else {
            $this->db_connect();
            $this->check_em($username, $password);
        }

    }

    //Connect to mysql, then database
    private function db_connect() {
        $this->db_con_mysql = mysql_connect($this->db_host, $this->db_user, $this->db_pass) || die('Connection failed: '.mysql_error());
        $this->db_con_db = mysql_select_db($this->db_name) || die('Could not use'.$this->db_name.'. '.mysql_error());
        return;
    }

    //Disconnect from database and reset vars used to track connection.
    private function db_disconnect() {
        if($this->db_con_mysql!='') {
            mysql_close();
            $this->db_con_mysql = '';
            $this->db_con_db = '';
            return;
        }
    }

    public function fake($some_val) {
        if($some_val<6) {
            return TRUE;
        } else {
            return FALSE;
        }
    }
}

$db_obj = new db_handler();
$val1 = $db_obj->check_em('someuser','password'); //should return 'user valid'
echo "val1:".$val1."<br>";
echo "<br><br>";

$val2 = $db_obj->check_em('someuser','passw0rd'); //should return 'no good'
echo "val2:".$val2."<br>";
echo "<br><br>";

echo "test<br>";
echo $db_obj->fake(4)."<br>";

?>

结果:

5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
val1:


5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
7c6a61c68ef8b9b6b061b28c348bc1ed7921cb53
val2:no good


test
1

【问题讨论】:

  • 您需要在 else 块中添加 return $this-&gt;check_em($username, $password);
  • 我想说一个更大的问题是你的外部else没有return语句。
  • 但这只是终止脚本...
  • 我想说最糟糕的问题是您搜索用户名,可能是用户输入提供给您的数据,而没有清理它。请use pdo and bind your params,以这种方式直接在您的查询字符串中使用用户输入只会让您面临 SQL 注入。

标签: php class function return


【解决方案1】:

这行需要回车:

return $this->check_em($username, $password);

但更明智的解决方案是在连接为null 时连接到if 内的数据库。真的,整篇文章可以写得更好,但我会留在那里。

【讨论】:

    【解决方案2】:
    ...
    else {
                $this->db_connect();
                return $this->check_em($username, $password);
            }
    ...
    

    您想添加返回,以便如果失败,则它会更深一层并找到另一层。如果更深层次成功,它会将值向上传递到上一层,上一层可以向上传递,直到到达原始函数调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-15
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      相关资源
      最近更新 更多