无法让DB :: query()使用simpleXML中的变量

时间:2016-06-02 03:55:27

标签: php mysql xml simplexml meekro

我正在阅读一个XML文件,并使用该数据创建MeekroDB查询。通过XML读取和解析,一切看起来都很好,我确认变量做了简单的回声。但是,当我构建DB :: query()时,它似乎并没有添加' criteria_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>";

当我运行它时,我收到以下错误: QUERY:更新product SET&#39; spr_tech1&#39; =&#39; S7&#39;在哪里xfield_3 IN 错误:您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在&#39;&#39; spr_tech1&#39;附近使用正确的语法。 =&#39; S7&#39; xfield_3 IN&#39;在第1行

我也尝试使用json_decode(json_encode($ obj),true)将XML转换为数组,但后来我无法弄清楚如何访问&#39;标准的@attributes字段&# 39;节点

1 个答案:

答案 0 :(得分:1)

您的数据库库需要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
    )
);