PHPでの質問です。


[date.dat]
1,2,3,4,5,6,7,8,9,0
a,b,c,d,e,f,g,h,i,j
A,B,C,D,E,F,G,H,I,J

date.datというファイルに上の形式でデータが入っている場合
特定箇所を
input type="text"
に表示させ、表示された数値を変えて
submitを押すとデータが書き換えられるコードを
作っておりますが、どうもうまく機能しません。
こういったモノで簡単なサンプルなどありましたら
教えていただけないでしょうか?

回答の条件
  • 1人5回まで
  • 登録:2007/02/01 23:09:17
  • 終了:2007/02/06 08:07:52

回答(2件)

id:okuryu No.1

okuryu回答回数72ベストアンサー獲得回数32007/02/01 23:52:56

ポイント35pt

簡単に書いてみただけですがこんな感じでいいんでしょうか。

hoge.php

<?php

if (!empty($_POST['n'])) {
    $data = file('date.dat');
    $dataLength = count($data);
    $value = explode('-', $_POST['n']);
    $line = explode(',', rtrim($data[$value[0]]));
    $line[$value[1]] = $_POST['v'];
    $data[$value[0]] = implode(',', $line) . "\n";
    $handle = fopen("date.dat", "w");
    foreach ($data as $item) {
        fwrite($handle, $item);
    }
    fclose($handle);
}

$data = file('date.dat');
$dataLength = count($data);

if (!empty($_GET['n'])) {
    $value = explode('-', $_GET['n']);
    $line = explode(',', rtrim($data[$value[0]]));
    echo '<form action="hoge.php" method="post">';
    echo '<p><input type="hidden" name="n" value="' . $_GET['n'] . '" /></p>';
    echo '<p><input type="text" name="v" value="' . $line[$value[1]] . '" /></p>';
    echo '<p><input type="submit" value="保存" /></p>';
    echo '</form>';
}

echo '<table border="1">';

for ($i = 0; $i < $dataLength; $i++) {
    $line = explode(',', rtrim($data[$i]));
    $lineLength = count($line);
    echo '<tr>';
    for ($j = 0; $j < $lineLength; $j++) {
        echo '<td><a href="hoge.php?n=' . $i . '-' . $j . '">' . $line[$j] . '</a></td>';
    }
    echo '</tr>';
}

echo '</table>';

?>
id:quocard

すごい

まさか実際に作っていただけるとは。

参考になります。

ありがとうございました。

2007/02/02 00:06:50
id:tobeoscontinue No.2

tobeoscontinue回答回数214ベストアンサー獲得回数542007/02/02 22:14:29

ポイント35pt

サンプルということで関数にして書いてみました。

/*ファイルの内容をdelimiterで区切った二次元の配列を返す*/
function array_table_get($path, $delimiter=',')
{
  $file = file($path);
  $table = array();
  foreach ($file as $line)
    $table[] = explode($delimiter, rtrim($line));
  return $table;
}
/*二次元のデータをファイルへ書き出す*/
function array_table_put($table, $path, $delimiter=',')
{
  $data = '';
  foreach ($table as $row)
    $data .= implode($delimiter, $row)."\n";

  $handle = fopen($file, "w");
  if ($handle) {
    fwrite($handle, $data);
    fclose($handle);
  }
}
/*セルの内容*/
function table_cell_html($x, $y, $cell)
{
  return '<a href="'.$_SERVER['SCRIPT_NAME'].'?xy='.$x.'-'.$y.'">'.$cell.'</a>';
}
/*テーブルをhtmlに変換*/
function table_html($table)
{
  $contents = '';
  foreach ($table as $y => $row) {
    $cols = '';
    foreach ($row as $x => $cell)
      $cols .= '<td bgcolor="#ffffff">'.table_cell_html($x, $y, $cell).'</td>';
    $contents .= '<tr>'.$cols.'</tr>';
  }
  return '<table bgcolor="cacaca" cellpadding="5">'.$contents.'</table>';
}

array_table_getはファイルを読みこんで二次元の配列をかえします

array_table_putは逆に二次元の配列をファイルに書き出します。

table_htmlは二次元の配列をhtmlにして出力します

function form_html($contents, $method='post')
{
  return '<form action="'.$_SERVER['SCRIPT_NAME'].'" method="'.$method.'">'.$contents.'</form>';
}

function input_html($request)
{
  $contents = '';
  foreach ($request as $attr) {
    list($type, $name, $value) = $attr;
    $contents .= '<input type="'.$type.'" name="'.$name.'" value="'.$value.'" />';
  }
  $contents .= '<input type="submit" value="保存" />';
  return '<p>'.$contents.'</p>';
}

入力のためのhtmlを出力します。

$file = 'data.dat';
$table = array_table_get($file);
if (isset($_POST['xy'])) {
  list($x, $y) = explode('-', $_POST['xy']);
  if (isset($table[$y][$x]))
    $table[$y][$x] = $_POST['value'];
    array_table_put($table, $file);
}
$contents = table_html($table);
if (isset($_GET['xy'])) {
  list($x, $y) = explode('-', $_GET['xy']);
  if (isset($table[$y][$x])) {
    $request = array(array('hidden','xy',$x.'-'.$y), array('text','value',$table[$y][$x]));
    $contents .= form_html(input_html($request));
}  }

echo '<html><body>'.$contents.'</body></html>';

メインの処理です。

ファイルから$tableへ格納します。$_POST['xy']が設定されているということは変更されたということとして$tableの内容を変更し、array_table_putでファイルへ保存します。


$tableの内容をhtmlへ変換します。


$_GET['xy']が設定されているということはテーブルのどれかがクリックされたということなので変更できるように入力用のhtmlを出力します。


実際には出力せずにバッファーに貯めているだけなので最後にechoで出力しています。

やけにコードが長くなってしまいました。

id:quocard

こんなに長々と作っていただきましてありがとうございます。

まだまだ初心者なもので理解するのに時間がかかりました。

とても勉強になります。

ありがとうとざいました。

2007/02/06 08:07:43

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません