[英]PHP mysql_* converting to mysqli fatal error
我將mysql_ *轉換為mysqli,但是遇到以下問題。
php類(Functions.php):
class Functions{
public static function filter($data){
$data = trim(htmlentities(strip_tags($data)));
if(get_magic_quotes_gpc())
$data = stripslashes($data);
$data = $mysqli->real_escape_string($data);
return $data;
}
}
數據庫連接(dbconnect.php):
$dbhost = 'localhost';
$dbuser = 'xxxxxx';
$dbpass = 'xxxxxx';
$dbname = 'xxxxxx';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if(mysqli_connect_errno()){
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
我將上述文件包含在header.php中
include('inc/dbconnect.php');
include('inc/Functions.php');
我讓頁面調用類函數,例如:
$params = Functions::filter($_GET['param']);
加載頁面時出現此錯誤:
致命錯誤:在第XX行的C:\\ xampp \\ htdocs \\ site \\ inc \\ functions.php中的非對象上調用成員函數real_escape_string()
我不是已經在dbconnect.php中為mysqli創建了一個對象嗎? 為什么顯示此錯誤? 它發生在Functions.php中所有相關的mysqli。
請指教,非常感謝。
您已經在全局范圍內創建了mysqli對象,因此必須添加global $mysqli;
或使用$GLOBALS['mysqli']
代替:
public static function filter($data) {
global $mysqli;
$data = trim(htmlentities(strip_tags($data)));
if(get_magic_quotes_gpc())
$data = stripslashes($data);
$data = $mysqli->real_escape_string($data);
return $data;
}
}
但我建議將對象作為函數參數傳遞:
public static function filter($data, $mysqli) {
$data = trim(htmlentities(strip_tags($data)));
if(get_magic_quotes_gpc())
$data = stripslashes($data);
$data = $mysqli->real_escape_string($data);
return $data;
}
}
接着:
$params = Functions::filter($_GET['param'], $mysqli);
您試圖使$mysqli
可從全局范圍訪問,因此應在Functions::filter
方法內聲明global $mysqli
。
在可能的情況下,強烈建議不要使用靜態類和全局變量。 您可以通過以下方式編輯Functions
類以使其更加面向OOP:
class Functions {
private $mysqli;
聲明一個私有屬性來保存mysqli
對象。 注意,我們不能在那里允許NULL
。 因此,我們需要聲明一個構造函數來初始化我們的屬性:
public function __construct(mysqli $mysqli_) {
$this->mysqli = $mysqli_;
}
通過類型提示,它將避免將不是mysqli
對象的任何東西作為參數傳遞。 現在,我們只需要使filter
方法成為實例方法即可:
public function filter($data){
$data = trim(htmlentities(strip_tags($data)));
if(get_magic_quotes_gpc())
$data = stripslashes($data);
$data = $this->mysqli->real_escape_string($data);
return $data;
}
}
注意$mysqli
現在是$this->mysqli
因為我們正在使用該類的instance屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.