sql >> データベース >  >> RDS >> Mysql

phpを使用してXMLデータをmysqlに挿入します

    あなたが持っているXMLデータについては、SimpleXML拡張機能をお勧めします。必要なものがすべて付属しており、記述するコードはそれほど多くありません(DOMDocumentの妹です)。

    つまり、顧客ごとに 入力データで、9個程度の値をフェッチする必要があります。これらの値をxpathとして定式化できます:

    $values = <<<XPATH
    (
        name
        |address
        |city
        |state
        |zip
        |phone
        |buyerinfo/shippingaddress/name
        |buyerinfo/shippingaddress/address
        |shippingDetail/saletax/saletaxamount
    )
    XPATH;
    

    これは、データベースクエリの場合と同様に機能します。 Xpath言語のXMLのクエリを含む文字列を作成します。

    また、SQLについても同じことを行います。これは、両方が連携する必要があるためです。したがって、SQLパターンは次のとおりです。

    $pattern = <<<SQL
    INSERT INTO customer
      (
        name, address, city, state, zip, phone, shipto, shipadderss, tax
      )
      VALUES
      (
        '%s','%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'
      )
    SQL;
    

    ここで必要なのは、XMLを開き、作業する顧客要素を指定することだけです。

    $customers = simplexml_load_string($test)->customer; // "test.xml"
    

    次に、各顧客をforeachし、値を取得してエスケープし、クエリに挿入してSQLクエリを実行する(または複数のレコードを含む1つの大きなクエリを作成する)だけです。

    foreach ($customers as $customer) 
    {
        $data = $customer->xpath($values);
        $escaped = array_map('mysql_real_escape_string', $data);
        $query = vsprintf($pattern, $escaped);
    
        // you can now run the query now
        // ...
    }
    

    はい、それはすでにあなたのコードです。ご覧のとおり、配列、xpath、SQLを利用して、これを大幅に簡素化できます。

    最初の顧客の場合 サンプルXMLでは、これにより次のクエリが生成されます。

    INSERT INTO customer
      (
        name, address, city, state, zip, phone, shipto, shipadderss, tax
      )
      VALUES
      (
        'customer 1','address 1', 'city 1', 'state 1', 'zip 1', 'phone 1', 'ship to', 'Ship address1', '2'
      )
    

    コード全体-例:

    $values = <<<XPATH
    (
        name
        |address
        |city
        |state
        |zip
        |phone
        |buyerinfo/shippingaddress/name
        |buyerinfo/shippingaddress/address
        |shippingDetail/saletax/saletaxamount
    )
    XPATH;
    
    $pattern = <<<SQL
    INSERT INTO customer
      (
        name, address, city, state, zip, phone, shipto, shipadderss, tax
      )
      VALUES
      (
        '%s','%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'
      )
    SQL;
    
    $customers = simplexml_load_string($test)->customer; // "test.xml"
    
    foreach ($customers as $customer)
    {
        $data = $customer->xpath($values);
        $escaped = array_map('mysql_real_escape_string', $data);
        $query = vsprintf($pattern, $escaped);
    
        // you can now run the query now
        $result = mysql_query($query);
        if(mysql_errno())
        {
            printf(
                '<h4 style="color: red;">Query Error:</h4>
                <p>(%s) - %s</p>
                <p>Query:
                  <pre>%s</pre>
                </p>
                <hr />',
                mysql_errno(),
                htmlspecialchars(mysql_error()),
                htmlspecialchars($query)
            );
        }
    }
    


    '、mysql_errno()、htmlspecialchars(mysql_error())、htmlspecialchars($ query)); }}

    1. OPENJSON「キーワード「with」の近くの構文が正しくありません。」 SQL Server(解決済み)

    2. CentOSにMySQL8をインストールする手順

    3. MySQL安全な更新モードを使用していて、WHEREなしでテーブルを更新しようとしました

    4. mySQLでのPostgreSQLのdate_trunc