2

ユーザーが機能の各ブロックのタイトルで機能リストを作成できるテキストエリアがあります。アイデアは、[タイトル] と機能を 2 つの異なる MySQL テーブルに格納することです。

【屋外】
BBQ
テニスコート
プール

【内臓設備】
DVDプレーヤー
プラズマスクリーン

これが私がこれまでに行ったことです。それは動作しますが、きちんとしていません:

<form name="form" method="get" action="">
  <p>
    <textarea name="content" cols="35" rows="12" id="content"><? 
if (isset($_GET['content'])) echo $_GET['content']; ?></textarea>
  </p>
  <p>
    <input name="parse" type="submit" id="parse" value="Parse">
  </p>
</form>
<?php

if(isset($_GET['parse']))
{
   $content = $_GET['content'];
   $content = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $content);
   $content = trim($content);

   $content1 = preg_replace('/\r\n|\r/', "\n", $content );  
    $data = explode("\n", $content1); 


    $p=0;
   foreach ($data as $title) {
   if (substr_count($title, '[')||substr_count($title, ']')){
  $p++;
   $arr[$p]=$title;

   }else {
   $g[$p][]=$title;
   }
   }

    print_r($arr); 
    echo '<br />';
    print_r($g);
}
?>

アイデアをありがとう。

4

3 に答える 3

1

それ以外の場合は、フォームで代わりに POST メソッドを使用してください。クエリ文字列 vars は簡単に改ざんできます。

于 2010-07-14T07:07:28.747 に答える
0

ほとんどの場合、コードは問題ないように見えます。

私が見る問題は、ユーザー入力をサニタイズしているのではなく、直接表示していることです。

if (isset($_GET['content'])) echo $_GET['content']; 

少なくとも、strip_tags() を使用します。

if (isset($_GET['content'])) echo strip_tags($_GET['content']));

また、おそらく GET の代わりに POST を使用する必要があります。

編集:

私が気付いたもう 1 つのことは、中括弧の使用に一貫性がないことです。K&R スタイルを使用します。

if (some_condition) {
    code
}

または、それらを別の行に入れます(私の好みのアプローチ):

if (some_condition)
{
    code
}

(このスタイルに名前があるかどうか知っている人はいますか?)

インデントについても同じです。一貫性を保ちます。これは単なるスタイルの問題ですが、コードの読みやすさに影響します。

于 2010-07-14T07:19:42.573 に答える
0

これで十分ですか?

$result = array();
$content = array_filter(array_map('trim', explode('[', $_GET['content'])), 'strlen');

foreach ($content as $value)
{
    $value = array_map('trim', explode("\n", $value));
    $result[rtrim(array_shift($value), ']')] = $value;
}

そして出力:

echo '<pre>';
print_r($result);
echo '</pre>';

Array
(
    [Outdoor] => Array
        (
            [0] => BBQ
            [1] => Tennis court
            [2] => Swimming pool
        )

    [Internal Equipment] => Array
        (
            [0] => DVD Player
            [1] => Plasma screen
        )

)

$result配列をどうするか知っていると思いますか?何かのようなもの:

foreach ($result as $title => $features)
{
    // INSERT INTO foo (title) VALUES ($title);

    foreach ($features as $feature)
    {
        // or INSERT INTO bar (title, features) VALUES ($title, $feature);
    }
}
于 2010-07-14T07:43:56.340 に答える