dsfsdf7852 2016-04-29 10:26 采纳率: 100%
浏览 53
已采纳

pdo连接不能在php函数中工作

I have this function which is for throttling login, but I have problem, the pdo connections do not work inside the function, it gives me error for "undefined $conn or call to a member query function on null", if I'm correct it is due to the scope, is there any work around this?

<?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;
                }
            }
        }
    }
}
?>
  • 写回答

2条回答 默认 最新

  • duanci8209 2016-04-29 10:44
    关注

    You could try to make your check Function receive an Argument like so:

    <?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;
                        }
                    }
                }
            }
        }
    

    Now you can pass the $conn to your Function like so:

    <?php
        check($conn);
    

    Hope this helps...

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?