我有这个代码(两个类)
class url
{
private $profile_id;
private $short;
public $notice;
private $forbidden;
function url() {
$this->forbidden = array('index.php', 'index.html', 'styles.css', 'style.css');
if ($_POST['profile_id']){
// global $db;
$exists = db::fetch_one(db::query("SELECT count(1) FROM ".TABLE." WHERE profile_id = ".intval($_POST['profile_id']).";"));
$exists_username = db::fetch_one(db::query("SELECT count(1) FROM ".TABLE." WHERE url_short = '".db::mres($_POST['url_short'])."'"));
}
}
}
class db
{
function db(){
mysql_connect("localhost", "root", "h1gh§c1a0");
mysql_select_db("gplus") or die(mysql_error());
mysql_set_charset("utf8") or die(mysql_error());
}
function query($query){
// print_r( $this);
$result = mysql_query(self::protect($query)) or _log("Query failed: ".$query);
//$this isn't working
//$result = mysql_query($this->protect($query)) or _log("Query failed: ".$query);
return $result;
}
function fetch($result){
$result = mysql_fetch_assoc($result);
return $result;
}
function fetch_one($result){
$result = mysql_fetch_row($result);
return $result['0'];
}
function mres($text) {
return mysql_real_escape_string($result);
}
function protect($text) {
if (preg_match("/UNION/i", $text)) {
_log("Hack attempt: ".$text);
die();
}
// die($text);
return $text;
}
}
$db = new db();
$url = new url();
我的问题是,这一行
$result = mysql_query(self::protect($query)) or _log("Query failed: ".$query);
有效,但当我用self::
更改$this->
时,它会抛出错误
Fatal error: Call to undefined method url::protect() in /data/my/db.php on line 71
怎么可能?我认为$this->function();
调用当前类中的方法。我做错了什么?
答案 0 :(得分:2)
在url
构造函数中,您静态调用db::query
,因此protect()
也将被静态调用,因此$this
将无法使用。< / p>
您可以将其全部保持为静态,也可以将db
的实例注入url
:
$db = new db();
$url = new url($db);
答案 1 :(得分:1)
使用db::query()
时,您将以静态方式访问db(您正在调用类方法,而不是实例方法)。因此,没有什么可以通过$ this访问,因为$ this返回指向类实例的指针,而self
是对类本身的引用。
如果您使用$db->query()
,$this->protect()
也可以使用。