0

所以我正在研究这个有一个Person类的 php 程序。该类中有一个名为find_by_email($email). 我尝试使用我确定在我的数据库中的电子邮件地址通过电子邮件查找用户。查询数据库后,它应该返回一个人对象。

我已经检查以确保我的表名和列是正确的。经过测试,代码似乎没有通过第一个 if 语句:if ($r = mysql_query($query, $dbc))。我唯一能想到的是我的查询一定是不正确的。这不是正确的语法吗?

这是我调用该方法的方式:

$email = $_POST['email']; 
$person = Person::find_by_email($_POST['email']);

这是我的Person::find_by_email()方法:

    public static function find_by_email($email) {
        global $dbc;
        $query = "SELECT * FROM person WHERE email=". $email;
        if ($r = mysql_query($query, $dbc)) {
            if($row = mysql_fetch_array($r)) {
                $person = new Person($row);
                return $person;
            }
        }else{
        $error = "Could not find user";
                echo $error;
        return nil;
    }
}
4

5 回答 5

2

你需要在你的 MYSQL 语句中引用你的变量,如下所示:

$query = "SELECT * FROM person WHERE email='$email'";
于 2013-04-21T21:26:27.477 回答
1

我重写了你的函数,

public static function find_by_email($email) {
        global $dbc;
        $query = "SELECT * FROM person WHERE email='{$email}'";
        $result = mysql_query($query, $dbc)
        $num_rows = mysql_num_rows($result);
        if ($num_rows) {
            if($row = mysql_fetch_array($r)) {
                $person = new Person($row);
                return $person;
            }
        }else{
        $error = "Could not find user";
                echo $error;
        return nil;
        }
}

希望这可以帮助

于 2013-04-21T21:30:12.527 回答
1

. . 如果您不方便检查 mysql_error() 以查看错误消息,您可以输出查询并在可视化工具中运行它(例如 HeidiSQL——也可以在 Linux 上的 Wine 上运行,顺便说一句)。做就是了...

die("SELECT * FROM person WHERE email=". $email);

. . 复制输出并运行它。它会给你错误信息。

. . 现在看起来你在查询中插入值时没有引用它,比如:

SELECT * FROM person WHERE email=foo@bar.com

. . 这是无效的语法。您需要将其括在引号中。尽管您可以简单地通过转义和引用$email变量的值来修复错误,但您应该认真考虑在最新的 PHP 版本中使用PDO以获得其现代功能,例如准备好的语句,这样您就不必担心SQL 注入或损坏的转义功能。

. . Amplexos。

于 2013-04-21T21:33:28.483 回答
0

假设您已$dbc正确定义...

首先你的查询字符串是错误的,你需要引号$email

$query = "SELECT * FROM person WHERE email='". $email . "'";

其次,您的 SQL 是可注入的,您需要对 post 字符串进行转义:

$email = mysql_real_escape_string($_POST['email']); 

第三,请不要使用mysql库,因为它们已被弃用,搜索mysqli并阅读它。

于 2013-04-21T21:28:34.300 回答
0

让我们假设 $dbc 已经打开到PDO的连接

public static function find_by_email($email) {
    global $dbc;
    $query = "SELECT * FROM person WHERE email=?";
    $stm = $dbc->prepare($query);
    $stm->execute(array($email));
    if ($row = $stm->fetch()) {
        return new Person($row);
    }
}

请注意,您永远不应该直接从函数中回显任何内容。
检查返回的值,然后决定是否要回显任何内容。

于 2013-04-21T21:34:21.523 回答