Может кто-нибудь объяснить, что именно это означает с точки зрения неспециалистов?
Мне говорят, что в функции 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();
}
Ошибка 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
Класс доступен в том месте, где вы извлекаете его из сеанса.
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, я выбираю объект ваучера, сохраненного в сеансе.
Если честно, это работает большую часть времени, но иногда это не так. Я не слишком уверен. Я только что попробовал это сам, несколько раз, и это работает, но когда я заставляю других людей попробовать это, это работает для некоторых, а не для других? !! Я за пределами потерян!