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()代码>