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変数の値をエスケープして引用符で囲むだけでエラーを修正できますが SQLインジェクションや壊れたエスケープ関数。

. . Amplexos。

于 2013-04-21T21:33:28.483 に答える
0

あなたが$dbc正しく定義したと仮定すると...

まず、クエリ文字列が間違っています。引用符で囲む必要があります$email

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

次に、SQL が注入可能であるため、投稿文字列をエスケープする必要があります。

$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 に答える