объект — ошибка PHP: вызов функции-члена getDateBought () при нулевом переполнении стека

Может кто-нибудь объяснить, что именно это означает с точки зрения неспециалистов?

Мне говорят, что в функции getDateBought из моего объекта php ничего не возвращается?

$VoucherType = htmlspecialchars($_POST['VoucherType']);
$VoucherValue = htmlspecialchars($_POST['VoucherValue']);
$BuyerName = htmlspecialchars($_POST['BuyerName']);
$BuyerEmail = htmlspecialchars($_POST['BuyerEmail']);
$BuyerPhone = htmlspecialchars($_POST['BuyerPhone']);
$FlyerName = htmlspecialchars($_POST['FlyerName']);
$FlyerMessage = htmlspecialchars($_POST['FlyerMessage']);

if (filter_var($BuyerEmail, FILTER_VALIDATE_EMAIL) && $BuyerName != "" && $BuyerEmail != "" && $BuyerPhone != "" && $FlyerName != ""){

$Date = strval(date("d-m-Y"));

$Voucher = new Voucher("", $Date, $BuyerName, $BuyerEmail, $BuyerPhone, $FlyerName, $FlyerMessage, $VoucherType, $VoucherValue, "Unredeemed");

session_start();
$_SESSION['Voucher'] = $Voucher;

Вот класс ваучеров:

    function __construct($id, $dateBought, $buyerName, $buyerEmail, $buyerPhone, $flyerName, $flyerMessage, $voucherType, $voucherPrice, $voucherStatus){
$this->id = $id;
$this->dateBought = $dateBought;
$this->buyerName = $buyerName;
$this->buyerEmail = $buyerEmail;
$this->buyerPhone = $buyerPhone;
$this->flyerName = $flyerName;
$this->flyerMessage = $flyerMessage;
$this->voucherType = $voucherType;
$this->voucherPrice = $voucherPrice;
$this->voucherStatus = $voucherStatus;
}

public function getId(){return $this->id;}
public function getDateBought(){return $this->dateBought;}
public function getBuyerName(){return $this->buyerName;}
public function getBuyerEmail(){return $this->buyerEmail;}
public function getBuyerPhone(){return $this->buyerPhone;}
public function getFlyerName(){return $this->flyerName;}
public function getFlyerMessage(){return $this->flyerMessage;}
public function getVoucherType(){return $this->voucherType;}
public function getVoucherPrice(){return $this->voucherPrice;}
public function getVoucherStatus(){return $this->voucherStatus;}

public function setId($id){$this->id = $id;}
public function setDateBought($dateBought){$this->dateBought = $dateBought;}
public function setBuyerName($buyerName){$this->buyerName = $buyerName;}
public function setBuyerEmail($buyerEmail){$this->buyerEmail = $buyerEmail;}
public function setBuyerPhone($buyerPhone){$this->buyerPhone = $buyerPhone;}
public function setFlyerName($flyerName){$this->flyerName = $flyerName;}
public function setFlyerMessage($flyerMessage){$this->flyerMessage = $flyerMessage;}
public function setVoucherType($voucherType){$this->voucherType = $voucherType;}
public function setVoucherPrice($voucherPrice){$this->voucherPrice = $voucherPrice;}
public function setVoucherStatus($voucherStatus){$this->voucherStatus = $voucherStatus;}
}

Ошибка PHP: вызов функции-члена getDateBought () для нулевого php — это ошибка, которую я получаю, когда пытаюсь получить к ней доступ из объекта сохраненного сеанса!

Позже, после возвращения из PayPal, я перезагружаю переменную сессии (My PHP Object of Voucher). Затем я использую свою функцию Создать ваучер, чтобы добавить ее в базу данных, если платеж был принят!

public function CreateVoucher($Voucher){
$sql = "INSERT INTO ".VoucherFunctions::Table_Name." (".VoucherFunctions::ID.", ".VoucherFunctions::DateBought.", ".VoucherFunctions::BuyerName.", ".VoucherFunctions::BuyerEmail.", ".VoucherFunctions::BuyerPhone.", ".VoucherFunctions::FlyerName.", ".VoucherFunctions::FlyerMessage.", ".VoucherFunctions::VoucherType.", ".VoucherFunctions::VoucherPrice.", ".VoucherFunctions::VoucherStatus.") VALUES (:id, :dateBought, :buyerName, :buyerEmail, :buyerPhone, :flyerName, :flyerMessage, :voucherType, :voucherPrice, :voucherStatus)";

$stmt = $this->mConnection->prepare($sql);
$stmt -> bindValue(':id', '');
$stmt -> bindValue(':dateBought', $Voucher->getDateBought());
$stmt -> bindValue(':buyerName', $Voucher->getBuyerName());
$stmt -> bindValue(':buyerEmail', $Voucher->getBuyerEmail());
$stmt -> bindValue(':buyerPhone', $Voucher->getBuyerPhone());
$stmt -> bindValue(':flyerName', $Voucher->getFlyerName());
$stmt -> bindValue(':flyerMessage', $Voucher->getFlyerMessage());
$stmt -> bindValue(':voucherType', $Voucher->getVoucherType());
$stmt -> bindValue(':voucherPrice', $Voucher->getVoucherPrice());
$stmt -> bindValue(':voucherStatus', $Voucher->getVoucherStatus());

$stmt->execute();
}

0

Решение

Ошибка Call to a member function getDateBought() on null означает, что переменная, для которой вы пытались вызвать этот метод, не является экземпляром объекта, это null значение.

Вы храните свой экземпляр $Voucher в сеансе с использованием:

$_SESSION['Voucher'] = $Voucher;

Сейчас как работают PHP сессии, он будет автоматически сериализовать его для вас, а при его получении — десериализовать. Один улов в том, что Voucher учебный класс должен быть включенным или доступным через автозагрузку до вы извлекаете его из сеанса, или он не будет знать, как преобразовать его обратно в объект.

К сожалению, вы не включили код, в котором фактически удалили его из сеанса и передали его CreateVoucher() метод, но это явно не пример Voucher в то время как это передается в этот метод. Вы можете напечатать свой метод, чтобы убедиться, что экземпляр Voucher передан, выполнив что-то вроде:

public function CreateVoucher(Voucher $voucher)
{
// Use $voucher here knowing for sure you have an instance
}

Проверьте код, в котором вы получаете значение из сеанса, который, я думаю, выглядит примерно так? И попробуйте избавиться от этого, чтобы увидеть, получаете ли вы то, что вы думаете:

$Voucher = $_SESSION['Voucher'];
var_dump($Voucher); // Should be an instance of Voucher
exit;

Может быть, вам нужно явно позвонить serialize() на $Voucher переменная перед установкой в ​​сеансе. Кроме того, трижды проверить пространство имен / включает в себя правильные и Voucher Класс доступен в том месте, где вы извлекаете его из сеанса.

0

Другие решения

elseif(_GET('token')!=''&& _GET('PayerID')!=''){
$paypal->DoExpressCheckoutPayment();

$Voucher = $_SESSION['Voucher'];

$connection = DB::getConnection();
$VoucherFunctions = new VoucherFunctions($connection);
$VoucherFunctions->CreateVoucher($Voucher);

$FlightNo = $VoucherFunctions->FindNewVoucherNumber();

$Voucher->setId($FlightNo);
$_SESSION['Voucher']->setId($FlightNo);

include_once ('../emails/GiftVoucherEmail.php');

header("Location: ../../purchasecomplete.php");
}

Джереми, большое спасибо за ответ. Когда пользователь возвращается из PayPal, я выбираю объект ваучера, сохраненного в сеансе.

Если честно, это работает большую часть времени, но иногда это не так. Я не слишком уверен. Я только что попробовал это сам, несколько раз, и это работает, но когда я заставляю других людей попробовать это, это работает для некоторых, а не для других? !! Я за пределами потерян!

0

По вопросам рекламы [email protected]