mysqli_num_rows没有返回准确的结果

时间:2014-12-26 17:09:31

标签: php mysql

我有一个脚本应该采用表单电子邮件值并查询数据库中的重复项。但是,无论我使用现有的电子邮件(在数据库中)还是新的电子邮件,我都会获得“成功”。

我的脚本如下所示:

if(!empty($_POST['email'])) {

    $email = $_POST['email'];

    // query the database for duplicates
    $query = 'SELECT email FROM user_info WHERE email = "$email"';
    $result = mysqli_query($db, $query);
    if(mysqli_num_rows($result)){
        echo "Email already taken";
    } else {
        echo "Success";
    }

显然mysqli_num_rows正在返回某些类型的数据 - 或者根本没有。

如果我选择了数据库中已存在的电子邮件,是否有人理解为什么我不会获得返回的行?

修改

    $('#email').blur( function() {
    if(!this.value){
        $('#jquery_msg').html("Email can't be empty");
    } else if (!filter.test(this.value)){
        $('#jquery_msg').html("Not a valid email");
    } else {
        var emailVal = $('#email').val();
        // make an ajax call
        $.ajax({
            url: 'validation.php',
            type: 'post',
            data: {'email': 'emailVal'},
            success: function(data, status) {
                $('#jquery_msg').html(data);
                //  console.log(data);
            },
            error: function(xhr, desc, err) {
                console.log(xhr);
                console.log("Details: " + desc + "\nError:" + err);
            }
        }); // end ajax call
    }
});

问题在于通过Ajax传递给PHP脚本的数据。我认为$('#email').val();的价值实际上是emailVal。呵呵.. 现在我需要解决如何正确地将值传递给Ajax调用。

谢谢大家的帮助。

1 个答案:

答案 0 :(得分:4)

这是错误的:

$query = 'SELECT email FROM user_info WHERE email = "$email"';

除了潜在的sql注入问题之外,使用单引号时不会解析变量。

您应该使用预备声明:

$query = 'SELECT email FROM user_info WHERE email = ?';

然后,您可以准备语句,绑定占位符并获取结果。有关详细信息,请查看manual

快速解决方案也将是:

$query = 'SELECT email FROM user_info WHERE email = "'
            . mysqli_real_escape_string($db, $email) . '"';

编辑:要解决更多问题,您应该为数据库调用添加错误处理。你可以让mysqli抛出异常,告诉你确切的错误 - 如果有的话 - 将它添加到你的脚本顶部:

ini_set('display_errors',1);
error_reporting(E_ALL | E_STRICT);
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);