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

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 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题