人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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を押すとデータが書き換えられるコードを
作っておりますが、どうもうまく機能しません。
こういったモノで簡単なサンプルなどありましたら
教えていただけないでしょうか?

●質問者: quocard
●カテゴリ:インターネット ウェブ制作
✍キーワード:DAT Date. PHP コード データ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● okuryu
●35ポイント

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

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>';

?>
◎質問者からの返答

すごい

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

参考になります。

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


2 ● tobeoscontinue
●35ポイント

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

/*ファイルの内容を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で出力しています。

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

◎質問者からの返答

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

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

とても勉強になります。

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ