Невозможно заставить DB :: query () работать с переменными из simpleXML

Я читаю файл XML и использую данные для создания запросов с помощью MeekroDB. Все выглядит хорошо с чтением и анализом XML, и я подтвердил, что переменные делают простой вывод. Тем не менее, когда я собираю DB :: query (), он, кажется, не добавляет массив ‘crit_list’ к запросу.

Вот мой XML-код:

<?xml version="1.0" encoding="utf-8"?>
<result>
<product>
<data>
<field>spr_tech1</field>
<value>S7</value>
<criteria field="xfield_3">
<criteria_list>Green</criteria_list>
<criteria_list>Beige</criteria_list>
</criteria>
</data>
<data>
<field>spr_tech1</field>
<value>S1</value>
<criteria field="xfield_3">
<criteria_list>Red</criteria_list>
<criteria_list>Blue</criteria_list>
<criteria_list>Yellow</criteria_list>
</criteria>
</data>
<data>
<field>spr_tech1</field>
<value>S7</value>
<criteria field="xfield_3">
<criteria_list>Green</criteria_list>
</criteria>
<criteria field="tech_rt2">
<criteria_list>Transistor</criteria_list>
</criteria>
</data>
</product>
</result>

Вот код, который я использую для чтения и построения запроса:

$xml_content = file_get_contents('transformations.xml');
$xform = simplexml_load_string($xml_content);
foreach ($xform->product->data as $data)
{
echo (string)$data->field . '<br>';
echo (string)$data->value . '<br>';

foreach($data->criteria->attributes() as $att => $val)
{ echo $att . ' = ' . $val . '<br>'; }
echo $data->criteria->attributes()->{'field'} . '<br>';

foreach($data->criteria->criteria_list as $att => $val)
{ echo $att . ' = ' . $val . '<br>'; }

echo "-----------------------------------<br>";
}

foreach ($xform->product->data as $data)
{
DB::query("UPDATE %b_table SET %?_new_field = %?_new_value WHERE %b_criteria_field IN %?_criteria_list",
array(
'table' => 'product',
'new_field' => (string)$data->field,
'new_value' => (string)$data->value,
'criteria_field' => (string)$data->criteria->attributes()->{'field'},
'criteria_list' => $data->criteria->criteria_list
)
);
}
print "<pre>";
print_r($xform);
print "</pre>";

Когда я запускаю его, я получаю следующую ошибку:
ВОПРОС: ОБНОВЛЕНИЕ product SET ‘spr_tech1’ = ‘S7’ ГДЕ xfield_3 В
ОШИБКА: у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом с » spr_tech1 ‘=’ S7 ‘ГДЕ xfield_3 IN ‘в строке 1

Я также попытался использовать json_decode (json_encode ($ obj), true) для преобразования XML в массив, но потом я не смог выяснить, как получить доступ к полю @attributes узла «критериев».

0

Решение

Ваша библиотека БД ожидает массив строк для criteria_list заполнитель, но вы даете ему объект ($data->criteria->criteria_list будет примером SimpleXMLElement).

Что вам нужно сделать, это использовать foreach цикл, который вы написали для отладки, чтобы получить фактические строки из XML:

foreach($data->criteria->criteria_list as $att => $val)

Я переименую эти переменные и напишу так:

$criteria_strings = [];
foreach($data->criteria->criteria_list as $list_item) {
$criteria_strings[] = (string)$list_item;
}

Затем:

DB::query("UPDATE %b_table SET %?_new_field = %?_new_value WHERE %b_criteria_field IN %?_criteria_list",
array(
'table' => 'product',
'new_field' => (string)$data->field,
'new_value' => (string)$data->value,
'criteria_field' => (string)$data->criteria['field'],
'criteria_list' => $criteria_strings
)
);
1

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

Других решений пока нет …

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