选择查询使用prepare语句返回0行

时间:2016-06-04 15:03:49

标签: php mysql prepared-statement

我的sql prepare语句中有问题。 我尝试做选择查询以检查数据库中是否存在电子邮件,之后我检查该语句是否返回任何行,如果它的返回意味着该电子邮件已经存在并且我返回"发现电子邮件",如果不是它应该返回"未找到电子邮件"。

现在问题是我尝试检查的电子邮件是否存在于数据库中,但我仍然得到"未找到电子邮件"。

这是我的php代码:

try{
        $servername = "localhost";
        $dbusername = "xxx";
        $dbpassword = "xxx";
        $dbname = "xxx";

        // Create connection
        $conn = new mysqli($servername, $dbusername, $dbpassword, $dbname);

        // Check connection
        if ($conn->connect_error) {
            die("Connection failed: " . $conn->connect_error);
        }


        $stmt = $conn->prepare(" SELECT `Email` FROM `Accounts` WHERE `Email`='?' ");
        // set parameters and execute            
    $emaila = "test001@gmail.com"; 
        $stmt->bind_param('s', $emaila);
        $stmt->execute();
    // if the email is not found
        if(mysqli_stmt_num_rows($stmt) == 0){
            $stmt->close();
            $conn->close();
            $data['success'] = false;
    $data['message']  = 'Email not found';
            echo json_encode($data);
        }
        else{
            $stmt->close();
            $conn->close();
            $data['success'] = false;
    $data['message']  = 'Email found';
            echo json_encode($data);
        }

    }
    catch(Exception $e){
        $data['success'] = false;
        $data['message'] = 'Error found';
        echo json_encode($data);
    }

我尝试使用引号,但它没有用,我花了3个小时。 请帮忙。

1 个答案:

答案 0 :(得分:3)

您不需要带有预准备语句的单引号。所以:

SELECT `Email` FROM `Accounts` WHERE `Email` = ?;

为什么不呢? SQL解释器在输入时知道参数的类型。因此,单引号是多余的(在这种情况下实际上是有害的)。您可以将字符串(或日期)参数视为进入查询字符串以及一对单引号,以将其标识为字符串。