#php #sql #json #xml
#php #sql #json #xml
Вопрос:
Мне нужно импортировать файл в мою базу данных. Я получаю файл с URL-адреса с помощью curl, но я не могу его импортировать. Я предполагаю, что я довольно близок к этому, но я что-то упускаю в своем цикле foreach, чтобы получить всего рекламодателя. Я получаю массив, но не те элементы, которые мне нужны
public function import()
{
$url = $this->get_data();
$xml = new SimpleXMLElement($url);
$json_string = json_encode($xml);
$advertisers = json_decode($json_string, TRUE);
$this->import_advertiser($advertisers);
}
public function import_advertiser($advertisers = [])
{
echo $advertisers;
if($advertisers) {
foreach($advertisers as $advertiser)
{
$attr = [
'advertiser-id' => $advertiser->advertiser-id,
'advertiser-name' => $advertiser->advertiser-name,
'program-url' => $advertiser->program-url,
'relationship-status' => $advertiser->relationship-status,
];
$this->db->replace($this->table_program_name, $attr);
}
}}
Мой xml выглядит следующим образом, отредактированный:
<?xml version="1.0" encoding="UTF-8"?>
<cj-api>
<advertisers total-matched="2" records-returned="2" page-number="1">
<advertiser>
<advertiser-id>4942550</advertiser-id>
<account-status>Active</account-status>
<seven-day-epc>26.63</seven-day-epc>
<three-month-epc>28.71</three-month-epc>
<language>en</language>
<advertiser-name>NIKE</advertiser-name>
<program-url>http://www.nike.com</program-url>
<relationship-status>notjoined</relationship-status>
<mobile-tracking-certified>true</mobile-tracking-certified>
<cookieless-tracking-enabled>true</cookieless-tracking-enabled>
<network-rank>5</network-rank>
<primary-category>
<parent>Sports amp;amp; Fitness</parent>
<child>Apparel</child>
</primary-category>
<performance-incentives>false</performance-incentives>
<actions>
<action>
<name>Nike.com Purchase</name>
<type>advanced sale</type>
<id>393783</id>
<commission>
<itemlist name="Hurley Non-Commissionables" id="33329">USD 0.00</itemlist>
<itemlist name="Converse Non-Commissionables" id="33330">USD 0.00</itemlist>
<itemlist name="Nike Non-Commissionables" id="33331">USD 0.00</itemlist>
<itemlist name="Flash Sale" id="33643">1.00%</itemlist>
<itemlist name="Flash Sale Non-Commissionables" id="33644">USD 0.00</itemlist>
<default>3.00%</default>
</commission>
</action>
<action>
<name>Nike.com Mobile Purchase</name>
<type>advanced sale</type>
<id>393784</id>
<commission>
<itemlist name="Hurley Non-Commissionables" id="33329">USD 0.00</itemlist>
<itemlist name="Converse Non-Commissionables" id="33330">USD 0.00</itemlist>
<itemlist name="Nike Non-Commissionables" id="33331">USD 0.00</itemlist>
<itemlist name="Flash Sale" id="33643">1.00%</itemlist>
<itemlist name="Flash Sale Non-Commissionables" id="33644">USD 0.00</itemlist>
<default>3.00%</default>
</commission>
</action>
</actions>
<link-types>
<link-type>Text Link</link-type>
<link-type>Banner</link-type>
<link-type>OtherDeepLink</link-type>
<link-type>Test Link</link-type>
<link-type>DeepLink</link-type>
<link-type>AutoMoneyDeepLink</link-type>
</link-types>
</advertiser>
<advertiser>
<advertiser-id>4659293</advertiser-id>
<account-status>Setup</account-status>
<seven-day-epc>N/A</seven-day-epc>
<three-month-epc>N/A</three-month-epc>
<language>en</language>
<advertiser-name>Nike</advertiser-name>
<program-url>http://www.nike.com</program-url>
<relationship-status>notjoined</relationship-status>
<mobile-tracking-certified>false</mobile-tracking-certified>
<cookieless-tracking-enabled>false</cookieless-tracking-enabled>
<network-rank>0</network-rank>
<primary-category>
<parent>Sports amp;amp; Fitness</parent>
<child>Apparel</child>
</primary-category>
<performance-incentives/>
<actions/>
<link-types>
<link-type>Text Link</link-type>
</link-types>
</advertiser>
</advertisers>
</cj-api>
Я вижу, что он пытался подключиться к моей базе данных, но таблица не импортирует данные
Комментарии:
1. Я получаю сообщение об ошибке
$xml = new SimpleXMLElement($url);
из этого элемента в файле XML<parent>Home amp; Garden</parent>
2. Я sry, теперь я отредактировал свой xml
Ответ №1:
Кажется, вы немного запутались с массивами и объектами в этой функции
Как вы использовали $advertisers = json_decode($json_string, TRUE);
в предыдущей функции, тогда пара простых изменений исправит создание $attr
массива. Кроме того, вы не запускали цикл foreach в нужной точке структуры данных.
function import_advertiser($advertisers = [])
{
if($advertisers) {
foreach($advertisers['advertisers']['advertiser'] as $advertiser) {
$attr = [
'advertiser-id' => $advertiser['advertiser-id'],
'advertiser-name' => $advertiser['advertiser-name'],
'program-url' => $advertiser['program-url'],
'relationship-status' => $advertiser['relationship-status']
];
$this->db->replace($this->table_program_name, $attr);
}
}
}
Комментарии:
1. Я тоже пробовал это, но забыл использовать $advertisers[‘рекламодатели’][‘рекламодатель’], большое вам спасибо, это решило мою проблему 🙂
Ответ №2:
Ваш XML неправильно сформирован. «amp;» должно быть
- либо экранированный (
<parent>Home amp;amp; Garden</parent>
) - или помещается в раздел CDATA (
<parent><![CDATA[Home amp; Garden]]></parent>
)