0

私はPHPの専門家ではありません...見落としがある場合はご容赦ください...

次のような 2 つの列を持つ csv ファイルがあります。

 john, VSgv4lEpuGS0vHIKapJZV7o...
 jane, yHKy6NW6YJZzloFhLDQUJIN...

1 つ目は単純な名前で、2 つ目は 1000 文字以上の文字列です。これらを、単純な名前が長い文字列をソースとするハイパーリンクになるページにエコーアウトしようとしています。私は次のものを持っています:

    <?php

            if (($list = fopen("list.csv", "r")) !== FALSE) {  
                while (($data = fgetcsv($list, 1000, ",")) !== FALSE) {
                    echo "<div><a href='localhost:8888/folder/".$data[1]."'>" . $data[0] . "</a></div>"; 
                }
                fclose($list);
            }

    ?>

代わりに、名前がリンクとして表示されますが、href には長い文字列の最後の 30 文字以上が含まれています。そして、最も奇妙な部分は、残りの 30 文字以上がその div の下に表示されることです... 独自の内部の内部 (つまり、リンクされた名前に設定した構造を模倣しています)

...なぜこれが起こっているのか&&それを修正する方法はありますか???? ...私はかなり困惑しています。

4

3 に答える 3

3

私の最初の推測では、非常に長い文字列のどこかに '<' または '>' 文字があり、html が壊れていると思います。これらの文字をエスケープする関数 htmlspecialchars() で $data[1] をラップしてみてください。

ドキュメント:
http://php.net/manual/en/function.htmlspecialchars.php

例:

echo "<div><a href='localhost:8888/folder/".htmlspecialchars( $data[1] )."'>" . htmlspecialchars( $data[0] ) . "</a></div>"; 
于 2013-05-17T20:38:05.263 に答える
1

ここの行:

while (($data = fgetcsv($list, 1000, ",")) !== FALSE) {

ファイルから 1000 文字を読み取ります。そしてそれを処理します。フィールドがその長さを超えている場合は、処理できるものを処理し、while ループの次の繰り返しで残りのフィールドを処理します。

fgets を使用してすべてを変数に読み込み、それを処理する方がよい場合があります。または、短期的な修正として、数を 1000 以上に増やすだけかもしれません。

于 2013-05-17T20:35:40.720 に答える
0

の 2 番目のパラメーター ( length)に関するドキュメントを引用しますfgetcsv()

CSV ファイル内の最長の行 (文字単位) よりも大きくする必要があります (末尾の行末文字を許可します)。

一番長い線の長さを見て、それに応じてパラメータを調整してください。2 番目のエントリだけでも 1000 文字を超える場合は、パラメータをさらに大きくする必要があります。

于 2013-05-17T20:36:56.143 に答える