mindwarpltd
asked on
How can I get rid of this 'PHP Notice: Undefined offset: 0 in' and reduce my lines of code?
I have the following code..
Which produces this error
PHP Notice: Undefined offset: 0 in ....
I'm checking various items in xml, its this line that produces the error.
$RDpurchaseid = $result[0];
As you can see my code is very simplistic, what can I do to get rid of the error and have less lines of code ?
Which produces this error
PHP Notice: Undefined offset: 0 in ....
I'm checking various items in xml, its this line that produces the error.
$RDpurchaseid = $result[0];
As you can see my code is very simplistic, what can I do to get rid of the error and have less lines of code ?
<?php
$conON = "OrderNotification";
$conRD = "RefundDone";
$conFRD = "FraudRefundDone";
$conCBLN = "ChargebackLetter";
$conCBN = "Chargeback";
$conCBR = "ChargebackReversal";
$conPurchaseID = "/Purchase/PurchaseId";
$conDeliveryEmail = "/Purchase/CustomerData/DeliveryContact/Email";
$conBillingEmail = "/Purchase/CustomerData/BillingContact/Email";
$conPayStatus = "/Purchase/PaymentStatus";
$conPurchaseDate = "/Purchase/PurchaseDate";
include "shareitxml.php";
$xmlstr = utf8_encode($xmlstr);
#$xml = simplexml_load_string($xmlstr, NULL, LIBXML_NOERROR | LIBXML_NOWARNING);
$xml = simplexml_load_string($xmlstr);
$result = $xml->xpath($conON . $conPurchaseID);
$ONpurchaseid = $result[0]; }
$result = $xml->xpath($conRD . $conPurchaseID);
$RDpurchaseid = $result[0];
$result = $xml->xpath($conFRD . $conPurchaseID);
$FRDpurchaseid = $result[0];
$result = $xml->xpath($conCBLN . $conPurchaseID);
$CBLNpurchaseid = $result[0];
$result = $xml->xpath($conCBN . $conPurchaseID);
$CBNpurchaseid = $result[0];
$result = $xml->xpath($conCBR . $conPurchaseID);
$CBRpurchaseid = $result[0];
$NotifyType = "";
if ($ONpurchaseid != "") {
$NotifyType = $conON;
} elseif ($RDpurchaseid != "") {
$NotifyType = $conRD;
} elseif ($FRDpurchaseid != "") {
$NotifyType = $conFRD;
} elseif ($CBLNpurchaseid != "") {
$NotifyType = $conCBLN;
} elseif ($CBNpurchaseid != "") {
$NotifyType = $conCBN;
} elseif ($CBRpurchaseid != "") {
$NotifyType = $conCBR;
}
$result = $xml->xpath($NotifyType . $conDeliveryEmail);
$deliveremail = $result[0];
$result = $xml->xpath($NotifyType . $conBillingEmail);
$billingemail = $result[0];
$result = $xml->xpath($NotifyType . $conPayStatus);
$paymentstatus = $result[0];
$result = $xml->xpath($NotifyType . $conPurchaseID);
$purchaseid = $result[0];
$result = $xml->xpath($NotifyType . $conPurchaseDate);
$purchasedate = $result[0];
echo "DE=" . $deliveremail . "<BR/>";
echo "BE=" . $billingemail . "<BR/>";
echo "PS=" . $paymentstatus . "<BR/>";
echo "PI=" . $purchaseid . "<BR/>";
echo "PD=" . $purchasedate . "<BR/>";
?>
You have an extra curly bracket "}" at the end of line 21. Try removing it...
ASKER
Yes, sorry, thats a mistake while I've copied it across, but the error still remains etc
ASKER
For completeness here is shareitxml.php
<?php
$xmlstr = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<e5Notification xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://xml.element5.com/2.0/notification.xsd">
<OrderNotification>
<Purchase>
<PurchaseId>137693001</PurchaseId>
<PurchaseDate>2007-07-24T15:24:40</PurchaseDate>
<PurchaseOrigin>Other</PurchaseOrigin>
<PaymentCompleteDate>2007-07-
24T15:33:42</PaymentCompleteDate>
<PaymentStatus>complete</PaymentStatus>
<SequentialInvoiceNo>e5-DE-2007-
00001091596</SequentialInvoiceNo>
<CustomerData>
<BillingContact>
<LastName>Stange</LastName>
<FirstName>Karsten</FirstName>
<Email>stange@element5.de</Email>
<Address>
<Street1>Vogelsanger Str. 78</Street1>
<City>Köln</City>
<PostalCode>50823</PostalCode>
<CountryId>DE</CountryId>
<Country>Germany</Country>
</Address>
</BillingContact>
<DeliveryContact>
<LastName>Stange</LastName>
<FirstName>Karsten</FirstName>
<Email>stange@element5.de</Email>
<Address>
<Street1>Vogelsanger Str. 78</Street1>
<City>Köln</City>
<PostalCode>50823</PostalCode>
<CountryId>DE</CountryId>
<Country>Germany</Country>
</Address>
</DeliveryContact>
<CustomerPaymentData>
<PaymentMethod>Visa</PaymentMethod>
<Currency>EUR</Currency>
</CustomerPaymentData>
<Language>English</Language>
<SubscribeNewsletter>true</SubscribeNewsletter>
</CustomerData>
<PurchaseItem>
<RunningNo>1</RunningNo>
<ProductId>300170245</ProductId>
<ProductName>QA Product XML mails</ProductName>
<NotificationNo>6</NotificationNo>
<DeliveryType>Electronically</DeliveryType>
<Currency>EUR</Currency>
<Quantity>1</Quantity>
<ProductSinglePrice>10.00</ProductSinglePrice>
<VatPct>19.00</VatPct>
<Discount>0.00</Discount>
<ExtendedDownloadPrice>0.00</ExtendedDownloadPrice>
<ManuelOrderPrice>0.00</ManuelOrderPrice>
<ShippingPrice>0.00</ShippingPrice>
<ShippingVatPct>0.00</ShippingVatPct>
</PurchaseItem>
</Purchase>
</OrderNotification>
</e5Notification>
XML;
?>
The notice means an access to an array element that doesn't exist. In fact, in your xml i can't see the RefundDone/Purchase/Purcha seID element you're trying to access in the offending line. Try adding it to the xml.
ASKER
Yes your correct.
However, thats the point, I'm trying to detect which xml data has been used it could be
OrderNotification/Purchase /PurchaseI D
or
RefundDone/Purchase/Purcha seID
etc.
A lot of my code is used to determine which xml data is being used and getting the right data.
However, thats the point, I'm trying to detect which xml data has been used it could be
OrderNotification/Purchase
or
RefundDone/Purchase/Purcha
etc.
A lot of my code is used to determine which xml data is being used and getting the right data.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Great, that does get rid of the error.
Any ideas about reducing the lines of code I'm using, by some clever code to detect which data is being used etc?
Any ideas about reducing the lines of code I'm using, by some clever code to detect which data is being used etc?
When in this situations where you have to "if" for a lot of values, I usually go for this approach: put the values you want to check in an array, and loop through the array. Look at the code I'm attaching (I haven't checked if it works, but I expect you get the idea)
$valuesToCheck = array( "OrderNotification", "RefundDone", "FraudRefundDone" );
foreach( $valuesToCheck as $value)
{
$valueToUse = $xml->xpath($value . $conPurchaseID);
if( isset( $valueToUse ) )
break;
}
// Here you'll have the set value