1

私がやろうとしているのは、メールアドレスがデータベースにあるかどうかを検証することです。メールCheckEmailAddressがデータベースにあり、機能しているように見えるかどうかを確認します(必要に応じて書き直してください)。問題は、JQuery関数からJSON電子メールデータを投稿すると、電子メールがデータベースに入力されている場合にfalseが存在するはずのときに常にtrueを返すことです。

JQUERY:

$('#checkemail').click(function() {
    $.post('http://' +  location.host + '/buyme/include/getemailaddress.php', 
        {'email':'test012@yahoo.co.nz'},  function(res){
        var obj = JSON.parse(res);
        alert(obj)
    });
});

PHP

<?PHP
    require_once("membership.php");
    $membership = new Membership();
    $val = $_POST["email"];;
    $result = $membership->CheckEmailAddress(trim($val));
    echo json_encode($result); //output test@test.com   
?>

function CheckEmailAddress($email_address) {
    $connection = mysql_connect('localhost:3306','root','')or die('Error connecting');
    mysql_select_db('buyme') or die('Connection not working properly');     
    $query = "SELECT email_address from users where email_address='$email_address'";
    $result = mysql_query($query, $connection);
    $row = mysql_fetch_assoc($result);

            $emailInUse = 'false';
    if(!$row || $row["email_address"] == '') {
        $emailInUse = 'true';
    }else{
        $emailInUse = 'false';  
    }

    return $emailInUse;
}

修正が必要な場合は、コードを更新して、感謝の気持ちをテストできるようにしてください

アップデート:

    try {
    $pdo = new PDO('mysql:dbname=buyme;host=localhost:3306', 'root', '', 
        $options = array (
        PDO::ATTR_ERRMODE,  PDO::ERRMODE_EXCEPTION
    ));
    $email_address = 'kirkdm021@yahoo.co.nz';

    $stmt = $pdo->prepare("SELECT email_address
            FROM users 
            WHERE email_address=:email_address");
    $stmt->execute(array('email_address'=>$email_address));
    $rows = $stmt->fetchObject();

    echo empty($rows->email_address) ? "" : $rows->email_address; // $row["email_address"];

}catch (PDOException $e) {
    die('error: ' . $e->getMessage());      
} 
4

2 に答える 2

1

問題は、あなたのTRUEFALSE割り当てが文字列&notTRUEまたはFALSE値を返していることです。つまり、値を含む文字列であるため、本質的に常に見なされTRUEます。AFALSEには常に何も含まれません。また、あなたはそれがするべきであるときに行うことによって行うことORによってやっています。したがって、このコードスニペットは次のとおりです。||AND&&

if(!$row || $row["email_address"] == '') {
    $emailInUse = 'true';
}else{
    $emailInUse = 'false';  
}

次のように書き直す必要があります。

if(!$row && $row["email_address"] == '') {
    $emailInUse = TRUE;
}else{
    $emailInUse = FALSE;  
}

そして、最終的な関数は次のようになります。

function CheckEmailAddress($email_address) {
    $connection = mysql_connect('localhost:3306','root','')or die('Error connecting');
    mysql_select_db('buyme') or die('Connection not working properly');     
    $query = "SELECT email_address from users where email_address='$email_address'";
    $result = mysql_query($query, $connection);
    $row = mysql_fetch_assoc($result);

    if(!$row && $row["email_address"] == '') {
        $emailInUse = TRUE;
    }else{
        $emailInUse = FALSE;  
    }

    return $emailInUse;
}

そうは言っても、私はelseこれを行うことによってステートメントを避けることをお勧めします:

    $emailInUse = FALSE;        
    if(!$row || $row["email_address"] == '') {
        $emailInUse = TRUE;
    }

    return $emailInUse;

大きな違いには思えないかもしれませんが、私の経験から、このような値をデフォルト値で初期化すると、長期的には頭痛の種を減らすことができます。このスクリプトではあまり意味がないかもしれませんが、初心者のプログラマーであれば、早い段階で始めることをお勧めします。

追加の視点で編集:また、私はあなたの投稿を読み直しました。「true」と「false」という単語を返したいようですか?悪癖。関数が論理的にTRUE、またはFALSE私が説明したように返してから、メインコードでそれを実行します。したがって、このコーディング:

<?PHP
    require_once("membership.php");
    $membership = new Membership();
    $val = $_POST["email"];;
    $result = $membership->CheckEmailAddress(trim($val));
    echo json_encode($result); //output test@test.com   
?>

これで、次のようになります。

<?PHP
    require_once("membership.php");
    $membership = new Membership();
    $val = $_POST["email"];;
    $result = $membership->CheckEmailAddress(trim($val));
    $result_value = !empty($result) ? 'true' : 'false';
    echo json_encode($result_value); //output test@test.com   
?>

読むその行を参照してください$result_value = !empty($result) ? 'true' : 'false';ifこれは、値の/ elsestuffの代わりとなるインラインコードです。そのメソッドの正式な名前を本当に忘れてしまいましたが、このような場合に役立ちます。ログフローは基本的に

[value] = [test] ? [test value] : [default value];

つまり、test合格した場合は、の後に続く値を作成します?。テストに合格しなかった場合は?次に、の右側にあるデフォルト値を使用します:

于 2013-02-04T23:59:15.507 に答える
0

まず、 SQLクエリを作成するときに$email_address、引用符に埋め込むことができないというエラーがコードに表示されます。'

ただし、クエリを修正するのではなく、プリペアドステートメントを使用することをお勧めします。これは、SQLインジェクションに対して最も安全であり、使いやすいためです。

PDO拡張を使用した例を次に示します。

function CheckEmailAddress($email_address) {
    try {
        $pdo = new PDO('mysql:dbname=test;host=localhost', 'root', '', $options = array (
             PDO::ATTR_ERRMODE,  PDO::ERRMODE_EXCEPTION
        ));

        // prepare a statement 
        $stmt = $pdo->prepare('
            SELECT `email_address`
            FROM `users` 
            WHERE `email_address`=:email_address
        ');

        $stmt->execute(array(
            'email_address' => $email_address
        ));

        $row = $stmt->fetchObject();

        if(!$row || $row["email_address"] == '') {
            return 'true';
        }else{
            return 'false';  
        }

    } catch (PDOException $e) {
        // just for debugging. Don't display the error message in
        // production envirionemnet as it can contain sensitive data
        die('error: ' . $e->getMessage());
    }

}
于 2013-02-05T00:04:50.327 に答える