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 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵