0

スクリプトを作成する方法を見つけようとしていて、助けが必要です。

PHP 5 と MySQL 5.1.67 を使用しています

私の目標は、DB から特定のフィールドを抽出し、PHP で再フォーマットしてリストとして表示できるようにすることです。再フォーマットには HTML シーケンスが含まれます。私の目標は、Web ページを自動的に更新する自動化された CRON スクリプトをこれから作成することです。

私はこれらの言語の経験がほとんどありません。だからどんな助けでもいいでしょう。

私の論理は、すべてを 1 つの (mysql) テーブルにロードする必要があるというものです。私の XML は latin1 文字セットを使用しています。カテゴリ、ID、タイトル、および説明は、テーブルの各列です。

mysql の構造は次のとおりです。

カテゴリ mysql は VARCHAR を使用
します Latin1 サイト
は id の下にグループ化するために使用されました mysql は VARCHAR を使用します Latin1
タイトル mysql は VARCHAR を使用します Latin1
説明 mysql は VARCHAR を使用します Latin1

XML 構造は次のとおりです。

// XML Structure
// 23 categories to loop through
// hunderds of sites to loop through per category
//
<catalog>
<category>
<name>Category_Name</name>
<site>
<id>UR545665U</id>
<pagerank>1</pagerank>
<title>Title_Name</title>
<description>Description_of_the_site</description>
</site>
</category>
</catalog>
//
//

以下のコードを使用して XML と DB をロードするところまで来ました。

//mysql connection
$con2 = mysql_connect("www.hosting.com","db_username","db_password");
if (!$con2) {
    die('Could not connect: ' . mysql_error());
}

$dbcon1 = mysql_select_db("database_name", $con2);
if (!$dbcon1) {
    die ('Can\'t use database_name : ' . mysql_error());
}


//simplexml load xml file with simplexml
$library=  simplexml_load_file('feed.xml');
    if ($xml === false) {
        echo "Failed loading XML\n";
        foreach(libxml_get_errors() as $error) {
            echo "\t", $error->message;
        }
    }

次に、ここで問題が発生します...カテゴリをループし、その中でサイトをループする必要があります。私が抱えている問題は、getName() 関数を使用できず<category><site>xml 内で名前が付けられていないことです。その<name>ため、カテゴリが一意であるため、カテゴリ<id>を識別し、サイトと一意を識別するために使用しています。

したがって、ここでの私のロジックは、それ自体に foreach() 関数を含めることです。カテゴリをループし、そのカテゴリ内の各サイトをループします。

//begin loop each category and each site
foreach($library->xpath('/Catalog/Category/Name') as $category) {
    foreach($library->xpath('/Catalog/Category/Name/Site/Id') as $id) {
        $site = $library->xpath('//Site');
        $title = $site->Title;
        $description = $site->Description;

この時点から、ハッキングを避けるために、mysql 5 の適切なエスケープ シーケンスを使用して SQL プロセスを適切にフォーマットします。

これを行う方法は次のように考えています。

// Format Query String into a variable
// Note: VALUES are in "" because they may contain strings
// sprintf() will run on each loop to format the new <site> string

        $mynewquery = sprintf('REPLACE INTO Table_Name (id, title, description, category) VALUES (\"%4$s\",\"%6$s\",\"%7$s\",\"%3$s\")');
        if ($mynewquery === false) {
            echo "Failed formatting query string\n";
            foreach(libxml_get_errors() as $error) {
                echo "\t", $error->message;
            }
        }   


//Run Query String to load data into DB

        mysql_query($mynewquery);
        if (!$mynewquery) {
            die ('Error running Query: ' . mysql_error());
        }
//
// close the loops and database connection after this.

プロセスに関するフィードバックを得るために、echo ステートメント (表示されていません) を使用しました。エラーなしで XML をロードします。私の推測では、ループ プロセスに構文上の問題があると思われます。だから私はいくつかの質問があります:

  • 私の論理は正しいですか?
  • XML に DTD が参照されている場合、スクリプトに特別なコードを配置する必要はありますか?
  • 目的を達成するために適切な変数と関数を使用していますか?

これを機能させる方法について何か提案はありますか? 試してみましたが、DB がデータをロードしません。

4

1 に答える 1

0

xml 要素をループしていますが、ループ変数をまったく参照していません。次のようなものが必要です。

foreach($library->Category as $category) {
    foreach($category->Site as $site) {
        $id = $site->Id;
        $title = $site->Title;
        $description = $site->Description;

        //- insert into db here
    }
}
于 2013-02-17T15:33:20.080 に答える