Php 使用OR运算符选择计数(*)

Php 使用OR运算符选择计数(*),php,mysql,Php,Mysql,我试图在准备好的语句中使用selectcount(*) 下面是我的PHP: if(!($stmt = $link->prepare("SELECT COUNT(*) AS failed FROM LoginAttempts WHERE (email = ? OR IP = ?) AND LastLogin BETWEEN now() and subdate(now(),INTERVAL 5 MINUTE)"))){ } $stmt->bind_param('ss', $email,

我试图在准备好的语句中使用
selectcount(*)

下面是我的PHP:

if(!($stmt = $link->prepare("SELECT COUNT(*) AS failed FROM LoginAttempts WHERE (email = ? OR IP = ?) AND LastLogin BETWEEN now() and subdate(now(),INTERVAL 5 MINUTE)"))){
}

$stmt->bind_param('ss', $email, $ip);

$stmt->execute();

$stmt->bind_result($failed);

$stmt->close();
我试图从中实现的是,当用户尝试登录到他们的帐户(并提供不正确的登录信息)他们的IP时,输入的电子邮件地址会记录在一个表中

当尝试登录时,使用他们的电子邮件IP,我计算有多少记录与他们的IP或电子邮件地址匹配

我遇到的问题是,当访问
$failed
时,结果是
NULL
,即使在过去5分钟内数据库中有记录

我到底错在哪里?我的apache错误日志中没有错误,或者:

error_reporting(E_ALL);
ini_set('display_errors',1);
谢谢你的时间


编辑:我需要使用$stmt->fetch();-不知道我怎么会错过。感谢Saty的评论

问题在于中间条款

    SELECT COUNT(*) AS failed FROM LoginAttempts 
WHERE (email = ? OR IP = ?) AND LastLogin
 BETWEEN  subdate(now(),INTERVAL 5 MINUTE) and now() 

试试这个,让我知道问题出在between子句上

    SELECT COUNT(*) AS failed FROM LoginAttempts 
WHERE (email = ? OR IP = ?) AND LastLogin
 BETWEEN  subdate(now(),INTERVAL 5 MINUTE) and now() 

试试这个,让我知道你代码中的一些错误

1) 不寻找错误

2) 在结束时关闭if条件

3) 忘记从查询结果中获取数据

您的代码将是

if (!($stmt = $link->prepare("SELECT COUNT(*) AS failed FROM LoginAttempts WHERE (email = ? OR IP = ?) AND LastLogin BETWEEN now() and subdate(now(),INTERVAL 5 MINUTE)"))) {
    /* bind parameters for markers */
    $stmt->bind_param('ss', $email, $ip);
    /* execute query */
    $stmt->execute();
    /* bind result variables */
    $stmt->bind_result($failed);
    /* fetch value */
    while ($stmt->fetch()) {
        printf("%s", $failed);
    }
    /* close statement */
    $stmt->close();
}

代码中几乎没有错误

1) 不寻找错误

2) 在结束时关闭if条件

3) 忘记从查询结果中获取数据

您的代码将是

if (!($stmt = $link->prepare("SELECT COUNT(*) AS failed FROM LoginAttempts WHERE (email = ? OR IP = ?) AND LastLogin BETWEEN now() and subdate(now(),INTERVAL 5 MINUTE)"))) {
    /* bind parameters for markers */
    $stmt->bind_param('ss', $email, $ip);
    /* execute query */
    $stmt->execute();
    /* bind result variables */
    $stmt->bind_result($failed);
    /* fetch value */
    while ($stmt->fetch()) {
        printf("%s", $failed);
    }
    /* close statement */
    $stmt->close();
}

这里有一些错误,但主要是在将结果绑定到变量后忘记获取结果
bind_param
基本上表示用于放置结果集中的值的变量。实际上,它不会从结果集中检索行,您需要某种
->fetch()
来执行此操作

测试几乎所有
mysqli\uquot/code>api调用的所有状态并在某处输出错误是一个好主意,它们通常非常有用并且相当精确。对调试复杂查询有很大帮助

$stmt = $link->prepare("SELECT COUNT(*) AS failed 
                        FROM LoginAttempts 
                        WHERE (email = ? OR IP = ?) 
                          AND LastLogin BETWEEN now() and subdate(now(),INTERVAL 5 MINUTE)");

if ( $stmt === FALSE ) {
    echo $link->error;
    exit;
}

$stmt->bind_param('ss', $email, $ip);

$result = $stmt->execute();
if ( $result === false ) {
    echo $link->error;
    exit;
}

$stmt->bind_result($failed);
$stmt->fetch();   // this actually get the value out of the result set into $failed   

$stmt->close();

这里有一些错误,但主要是在将结果绑定到变量后忘记获取结果
bind_param
基本上表示用于放置结果集中的值的变量。实际上,它不会从结果集中检索行,您需要某种
->fetch()
来执行此操作

测试几乎所有
mysqli\uquot/code>api调用的所有状态并在某处输出错误是一个好主意,它们通常非常有用并且相当精确。对调试复杂查询有很大帮助

$stmt = $link->prepare("SELECT COUNT(*) AS failed 
                        FROM LoginAttempts 
                        WHERE (email = ? OR IP = ?) 
                          AND LastLogin BETWEEN now() and subdate(now(),INTERVAL 5 MINUTE)");

if ( $stmt === FALSE ) {
    echo $link->error;
    exit;
}

$stmt->bind_param('ss', $email, $ip);

$result = $stmt->execute();
if ( $result === false ) {
    echo $link->error;
    exit;
}

$stmt->bind_result($failed);
$stmt->fetch();   // this actually get the value out of the result set into $failed   

$stmt->close();


您需要在
$stmt->close()之前关闭if条件在数据库中运行查询时,该查询有效吗?我通常从数据库开始,一旦得到一个可靠的查询,我就会将其转换为一个准备好的语句语法。这使我能够将语句中的错误与连接到数据库的错误分开。请看下面的
if(!($stmt=$link->prepare(“选择COUNT(*)AS failed from login tests WHERE(email=?或IP=?)和last login from now()和subdate(now(),INTERVAL 5分钟)”){}
-将右大括号再向下移动一点,并检查查询中是否有错误-您没有这样做
如果(!$stmt->execute()){trigger_error(“有一个错误…”“$link->error,E_USER_WARNING)}
我认为您需要从查询结果中获取数据,然后访问
$failed
作为
而($stmt->fetch()){printf(“%s”,“$failed);}
您需要关闭
$stmt close()之前的if条件在数据库中运行查询时,该查询有效吗?我通常从数据库开始,一旦得到一个可靠的查询,我就会将其转换为一个准备好的语句语法。这使我能够将语句中的错误与连接到数据库的错误分开。请看下面的
if(!($stmt=$link->prepare(“选择COUNT(*)AS failed from login tests WHERE(email=?或IP=?)和last login from now()和subdate(now(),INTERVAL 5分钟)”){}
-将右大括号再向下移动一点,并检查查询中是否有错误-您没有这样做
如果(!$stmt->execute()){trigger_error(“有一个错误…)“$link->error,E_USER_WARNING)}
我认为您需要从查询结果中获取数据,然后访问
$failed
作为
而($stmt->fetch()){printf(“%s”,“$failed);}
仍然得到
NULL
,尽管我使用了您建议的代码直接对数据库执行它。这中间条款不正确,你一定要纠正它。请直接在db上尝试,让我知道我直接在db上尝试,没有问题。原来是在我的PHP中,我需要使用$stmt->fetch();-完全超过了我的头脑。谢谢您的回复。@PublicDisplayName:这意味着您必须添加一些固定格式的php级别,但我知道关于它的线索,直到结果得到
NULL
,尽管我使用了您建议的代码直接对数据库执行它。这中间条款不正确,你一定要纠正它。请直接在db上尝试,让我知道我直接在db上尝试,没有问题。原来是在我的PHP中,我需要使用$stmt->fetch();-完全超过了我的头脑。谢谢您的回复。@PublicDisplayName:这意味着您必须添加一些固定格式的php级别,但我知道目前正在开发的itI的线索,不过我计划使用Sentry或Bugsnag来记录异常,这样我就可以在不必翻查apache错误日志的情况下查看全局情况。感谢您的时间,完全错过了使用
fetch()我目前正在开发,但是我计划使用Sentry或Bugsnag来记录异常,这样我就可以看到全局发生的情况,而不必翻阅apache错误日志。感谢您的时间,完全错过了使用
fetch()