2016-04-29 23 views
0

Ich habe diese Funktion, die Drosselung Anmeldung ist, aber ich habe ein Problem, funktionieren die PDO-Verbindungen nicht innerhalb der Funktion, gibt es mir Fehler für "undefined $ conn oder Aufruf an eine Mitgliedsabfrage Funktion auf Null ", wenn ich richtig bin, ist es wegen des Bereichs, gibt es irgendeine Arbeit um dieses?PDO-Verbindung funktioniert nicht in PHP-Funktion

<?php 
function check(){ 
    function get_multiple_rows($getfailed) { 
     $rows = array(); 
     while($row = $getfailed->fetch(PDO::FETCH_ASSOC)) { 
      $rows[] = $row; 
     } 
     return $rows; 
    } 
    $throttle = array(1 => 1, 5 => 2, 30 => 10); 
    if ($getfailed = $conn->query("SELECT MAX(attempted) AS attempted FROM failed_logins")){ 
     $rows = get_multiple_rows($getfailed); 
     $getfailed->closeCursor(); 
     $latest_attempt = (int) date('U', strtotime($rows[0]['attempted'])); 
     if ($getfailed = $conn->query("SELECT COUNT(1) AS failed FROM failed_logins WHERE attempted > DATE_SUB(NOW(), INTERVAL 15 minute)")){ 
      $rows = get_multiple_rows($getfailed); 
      $getfailed->closeCursor(); 
      $failed_attempts = (int) $rows[0]['failed']; 
      krsort($throttle); 
      foreach ($throttle as $attempts => $delay){ 
       if ($failed_attempts > $attempts) { 
        $remaining_delay = (time() - $latest_attempt) - $delay; 
        if ($remaining_delay < 0){ 
         echo "You have exceeded the login attempts limit"; 
        } 
        return false; 
        break; 
       }else{ 
        return true; 
       } 
      } 
     } 
    } 
} 
?> 
+0

Wo ist Ihre $ conn initialisieren? Andere Datei? Ist eine Klasse, die Sie als Attribut festlegen können? –

+0

Wenn Sie [PDO-Ausnahmen] (http://php.net/manual/en/pdo.error-handling.php) aktivieren, sind Fehler viel offensichtlicher. – tadman

+0

@ Sergi Case, ja es ist eine andere Datei und in einer Klasse – Serjio

Antwort

0

Sie könnten versuchen, Ihren Scheck Funktion erhalten ein Argument wie so zu machen:

<?php 
    check($conn); 

this helps ..:

<?php 
    function check(PDO $conn){ 
     function get_multiple_rows(PDOStatement $getfailed) { 
      $rows = array(); 
      while($row = $getfailed->fetch(PDO::FETCH_ASSOC)) { 
       $rows[] = $row; 
      } 
      return $rows; 
     } 
     $throttle = array(1 => 1, 5 => 2, 30 => 10); 
     if ($getfailed = $conn->query("SELECT MAX(attempted) AS attempted FROM failed_logins")){ 
      $rows = get_multiple_rows($getfailed); 
      $getfailed->closeCursor(); 
      $latest_attempt = (int) date('U', strtotime($rows[0]['attempted'])); 
      if ($getfailed = $conn->query("SELECT COUNT(1) AS failed FROM failed_logins WHERE attempted > DATE_SUB(NOW(), INTERVAL 15 minute)")){ 
       $rows = get_multiple_rows($getfailed); 
       $getfailed->closeCursor(); 
       $failed_attempts = (int) $rows[0]['failed']; 
       krsort($throttle); 
       foreach ($throttle as $attempts => $delay){ 
        if ($failed_attempts > $attempts) { 
         $remaining_delay = (time() - $latest_attempt) - $delay; 
         if ($remaining_delay < 0){ 
          echo "You have exceeded the login attempts limit"; 
         } 
         return false; 
         break; 
        }else{ 
         return true; 
        } 
       } 
      } 
     } 
    } 

Jetzt können Sie die $ conn auf Ihre Funktion wie so passieren kann

0

Offensichtlich haben Sie $conn in Ihrer Funktion nicht definiert. Sie müssen $conn in Ihrer Funktion lokal definieren, um in der Lage zu sein, eine Anfrage darüber zu senden oder this answer zu lesen, um die PDO-Verbindung in Ihrer Webanwendung global richtig einzurichten.

+0

Oder Sie könnten $ Conn als Argument für die Funktion übergeben. – Rick

+0

@Rick danke. Ja, das kann auch eine Option sein. –

+0

@Rick, das ist eine gute Idee, aber was ist mit dem Abfragefehler? – Serjio