0

これが私の取引です。私は単純なACLを見つけ、それを絶対に気に入っています。問題?それはすべてmysqlにあり、mysqliにはありません。私のサイトの残りの部分はmysqliで書かれているので、これは私を大いに悩ませます。

私の問題は、すでにデータベースに接続していて、mysqlがオブジェクト指向ではないため、ACLがグローバル変数なしで簡単に接続できることです。

1)mysqliに変換する必要がありますか?2)どうすればすべてを簡単に変換できますか?

コード:

<?

    class ACL
    {
        var $perms = array();       //Array : Stores the permissions for the user
        var $userID = 0;            //Integer : Stores the ID of the current user
        var $userRoles = array();   //Array : Stores the roles of the current user

        function __constructor($userID = '')
        {
            if ($userID != '')
            {
                $this->userID = floatval($userID);
            } else {
                $this->userID = floatval($_SESSION['userID']);
            }
            $this->userRoles = $this->getUserRoles('ids');
            $this->buildACL();

        }

        function ACL($userID = '')
        {
            $this->__constructor($userID);
            //crutch for PHP4 setups
        }

        function buildACL()
        {
            //first, get the rules for the user's role
            if (count($this->userRoles) > 0)
            {
                $this->perms = array_merge($this->perms,$this->getRolePerms($this->userRoles));
            }
            //then, get the individual user permissions
            $this->perms = array_merge($this->perms,$this->getUserPerms($this->userID));
        }

        function getPermKeyFromID($permID)
        {
            $strSQL = "SELECT `permKey` FROM `permissions` WHERE `ID` = " . floatval($permID) . " LIMIT 1";
            $data = mysql_query($strSQL);
            $row = mysql_fetch_array($data);
            return $row[0];
        }

        function getPermNameFromID($permID)
        {
            $strSQL = "SELECT `permName` FROM `permissions` WHERE `ID` = " . floatval($permID) . " LIMIT 1";
            $data = mysql_query($strSQL);
            $row = mysql_fetch_array($data);
            return $row[0];
        }

        function getRoleNameFromID($roleID)
        {
            $strSQL = "SELECT `roleName` FROM `roles` WHERE `ID` = " . floatval($roleID) . " LIMIT 1";
            $data = mysql_query($strSQL);
            $row = mysql_fetch_array($data);
            return $row[0];
        }

        function getUserRoles()
        {
            $strSQL = "SELECT * FROM `user_roles` WHERE `userID` = " . floatval($this->userID) . " ORDER BY `addDate` ASC";
            $data = mysql_query($strSQL);
            $resp = array();
            while($row = mysql_fetch_array($data))
            {
                $resp[] = $row['roleID'];
            }
            return $resp;
        }

        function getAllRoles($format='ids')
        {
            $format = strtolower($format);
            $strSQL = "SELECT * FROM `roles` ORDER BY `roleName` ASC";
            $data = mysql_query($strSQL);
            $resp = array();
            while($row = mysql_fetch_array($data))
            {
                if ($format == 'full')
                {
                    $resp[] = array("ID" => $row['ID'],"Name" => $row['roleName']);
                } else {
                    $resp[] = $row['ID'];
                }
            }
            return $resp;
        }

        function getAllPerms($format='ids')
        {
            $format = strtolower($format);
            $strSQL = "SELECT * FROM `permissions` ORDER BY `permName` ASC";
            $data = mysql_query($strSQL);
            $resp = array();
            while($row = mysql_fetch_assoc($data))
            {
                if ($format == 'full')
                {
                    $resp[$row['permKey']] = array('ID' => $row['ID'], 'Name' => $row['permName'], 'Key' => $row['permKey']);
                } else {
                    $resp[] = $row['ID'];
                }
            }
            return $resp;
        }

        function getRolePerms($role)
        {
            if (is_array($role))
            {
                $roleSQL = "SELECT * FROM `role_perms` WHERE `roleID` IN (" . implode(",",$role) . ") ORDER BY `ID` ASC";
            } else {
                $roleSQL = "SELECT * FROM `role_perms` WHERE `roleID` = " . floatval($role) . " ORDER BY `ID` ASC";
            }
            $data = mysql_query($roleSQL);
            $perms = array();
            while($row = mysql_fetch_assoc($data))
            {
                $pK = strtolower($this->getPermKeyFromID($row['permID']));
                if ($pK == '') { continue; }
                if ($row['value'] === '1') {
                    $hP = true;
                } else {
                    $hP = false;
                }
                $perms[$pK] = array('perm' => $pK,'inheritted' => true,'value' => $hP,'Name' => $this->getPermNameFromID($row['permID']),'ID' => $row['permID']);
            }
            return $perms;
        }

        function getUserPerms($userID)
        {
            $strSQL = "SELECT * FROM `user_perms` WHERE `userID` = " . floatval($userID) . " ORDER BY `addDate` ASC";
            $data = mysql_query($strSQL);
            $perms = array();
            while($row = mysql_fetch_assoc($data))
            {
                $pK = strtolower($this->getPermKeyFromID($row['permID']));
                if ($pK == '') { continue; }
                if ($row['value'] == '1') {
                    $hP = true;
                } else {
                    $hP = false;
                }
                $perms[$pK] = array('perm' => $pK,'inheritted' => false,'value' => $hP,'Name' => $this->getPermNameFromID($row['permID']),'ID' => $row['permID']);
            }
            return $perms;
        }

        function userHasRole($roleID)
        {
            foreach($this->userRoles as $k => $v)
            {
                if (floatval($v) === floatval($roleID))
                {
                    return true;
                }
            }
            return false;
        }

        function hasPermission($permKey)
        {
            $permKey = strtolower($permKey);
            if (array_key_exists($permKey,$this->perms))
            {
                if ($this->perms[$permKey]['value'] === '1' || $this->perms[$permKey]['value'] === true)
                {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        }

        function getUsername($userID)
        {
            $strSQL = "SELECT `username` FROM `users` WHERE `ID` = " . floatval($userID) . " LIMIT 1";
            $data = mysql_query($strSQL);
            $row = mysql_fetch_array($data);
            return $row[0];
        }
    }

?>
4

2 に答える 2

1

$mysqliこのクラスにプロパティを追加しMySQLi、コンストラクターでオブジェクトを渡すだけです。

class ACL {

  private $mysqli;

  public function __construct(MySQLi $mysqli) {
    $this->mysqli = $mysqli;
    /* rest of your code */
  }
}

残りはほとんど検索と置換です。

于 2013-03-11T22:48:33.573 に答える
1

コードは PHP4 をサポートするように書かれています。それは私に2つのことを教えてくれます.1つ目は、PHP4にはそれがなかったため、作成者はmysqliを使いたくても使用できませんでした.2つ目は、コードがおそらくかなり古く、PHP開発者が実際に試し始める前に書かれたmysql の代わりに mysqli を使用するように開発者をプッシュします。

適切に記述されていれば、代わりに mysqli を使用するように変換するのは簡単なことです。基本レベルでの mysql と mysqli の API の違いは、実際にはごくわずかです。主な違いは、接続オブジェクトをクエリ関数に渡す必要があることです。これは mysql ではオプションであり、このコードにあるように見えるため、頻繁に省略されています。

したがって、あなたの主な課題は、mysqli 関数呼び出しを行う場所でその接続オブジェクト変数を使用できるようにすることです。これを行う簡単な方法は、それをクラスのプロパティにするだけで、クラス内のどこでも使用できるようになります。

また、他の php4 サポート ビットを削除することをお勧めします。それらは必要ではなく、邪魔になります。

于 2013-03-11T22:51:35.040 に答える