我目前正在创建一个非常简单的在线订购网站,作为学校项目的一部分。我遇到了一个问题,我的控制器试图创建一个与我的订单参数接口的类的实例,但是创建新实例只会返回NULL。当加载操作的页面加载时,我收到此错误:
致命错误:在第31行的/home/data/www/z1785732/public_html/467/PlaceOrderController.php中调用null上的成员函数getParameters()
以下是我正在使用的文件:
这是控制器。返回NULL的特定类是ParameterInterface。
<?php
include 'ItemDB.php';
include 'OrderDB.php';
include 'ccInterface.php';
include 'ParameterInterface.php';
class PlaceOrderController {
var $itemDB;
var $parameter;
var $orderDB;
var $ccInterface;
function __construct() {
$this->itemDB = new ItemDatabase();
$this->ccInterface = new ccInterface();
$this->parameter = new ParameterInterface();
}
public function displayCatalog() {
return $this->itemDB->displayCatalog();
}
public function searchItem($itemNum) {
return $this->itemDB->searchItem($itemNum);
}
public function getParameters() {
return $this->parameter->getParameters();
}
public function addOrder() {
$this->orderDB->addOrder($array1, $array2);
}
public function ccAuthorize($ccInfo) {
return $this->ccInterface->ccAuthorize($ccInfo);
}
}
?>
这是ParameterInterface.php,其中定义了函数。
<?php
class ParameterInterface {
function connect() {
$servername = '';
$dbname='';
$username = '';
$password = '';
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e){
echo "Connection failed: ". $e->getMessage();
}
return $conn;
}
public function getParameters() {
$conn = $this->connect();
$query = "SELECT * FROM Admin;";
$result = $conn->query($query);
$row = $result->fetch(PDO::FETCH_ASSOC);
return $row;
}
}
?>
我希望它只是一些简单的东西,我的眼睛不会被抓住。任何帮助将不胜感激。
提前致谢!
答案 0 :(得分:1)
实现Serializable
接口,以便能够在会话中序列化您的控制器:
class PlaceOrderController implements Serializable
{
// ...
public function serialize()
{
return serialize(array(
$this->itemDB,
$this->parameter,
$this->orderDB,
$this->ccInterface
));
}
public function unserialize($serialized)
{
list(
$this->itemDB,
$this->parameter,
$this->orderDB,
$this->ccInterface
) = unserialize($serialized);
}
// ...
}
请记住在执行此操作后开始新会话。 (清除你的cookie)你可以在当前的会话中使用一个旧的PlaceOrderController
对象,没有任何适当的。
此外,您可能需要重新考虑整个脚本。这不是Java。为什么要在会话中存储PlaceOrderController
?
答案 1 :(得分:-1)
你的代码对我来说似乎很干净......但是;根据您使用的PHP版本, var 关键字可能不太理想,因为它意味着公开。如果您的会员变量是公开的;吸气剂和孵化器实际上或多或少都不是必需的。
回到问题。 我建议您查看文件的名称: ParameterInterface.php ,因为它可能没有被正确包含,可能是错字在文件名中左右。注意案例(上限和下限 - 取决于您的操作系统)。首先检查文件是否存在,看看你得到了什么;像这样:
<?php
if(file_exist("ParameterInterface.php")){
include "ParameterInterface.php";
die ("Sure, ParameterInterface.php exists and it has been included...");
}else{
die("Ah haaaa! Gotcha!!! So, 'ParameterInterface.php' does not exist in the current Directory....");
}
//AFTER THIS QUIRK DEBUGGING... YOU MIGHT JUST KNOW MORE...
您是否介意重新定义课程?像这样:
<?php
class ParameterInterface {
/**
* @var PDO $CON_LINK
*/
protected static $CON_LINK;
//WOULDN'T HURT TO ADD AN EMPTY CONSTRUCTOR... NOW, WOULD IT?
function __construct(){
$servername = '';
$dbname = '';
$username = '';
$password = '';
if(!self::$CON_LINK) {
try {
self::$CON_LINK = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
self::$CON_LINK->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
}
}
function connect() {
return self::$CON_LINK;
}
public function getParameters() {
$conn = $this->connect();
$query = "SELECT * FROM Admin;";
$result = $conn->query($query);
$row = $result->fetch(PDO::FETCH_ASSOC);
return $row;
}
}
?>
希望这有点帮助...