簡體   English   中英

PHP mysql_ *轉換為mysqli致命錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM