2016-07-06 23 views
0

我試圖在準備好的語句中使用SELECT COUNT(*)帶OR運算符的SELECT count(*)

下面是我的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()方法; - 不知道我是如何錯過的。感謝薩蒂的評論!

+1

您需要關閉,如果條件都有很大的幫助之前'$ stmt-> close()方法;當你在數據庫中運行' – Saty

+1

這是否查詢工作?我通常從db開始,一旦我得到了可靠的查詢,然後將其轉換爲預準備語句語法。這可以讓我從連接到數據庫的錯誤中分離錯誤。 – Gus

+1

看看這個if(!($ stmt = $ link-> prepare(「SELECT COUNT(*)AS FROM LoginAttempts WHERE(email =?OR IP =?)AND LastLogin BETWEEN now()and subdate(now() ,INTERVAL 5 MINUTE)「))){ - { }' - 進一步向下移動右大括號。 –

回答

1

很少的錯誤在你的代碼

1)不找關閉,如果錯誤

2)條件結尾

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(); 
} 
2

的問題是與第

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

之間試試這個,讓我知道

+0

因此,儘管我使用您建議的 – PublicDisplayName

+0

的代碼嘗試直接對數據庫執行它,但仍然獲得NULL值。子句之間的不正確,你必須糾正它。 –

+0

請直接在數據庫上試試它,並讓我知道 –

1

在這裏的一些錯誤,但主要是你忘了綁定到一個變量後,獲取結果。 bind_param基本上指示變量來放置結果集中的值,但實際上並沒有從結果集中檢索行,您需要某種->fetch()來做到這一點

它是一個好主意來測試所有狀態幾乎所有的mysqli_ 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(); 
+0

我目前只是在一瞬間發展,但我打算使用哨兵或Bugsnag記錄異常,所以我可以看看會發生什麼全球無需通過Apache錯誤日誌翻找。感謝您的時間,完全錯過了使用'fetch();' – PublicDisplayName