出産前後の痔にはご注意!

PHPで掲示板の機能の一つである論理削除機能を作成しようと思っています。削除キーに削除パスワードを入力して、削除ボタンを入力(または投稿番号を指示)したときに投稿者の記事を削除(物理削除ではありません)するようにしたいのです。投稿番号や削除キー、削除ボタンは作成したのですが、hiddenやif文を使用することまではわかったのですが、肝心のスクリプト部分がどうしてわからないのです。なにか例のようなものでも記述していただけないでしょうか?
よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

>moon_nightさん


フォロー感謝です。

>msnxlさん
#1 のソースで、1つ勘違いされそうなところを見つけましたので、注釈を。

view_item(); // 記事表示関数の呼び出し

これはPHPに用意された関数ではなく、ユーザー定義関数としています。
記事表示部のロジックを省略したかったので、便宜上、ユーザー定義関数として記述しました。
view_item という関数は存在しませんので、ご注意ください。

この回答への補足

ありがとうございます!

補足日時:2006/06/16 11:54
    • good
    • 0
この回答へのお礼

ありがとうございます。なんとか削除機能を実装することができました。

お礼日時:2006/06/22 23:21

やりかたのヒントだけ。



<form method="post" action="subject03-02.php" >
お名前 <input type="text" size="20" maxlength="40" name="NAME">
メール <input type="text" size="30" maxlength="60" name="MAIL">

<p>本文<br></p>
<textarea rows="20" cols="80" wrap="soft"   name="BODY"></textarea>
<p><input type="submit" name="SUBMIT"  value="送信"><input type="reset" name="deleat" value="消す"></p>

<form method="post" action="subject03-02.php" >
  <input type="hidden" name="action" value="delete">
削除キー <input type="password" name="delkey" size=8>(記事の削除用。英数字で8文字以内)
<p>投稿番号:<input type="text" size=10 name=delcode><input type="submit" value="削除"></p>
</form>

</form>

FORMの中にFORMを入れてはいけません。
FORMの中に作るとすると、削除ボタンにNAMEをつけて、そのデータが飛んできた場合は、投稿番号の記事に削除フラグを立てればいいわけです。
削除用のFORMだけ別にできればそれのほうがやりやすいかもしれません。

例えば、
<input type="password" name="delkey" size=8>
<input type="text" size=10 name=delcode>
<input type="submit" name="delete" value="削除">
として、

# 削除ボタンが押されたら
if ($_POST['delete']) {
# パスワード確認
if ($_POST['delkey'] == $PASS) {
# 該当の記事に削除フラグを立てる
}
}
といった感じになるかと思います。

この回答への補足

$flag = 1;

if( $i < 11 ){

if($mail== ""){

# 削除ボタンが押されたら
if ($_POST['delete']) {
# パスワード確認
($_POST["password"] == "0123456789");

if ($_POST["delkey"] == $PASS) {
if( $flag == 1 ){
fwrite($file, "$name\t$mail\t$body\t$num\t$dt\n".implode("", $data));

}else{
}

# パスワード確認
($_POST["password"] == "0123456789");でポストで数字を送るような感じではだめでしょうか?
また、 フラグで1ならばfwrite($file, "$name\t$mail\t$body\t$num\t$dt\n".implode("", $data));
としてみました。素人考えでご迷惑をかけます。

補足日時:2006/06/16 13:26
    • good
    • 0
この回答へのお礼

ありがとうございます。なんとか削除機能を実装することができました。

お礼日時:2006/06/22 23:21

↓で述べたこととかぶりますが、解らない関数を調べてから実践してみませんか?


基本的な事は、#1 で述べたつもりです。

OKWave 投稿番号、投稿削除と投稿修正機能
http://okwave.jp/kotaeru.php3?q=2216874&rev=1

私が手直ししたソースを紹介するのは簡単ですが、それだと覚える機会を失ってしまいます。
やはり、こういうことは自分で試して結果を見て、失敗や成功を乗り越えていった方が覚えが早いと思います。
「他人のソースを見て勉強する」には、ソース内に含まれている関数や仕組みを理解して使わないと応用力がつきませんので。

試してみても、解らなければ質問してください。
長くなるようであれば、この記事をブックマークに入れてチェックしておきます。

この回答への補足

丁寧なご回答ありがとうございます。ご忠告を踏まえた上で、取り組みます。おそらく、長くなると思います。

補足日時:2006/06/16 09:06
    • good
    • 0

ログフォーマットがどのようになっているのか解りませんので、説明が簡単なCSV形式だと仮定します。



名前<>本文<>記事No<>削除キー
Ken<>こんにちは<>100<>1234

という形式のCSVがあるとします。
これにもう1つ、論理削除が行われているかどうかのフラグ用のカラムを追加すればよいと思います。

論理削除フラグ<>名前<>本文<>記事No<>削除キー
1<>Ken<>こんにちは<>100<>1234

ログを読み込むときに、論理削除フラグを読み込んで表示するか否かを判定すれば、期待通りの動作になるでしょう。
(上例では、1 なら論理削除されたと見なして表示せず、0なら論理削除されていないと見なして表示する、という動作を想定しています。)
カラムを増やしたくないという場合は、削除キーを格納している箇所で「削除キー+削除キー許可していない文字+論理削除フラグ」という連結データにする、という代用法もあります。
例えば、「削除キーに @ は使えない」ようにして、論理削除したときには削除キーを格納している部分を「1@1234」とする。
(削除キー = 1234, 論理削除フラグ = 1 です。)
記事表示時に、削除キーをチェックして論理削除したか否かを判定する。
以下に、「削除キー+論理削除フラグ」の複合型の例を示します。

/* 論理削除処理 */
$dat = "$name<>$msg<>$item_num<>1@".$del_key;// 名前, 本文, 記事No, 削除キー + 論理削除フラグの初期化

/* 通常の記事投稿処理 */
$dat = "$name<>$msg<>$item_num<>0@".$del_key;// 名前, 本文, 記事No, 削除キー + 論理削除フラグの初期化

/* 記事表示部 */
list($name, $msg, $item_num, $delkey_dat) = explode('<>', $dat);// 記事を展開
if(preg_match('/'.'^0@'.'/', $delkey_dat, $match)){// 論理削除フラグが 0 だった時
view_item();// 記事表示関数の呼び出し
}

> hiddenやif文を使用することまではわかったのですが、肝心のスクリプト部分がどうしてわからないのです。
参考までにお聞きしたいのですが、hidden とは何を指すのでしょう?
PHPの関数名ではなさそうですが…。

この回答への補足

すみません。hiddenとは<input type="hidden"> の隠しデータを送信するHTMLタグのことです。ログを作成しなければならないのですね。
とりあえず、今できているスクリプトを記載します。

<?php
$reset = $_POST["deleat"];
$submit = $_POST["SUBMIT"];

if($submit == "送信"){

$name = $_POST["NAME"];
$mail = $_POST["MAIL"];
$body = $_POST["BODY"];
$hidden = $_POST["action"];
$password = htmlspecialchars($_POST["delkey"]);





if($name== "" or $body == ""){
header("Location:subject03-02false.php");

exit;
}



#HTML無効
$name = htmlspecialchars("$name");
$mail = htmlspecialchars("$mail");
$body = htmlspecialchars("$body");

#クォートを取り除く
if(get_magic_quotes_gpc()){$neme = stripslashes("$name");}
if(get_magic_quotes_gpc()){$mail = stripslashes("$mail");}
if(get_magic_quotes_gpc()){$body = stripslashes("$body");}


#本文を1000文字まで表示
$body = substr($body, 0, 1000);


$body = str_replace("\r\n","<br>", $body);
$body = str_replace("\t", " ", $body);


$dt = date("y/m/d H:i:s");
$data = file("data.txt");

$count = count ($data);
$num = $count++;

#array_shift($data);

$file = fopen("data.txt", "w");
fwrite($file, "$name\t$mail\t$body\t$num\t$dt\n".implode("", $data));

fclose($file);

header("Location:subject03-02.php");
exit;
}

# ノーキャッシュヘッダー
header("Expires: Mon,26 Jul 1997 05:00:00 GMT");
header("Last-Modified:".gmdate("D,d M Y H:is")."GMT");
header("Cache-Control: no-cache,must-revaildate");
header("Prodma:no-cache");



echo '
subject03-BBS
<h1>subject-BBS</h1>

<form method="post" action="subject03-02.php" >
お名前 <input type="text" size="20" maxlength="40" name="NAME">
メール <input type="text" size="30" maxlength="60" name="MAIL">

<p>本文<br></p>
<textarea rows="20" cols="80" wrap="soft"   name="BODY"></textarea>
<p><input type="submit" name="SUBMIT"  value="送信"><input type="reset" name="deleat" value="消す"></p>

<form method="post" action="subject03-02.php" >
  <input type="hidden" name="action" value="delete">
削除キー <input type="password" name="delkey" size=8>(記事の削除用。英数字で8文字以内)
<p>投稿番号:<input type="text" size=10 name=delcode><input type="submit" value="削除"></p>
</form>

</form>
';

$data = file("data.txt");



$i = 1;
foreach($data as $value){

$view = explode("\t", $value);
list($name, $mail, $body, $dt) = explode("\t",$value);
if( $i < 11 ){

if($mail== "" ){


echo "お名前:$view[0]$view[3]<br>";
echo "本文:$view[2]<br>";
echo '<hr size="1" width="80%"><br>';

} else {

echo "お名前:<a href=\"mailto:$mail\">$view[0]</a>$view[3]<br>";

echo "本文:$view[2]<br>";
echo '<hr size="1" width="80%"><br>';

}



} $i++;
}



?>

一部省略しています。

補足日時:2006/06/16 07:56
    • good
    • 0
この回答へのお礼

ありがとうございます。なんとか削除機能を実装することができました。助かりました。

お礼日時:2006/06/22 23:22

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q掲示板の記事の削除

データの削除の覧でのソースについての質問です。
記事が削除されません。原因がわからないので困ってます。
答えをズバリ書いてくれたり、一からでもいいのでこっちのほうが簡単にできるよってのでも良いです。よろしくお願いします

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=sjis">
<FORM ACTION="<?php echo $PHP_SELF; ?>" METHOD="POST" >
<TITLE>削除操作</TITLE>
</HEAD>
<BODY>
<BR>
<FORM ACTION="<?php echo $PHP_SELF; ?>" METHOD="POST">
<INPUT TYPE ="text" NAME="comment" SIZE="40"><BR>
削除キー<INPUT TYPE="password" NAME="pass" SIZE="10"><BR>
<INPUT TYPE ="submit" NAME="regist" VALUE="ボタン"><BR>
</FORM>
<BR><BR>
</CENTER>
</BODY>
</HTML>

<?
$data_file = "test01.txt";

if(!isset($code)) { $code = $_POST['code']; }
if(!isset($comment)) { $comment = $_POST['comment']; }
if(!isset($regit)) { $regist = $_POST['regist']; }
if(!isset($delete)) { $delete = $_POST['delete']; }
if(!isset($delcode)) { $delcode = $_POST['delcode']; }
if(!isset($password)){ $password = $_POST['password']; }
if(!isset($pass)) { $pass = $_POST['pass']; }
//データの削除
if($delete){
if(($delcode != "") && ($password != "")){
$delfile = file($data_file);
$fp = fopen($data_file, "w");
for($i=0; $i<count($delfile); $i++){
list($dcode,$dcomment,$dpass) = split( ",", $delfile[$i]);
if ($password == $dpass){
if ($delcode == $dcode) {
$delfile[$i] = "";
}
}
}
fputs($fp,$delfile[$i]);
fclose($fp);
}

unset($delfile);

}
//データの書き込み
if($regist){
if(($pass != "") && ($comment != "")){
$code = time(); //アクセス時の秒数
$imput_msg = ( $code .','. $comment .','.$pass);
//ファイル操作
$fp = fopen($data_file,"a+");
rewind($fp);
fputs($fp,"$imput_msg\n");
fclose($fp);
}
}
//出力処理
$msg = file($data_file);
for($i = 0; $i < count($msg); $i++){
list($code2,$comment2,$pass2) = split( ",", $msg[$i]);
print "<form method=\"POST\" action=\"$PHP_SELF\">";
print "<input type=\"checkbox\" name=\"delcode\" value=\"$code2\"><br>\n";
print "code2: $code2<br>";
print "comment:$comment2<br>";
print "pass: $pass2<br>";
print " 削除用パスワード:<input type=password size=10 name=password>";
print " <input type=\"submit\" name=\"delete\" value=\"削除\">\n";
print "</form>\n";
}
unset($msg);
?>

データの削除の覧でのソースについての質問です。
記事が削除されません。原因がわからないので困ってます。
答えをズバリ書いてくれたり、一からでもいいのでこっちのほうが簡単にできるよってのでも良いです。よろしくお願いします

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=sjis">
<FORM ACTION="<?php echo $PHP_SELF; ?>" METHOD="POST" >
<TITLE>削除操作</TITLE>
</HEAD>
<BODY>
<BR>
<FORM ACTION="<?php echo $PHP_SELF; ?>" METHOD="POST"...続きを読む

Aベストアンサー

>trim()はスペースを無くすという意味ですが何かのバグの問題処理なんです
>か?使う用途を教えていただけると嬉しいです

trim()をリファレンスで確認すればわかりますが、スペースだけではありません。改行コードも落とします。

先の回答でも書きましたが、file()で配列にいれた場合には、各文字列の最後に改行コードが付いたままです。explodeで分割しても3つめのパスワード項目の後ろに改行が付いたまま切り出されますので、POSTされた(改行コードなしの)文字列とは一致しません。

(蛇足)
いちいちtrimが面倒なので保存時に行末にダミーのカンマを付加しておく・・ということもしますね。そのときは list($dcode, $dcomment, $dpass, $dummy)とかで切り出します($dummyには「改行のみ」が入ってきます)。

QPHPでmySQLのテーブルを作成したい

今PHPの練習をしているのですが、作ろうとしているPHPの、

0:$tbname="データベース名"、とする。
1:データベースにアクセスする
2:アクセスしたデータベースに$tbnameと同じ名前のテーブルがあるかないかをチェック
3:同じ名前のテーブルがあるならそこで終了
4:同じ名前のテーブルがないなら、$tbnameをテーブル名、ID(INT)とNAME(CHAR)をカラム名とするテーブルを新規に作成する

という動作をする部分のコードの書き方(どのようなSQL文を使えばいいのか)がわかりません。
どなたかご教示のほど、どうかよろしくお願いします。

Aベストアンサー

「0:$tbname="データベース名"、とする。」は$dbnameとしました。
ご確認ください。

<?php
$host="localhost"; // ホスト名
$user="user"; // ユーザー名
$pass="pass"; // パスワード

$dbname="db_name"; // DB名
$tbname="table_name"; // テーブル名

// MYSQL接続
$db = mysql_connect($host,$user,$pass) or die("MYSQLへの接続に失敗しました");
// DB選択
mysql_select_db($dbname,$db) or die("DB選択に失敗しました");
// テーブル情報取得
$result=mysql_query("SHOW TABLES",$db) or die("テーブル取得に失敗しました");
// テーブル名チェック
while($row=mysql_fetch_assoc($result)) {
if($row["Tables_in_".$dbname]==$tbname) exit($tbname."は存在します");
}
// テーブル作成
$sql="create table ".$tbname." (ID INT, NAME CHAR(32))";
mysql_query($sql,$db) or die("テーブル作成に失敗しました");
print($tbname."を作成しました")
?>

「0:$tbname="データベース名"、とする。」は$dbnameとしました。
ご確認ください。

<?php
$host="localhost"; // ホスト名
$user="user"; // ユーザー名
$pass="pass"; // パスワード

$dbname="db_name"; // DB名
$tbname="table_name"; // テーブル名

// MYSQL接続
$db = mysql_connect($host,$user,$pass) or die("MYSQLへの接続に失敗しました");
// DB選択
mysql_select_db($dbname,$db) or die("DB選択に失敗しました");
// ...続きを読む

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?

Qphpやmysqlで作る簡易掲示板作成について

php mysqlに関してド初心者です。簡易掲示板を作成する課題があるのですが、どう調べてもわからない箇所があり、まいっています。1つは編集、削除の際にパスワードの入力を求める。具体的にはパスワード入力ができるようにしたformを表示し入力させる。2つめは入力されたパスワードと書き込み時に保存したパスワードを比較し、一致の場合のみ編集削除が動作するようにする。というものです。どう書けばいいのかさえわかりません。教えて頂けたら有り難いです

Aベストアンサー

#2です

別途おなじような質問をなげているようですが
この回答が役にたたなかったなら別にそれでいいので
ベストアンサーなし質問を閉じてから
別途質問をたてるのがマナーじゃない?

Qフォントの色を変えるには?

こんにちは。PHPでのフォントの色の変更について質問があります。
任意の文字列の色だけを変更したいのですが、下のコードではエラーになってしまいます。
どこがまずいのかご指摘いただければ幸いです。
------------------------------
<HTML>
<HEAD>
<TITLE>TEST</TITLE>
</HEAD>

<BODY>

<?PHP
ECHO "<FONT COLOR="BLUE"> HELLO </FONT>";
ECHO "<FONT COLOR="RED"> GOOD BYE </FONT>";
?>

</BODY>
</HTML>

Aベストアンサー

BLUEやREDについてるダブルクォーテーションがエスケープされてないですね。
いろいろやりかたはありますが以下のどちらかがよいでしょう。

<?PHP
ECHO "<FONT COLOR=\"BLUE\"> HELLO </FONT>";
ECHO "<FONT COLOR=\"RED\"> GOOD BYE </FONT>";
?>

もしくは

<?PHP
ECHO '<FONT COLOR="BLUE"> HELLO </FONT>';
ECHO '<FONT COLOR="RED"> GOOD BYE </FONT>';
?>

Q自動で番号を振りたい

phpでメールフォームを作っています。
注文用のフォームなのですが注文番号を自動で割り当て
メール送信時に表示させたいと思っております。

全5桁位で重複させない番号をランダムで振れればいいのですが
mysqlと連動などしていないのでこれは無理でしょうか?

00001~99999まで通し番号で振り99999になったら00001に戻ると
いう形式でも構わないのですがいずれは重複してしまうのかと
悩んでおります。

phpには知識がないもので伝わりづらい質問かと思いますが
方法を具体的に教えて頂けますと幸いです。

アドバイスや参考サイトでも構いませんので宜しくお願い致します。

Aベストアンサー

 追記ですが、お詫びに、そのdata_order.plを簡易的に見るphpを作りましたので必要でしたら使ってやってください。

・show_list.php ---------------------------------------------

<html><body>
<?php
$temp = $new_no = '';
$temp_ar = $new_ar = $new_list = array();
$data_mail = './data_order.pl';

$DATA_LIST = fopen( $data_mail , 'r');
flock($DATA_LIST, LOCK_SH);

while(!feof($DATA_LIST)){
$temp = trim(fgets($DATA_LIST));
$temp_ar = explode("+", $temp);
array_push($new_ar, $temp);
}

flock($DATA_LIST, LOCK_UN);
fclose($DATA_LIST);

foreach($new_ar as $value){
$new_list = explode('+', $value);
if(!empty($new_list[0])) print "<li>" . $new_list[0] . " = " . $new_list[1];
}

?>
</body></html>

----------------------------------------------------------------

 追記ですが、お詫びに、そのdata_order.plを簡易的に見るphpを作りましたので必要でしたら使ってやってください。

・show_list.php ---------------------------------------------

<html><body>
<?php
$temp = $new_no = '';
$temp_ar = $new_ar = $new_list = array();
$data_mail = './data_order.pl';

$DATA_LIST = fopen( $data_mail , 'r');
flock($DATA_LIST, LOCK_SH);

while(!feof($DATA_LIST)){
$temp = trim(fgets($DATA_LIST));
$temp_ar = explode("+", $temp);
array_push($...続きを読む

QPOSTで受け渡したものを保存したいです。

POSTで受け渡したものを保存したいです。
携帯サイトを作っています。

例えば、phpで表示させるページには「今日のひと言」というような項目を設け、
別のhtmlファイルで入力フォームを作っておき、そこに入力し送信すると、
その「今日のひと言」のところに反映されるようにしたいと考えています。
POSTで受け取ることまでは出来たのですが、サイトを更新するとまた消えてしまいます。
新たにフォームから入力されるまで、前の「今日のひと言」を残しておくためにはどのようにしたらよいのでしょうか?

phpも初心者なので何卒よろしくお願いいたいます。

Aベストアンサー

簡単なのはセッションに保持しておいて、入力画面からの遷移以外はセッションの値を出力してしまうことですね。
ブラウザを閉じて、再度同じページを開いた際も、前回の入力した文字列を出力したい場合は、クッキーを使ったり、DBで値を保持しておいて、それを出力するしかないです。

>サイトを更新するとまた消えてしまいます。

の更新というのは、F5キーを押す、ということでよろしいでしょうか?

で、あった場合、
例えば入力フォームのテキストボックスを「txtHitokoto」とした場合、

「今日のひと言」を出力するフォームで

//セッションを開始
session_start();
//テキストボックスの値をポストしていたら
If($_POST["txtHitokoto"]){
 $_SESSION["HITOKOTO"] = $_POST["txtHitokoto"];
}
//ポストした値(セッション)を画面に出力
Echo $_SESSION["HITOKOTO"];

で、F5押下時(ブラウザ更新時)もひと言を出力できます。

ブラウザを閉じて、再度開いた際も、っとなると、オープンサイトであればDBを用いるべきですね。
PHPであればポスグレやMySQLがいいでしょう。

DB操作は別途ご自身で御調べになるか、別でスレを立てて下さいね。

簡単なのはセッションに保持しておいて、入力画面からの遷移以外はセッションの値を出力してしまうことですね。
ブラウザを閉じて、再度同じページを開いた際も、前回の入力した文字列を出力したい場合は、クッキーを使ったり、DBで値を保持しておいて、それを出力するしかないです。

>サイトを更新するとまた消えてしまいます。

の更新というのは、F5キーを押す、ということでよろしいでしょうか?

で、あった場合、
例えば入力フォームのテキストボックスを「txtHitokoto」とした場合、

「今日のひと言」を...続きを読む

Qファイル書込みで一行もしくは部分的に上書きする

教えて下さい。
下のようなテキストデータがあります(sample01.txtとします)
(内容)
1111000000000000
1111000000000000
1111000000000000
これを
1111000000000000
1111001111110000
1111000000000000
と言うふうに2行目もしくは部分的に上書きして保存したいです。
よろしくお願いします。

Aベストアンサー

この問題に対するよくある解決策です。下に行くほど手間ですが大きなデータが扱えるようになります。

1.ファイルが小さければ、全部配列に読み込んで、必要な操作を行ったあと同じファイル名で書き出す

2.ファイル名を変更してバックアップファイルとする作る。
バックアップを読み込み専用で開き、元のファイル名で新しいファイルを書き込みモードwで開く。

1行ずつfgetsで読み込み、ファイルにfputsで書き出す。
操作したい行が来たらその操作を行って同様にファイルに書き出す。
残りを全部書き出しす。
全部成功したらバックアップを削除する。エラーが起きたら編集中のファイルは削除してバックアップを元のファイル名にする

3.1行の長さを決まった長さにして(いわゆる固定長レコード)r+モードでfopenし、レコード長xレコード数で目的の場所にfseekして特定のレコードをfread/fwriteで上書きする。レコードの修正かレコードの末尾の追加の操作は効率がいい。レコードの挿入・削除が発生するときは全部fread/fwriteする。

4.ファイルが巨大で全部fread/fwriteするが重い処理になるなら、別途索引ファイル(インデックス)をつくり、レコードの追加はファイル末尾に追記し、インデックスファイルに検索キーとレコードの番号かファイルポインタの位置を記録する。これで目的のレコードがファイル中のどこにあるかを知ることができる。レコードの削除はインデックスに目印をつけるだけにして、実際にディスクから消去するのは負荷の低いときにガベージコレクションで行う。

5.4までやるくらいなら出来合いのデータベースを使うほうがよい。MySQLとかPostgresqlなど。

この問題に対するよくある解決策です。下に行くほど手間ですが大きなデータが扱えるようになります。

1.ファイルが小さければ、全部配列に読み込んで、必要な操作を行ったあと同じファイル名で書き出す

2.ファイル名を変更してバックアップファイルとする作る。
バックアップを読み込み専用で開き、元のファイル名で新しいファイルを書き込みモードwで開く。

1行ずつfgetsで読み込み、ファイルにfputsで書き出す。
操作したい行が来たらその操作を行って同様にファイルに書き出す。
残りを全部書き出しす...続きを読む

Qphp データ削除

一覧画面に更新、削除というボタンをつくり番号を受け取って削除したいのですが、削除ボタンを押しても画面は変わるのですが削除されません
助けてください

番号 int プライマリーキー
氏名 varchar
住所 varchar

一覧画面のソース
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>一覧画面</title>
</head>
<body>
<BLOCKQUOTE>
<BR>一覧画面<BR><BR>
<?php
$con=mysqli_connect("localhost","root","admin","db_test");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}


$result = mysqli_query($con,"SELECT * FROM tbl_test");

echo "<table border='1'>
<tr>
<th>番号</th>
<th>氏名</th>
<th>住所</th>
</tr>";

while($row = mysqli_fetch_array($result))
{
echo "<tr>";
echo "<td>" . $row['番号'] . "</td>";
echo "<td>" . $row['氏名'] . "</td>";
echo "<td>" . $row['住所'] . "</td>";

echo "<form action=koushin_input.php method=post>";

echo "<td><input type=submit value=更新></td>";
echo "</form>";

echo "<form action=sakujo.php method=post>";

echo "<td><input type=submit value=削除></td>";
echo "</form>";

echo "</tr>";
}
echo "</table>";


mysqli_close($con);
?>

<BR><BR><BR> <A HREF="http://localhost/regist.php">
<INPUT TYPE = "SUBMIT" VALUE = "新規登録"></A>

</BLOCKQUOTE>
</body>
</html>

削除ソース 
sakujo.php
<html>
<body>
<?
// データベースに接続
if(!$con=mysql_connect("localhost","root","admin")){
echo"接続エラー";
exit;
}

// データベースを選択
if(!mysql_select_db("db_test",$con)){
echo"データベース選択エラー";
exit;
}

// DELETE文を実行
$sql = "delete from tbl_test where '番号'= 番号;
if(!$res=mysql_query($sql)){
echo "SQL実行時エラー";
exit;
}

// データベースから切断
mysql_close($con);

// 登録完了メッセージの表示
echo "削除完了";
?>
</body>
</html>

どういう風にpostで渡せばいいですか?

一覧画面に更新、削除というボタンをつくり番号を受け取って削除したいのですが、削除ボタンを押しても画面は変わるのですが削除されません
助けてください

番号 int プライマリーキー
氏名 varchar
住所 varchar

一覧画面のソース
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>一覧画面</title>
</head>
<body>
<BLOCKQUOTE>
<BR>一覧画面<BR><BR>
<?php
$con=mysqli_connect("localhost","root","admin","db_test");
// Check connection
if (mysqli_connect_...続きを読む

Aベストアンサー

削除してから表示するという流れ組んでみてください
ボタンじゃなくていいならざっとこんな感じ

<table border='1'>
<tr>
<th>番号</th>
<th>氏名</th>
<th>住所</th>
</tr>
<?php
$con=mysqli_connect("localhost","root","admin","db_test");
if(isset($_GET["del"]) and isset($_GET["id"]) and $_GET["del"]==1){
$id=(int) $_GET["id"];
$result = mysqli_query($con,"DELETE FROM tbl_test where `番号`={$id}");
}
$result = mysqli_query($con,"SELECT * FROM tbl_test");

while($row = mysqli_fetch_array($result))
{
echo "<tr>";
echo "<td>".$row['番号']."</td>";
echo "<td>".$row['氏名']."</td>";
echo "<td>".$row['住所']."</td>";
echo "<td><a href=\"".$_SERVER["SCRIPT_NAME"]."?del=1&amp;id=".$row['番号']."\">削除</a></td>";
echo "</tr>";
}
mysqli_close($con);
?>
</table>

削除してから表示するという流れ組んでみてください
ボタンじゃなくていいならざっとこんな感じ

<table border='1'>
<tr>
<th>番号</th>
<th>氏名</th>
<th>住所</th>
</tr>
<?php
$con=mysqli_connect("localhost","root","admin","db_test");
if(isset($_GET["del"]) and isset($_GET["id"]) and $_GET["del"]==1){
$id=(int) $_GET["id"];
$result = mysqli_query($con,"DELETE FROM tbl_test where `番号`={$id}");
}
$result = mysqli_query($con,"SELECT * FROM tbl_test");

while($row = mysqli_fetch_ar...続きを読む

Q1つのformで複数のactionを実行できますか?

フォーム内に商品の購入ボタンがあります。同じフォーム内に商品名でグーグルのサイト内を検索させるボタンを設置し、横に並べることは可能ですか?
フォームの入れ子はよくないようなので、検索をJava scriptでできればよいのですが・・・
スタイルシートではデザイン上無理でした。

<form id="fm" name="fm" action="URL" method="POST">
<input type="hidden" name="shouhinmei" value="商品名">
<input type="hidden" name="kakaku" value="500">
<input type="image" src="kounyuu.gif value="購入">

<form method=get action="http://www.google.co.jp/search">
<input type=hidden class="q" name=q value="商品名"><input type=hidden name=ie value=UTF-8><input type=hidden name=oe value=UTF-8><input type=hidden name=hl value="ja"><input name=btnG type="image" src="検索.gif value="検索"><input type=hidden name=sitesearch value="サイトのURL"></form>
</form>
</form>

+----+  +----+
|購入|  |検索|
+----+  +----+

フォーム内に商品の購入ボタンがあります。同じフォーム内に商品名でグーグルのサイト内を検索させるボタンを設置し、横に並べることは可能ですか?
フォームの入れ子はよくないようなので、検索をJava scriptでできればよいのですが・・・
スタイルシートではデザイン上無理でした。

<form id="fm" name="fm" action="URL" method="POST">
<input type="hidden" name="shouhinmei" value="商品名">
<input type="hidden" name="kakaku" value="500">
<input type="image" src="kounyuu.gif value="購入">...続きを読む

Aベストアンサー

では、以下のような感じで。
なるべく多くのブラウザで動くように書いたつもりですが検証は充分行ってください。

<html>
<head>
<title></title>
<script type="text/javascript">
<!--
function searchGoogle(q) {
document.forms['searchForm'].elements['q'].value=q;
document.forms['searchForm'].submit();
return false;
}
//-->
</script>

</head>
<body>

<form action="URL">
~~
<input type="image" src="kounyuu.gif value="購入">
<a href="http://www.google.co.jp/" onclick="return searchGoogle('商品名')"><img src="検索.gif" border=0></a>
</form>

<form action="http://www.google.co.jp/search" id="searchForm" style="display:none;">
<input type=hidden name="q">
<input type=hidden name=ie value="UTF-8">
<input type=hidden name=oe value="UTF-8">
<input type=hidden name=hl value="ja">
<input type=hidden name=sitesearch value="サイトのURL">
</form>

</body>
</html>

では、以下のような感じで。
なるべく多くのブラウザで動くように書いたつもりですが検証は充分行ってください。

<html>
<head>
<title></title>
<script type="text/javascript">
<!--
function searchGoogle(q) {
document.forms['searchForm'].elements['q'].value=q;
document.forms['searchForm'].submit();
return false;
}
//-->
</script>

</head>
<body>

<form action="URL">
~~
<input type="image" src="kounyuu.gif value="購入">
<a href="http://www.google.co.jp/" onc...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング