使用$wpdb|对照数据库中的现有电子邮件检查输入的电子邮件

时间:2019-02-13 作者:Jason Is My Name

在不过分咆哮的情况下,以下是我的片段:

if (empty($_POST["email"])) {
    $emailErr = "Email is required";
} else {
    $email = test_input($_POST["email"]);

    // check if e-mail address is well-formed
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
        $emailErr = "Invalid email format"; 
    } else {
        $emailTest = \'SELECT * FROM wp_email_subscribers WHERE email = \'.$email;
        var_dump($email);
        var_dump($emailTest);
        $duplicateEmail = $wpdb->get_results($emailTest, OBJECT) or die(mysql_error());

        if (mysql_num_rows($duplicateEmail)!=0) {
            $emailErr = "Email address taken";
        }
    }
}
是否有人可以帮助我检查数据库中输入的电子邮件地址,如果该电子邮件已在数据库中,则返回错误?

谢谢,杰森。

1 个回复
SO网友:Jacob Peattie

你不应该使用mysql_num_rows()mysql_error() 处理时$wpdb. 即使你不是,mysql_error() 表示数据库错误,空结果集不是数据库错误。

如果您想知道是否返回了结果,只需检查count() 其中:

$duplicateEmail = $wpdb->get_results($emailTest, OBJECT);

if ( count( $duplicateEmail ) > 0 ) {
    // Email already exits.
}
就“返回错误”而言,这完全取决于上下文。如果您只需要一个带有错误消息的空白屏幕,那么您可以使用wp_die():

$duplicateEmail = $wpdb->get_results($emailTest, OBJECT);

if ( count( $duplicateEmail ) > 0 ) {
    wp_die( \'Email already exits.\' );
}
或者如果这是一个AJAX请求,您可以使用wp_send_json_error() 返回400 JSON中包含消息的错误代码:

$duplicateEmail = $wpdb->get_results($emailTest, OBJECT);

if ( count( $duplicateEmail ) > 0 ) {
    wp_send_json_error( \'Email already exits.\', 400 );
}
此外,您确实不应该像现在这样将变量直接放入SQL unescaped中。这使您容易受到SQL注入攻击。而是使用$wpdb->prepare() 生成包含变量的查询。您还应该使用$wpdb->prefix 这样即使用户使用的数据库前缀不是wp_:

$query   = $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}email_subscribers WHERE email = %s", $email );
$results = $wpdb->get_results( $query );

if ( count( $results ) > 0 ) {
    wp_send_json_error( \'Email already exits.\', 400 );
}