【问题标题】:Using global keyword inside public function issue在公共函数问题中使用全局关键字
【发布时间】:2018-04-07 01:26:45
【问题描述】:

我正在尝试在公共函数中使用全局关键字。

这就是我所拥有的,你会看到变量 $memberID,我已将它注释掉,但可以回显它下面的 memberID,但是当它在函数内部使用时,它无法识别它。

我有“全局 $memberID;”内部功能,但不会工作。

<?php
$memberID = $_GET['memberID'];
// echo $memberID;

class DB_Functions {
    private $db_conx;
    function __construct() {
        include_once ('db_conx.php');
        $this->db_conx = DBC::connect();
    }
    function __destruct() {}

    /**
     * Start SERIES ------------------------------------------------------------
     */
    public function getActiveSeries() {
        global $memberID;
    // $memberID = '1';
    $sql = "SELECT * FROM series WHERE isActive = 'y' AND USER_ID = '$memberID'";
        $result = mysqli_query($this->db_conx,$sql);
        return $result;
    }
}
?>

【问题讨论】:

  • 为什么不直接在getActiveSeries方法内访问$_GET['memberID']
  • 不要使用全局,只需将其作为参数传递给函数即可。当你像这样将变量连接到 SQL 中时,你的代码很容易受到 SQL 注入的攻击。
  • 那样工作,但我有大约 30 多个其他公共函数,我只是试图根据全局变量 $memberID 调用数据库查询 USER_ID。
  • 为什么不在构造函数中传递成员ID。使用面向对象的编程特性。全局关键字是不好的做法
  • 我认为 global 关键字是不好的做法,这就是我在这里寻找其他建议的原因。

标签: php function public


【解决方案1】:

尝试使用面向对象的编程。

$class = new DB_Functions($_GET['memberID']);//this goes in the construct function. 


class DB_Functions {
public $memberID;

public function __construct($memberid = null) {
$this->memberID = (int) $memberid; 
}
#access the member ID as $this->memberID

public function getActiveSeries() {
$sql = "SELECT * FROM series WHERE isActive = 'y' AND USER_ID = '$this->memberID'";
    $result = mysqli_query($this->db_conx,$sql);
    return $result;
}

}

上述方法的优点是成员 ID 可以通过这个类为每个实例提供。这意味着您不必将成员 ID 传递给类中的每个函数。您所要做的就是在实例化类时传递成员 ID,然后在类中的任何函数中以 $this-&gt;memberID 的形式访问它

还请开始使用准备好的语句,因为您正在使用支持它的 api

【讨论】:

  • 太好了,我喜欢这个选项。您能否根据我发送的代码进行布局。我只是说我在构造函数等方面的其他东西......
  • 只需将我的更改与您的更改合并即可。复制粘贴对学习没有帮助。
  • 我理解并同意。我猜我的意思是,我是否保留我的“函数 __construct()”并添加你创建的那个“公共函数 __construct($memberid = null)”我都尝试过,但似乎都失败了。
【解决方案2】:

$_GET['memberID'] 已经是一个全局变量,您可以直接在您的方法中访问它。

public function getActiveSeries() {
    $memberId = filter_var($_GET['memberId'],FILTER_SANITIZE_STRING );
    $mysqli = new mysqli("example.com", "user", "password", "database");
    $stmt = $mysqli->prepare("SELECT * FROM series WHERE isActive = 'y' AND USER_ID = ?");
    $stmt->bind_param("i", $memberId);
    $result = $stmt->execute();
    return $result;
}

【讨论】:

  • 我已经做到了,并且让它工作了,但是在上面的其中一个 cmets 中,它仍然容易受到 SQL 注入的攻击。
  • 您尝试做的事情也容易受到 SQL 注入的影响,您需要使用 filter_var 清理您的输入并使用准备好的语句 php.net/manual/en/mysqli.quickstart.prepared-statements.php
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多