[pgsql-jp: 29501] DELETEコマンドの使い方について。

clam @ infosakyu.ne.jp clam @ infosakyu.ne.jp
2003年 3月 30日 (日) 15:08:08 JST


こんにちわ、甲斐といいます。

DELETEコマンドの使い方で疑問があるのですが、宜しくお願いします。
(シーラカンス本も読み返し探しましたが余りにも説明が短くてよくわかりませんでした)

ブラウザに削除したい行を入力します。

削除ボタンを押すと指定した行を削除します。

削除していない、残っている行を全て表示します。

この動作を繰りかえすことで、複数行を削除したいのですが、思うようにできません
、
削除ボタンを押すと一度は、入力した行が削除され残りのテーブルが表示されるのですが、
ブラウザを修了して再度プログラムを立ち上げると削除したはずの行が残っていますまた、
連続して異なる行を指定して削除しても前回に削除された行が復活してしまい、
直前に入力した行だけが削除されてしまい常に1行しか削除が出来ません、同様にこの動作でも一旦
ブラウザを修了すると全ての行が残っていて行なった結果がデータベースに保存されていません。
お聞きしたいのは2点で
なぜこのプログラムではテーブルからデータが削除できないのでしょうか?
また、連続して別の行を削除しても常に直前の削除しか行なわず前回削除した行が復活してしまうのでしょうか?
宜しくご教授お願いします。

php-4.2.2-8.0.5
postgresql-7.2.2-1
httpd-2.0.40-11
をRPMパッケージでインストールしました、テーブルに対する読み書きは、

sql文でテーブル作成時にGRANT select,insert,update,delete on t_cargo to apache;
と宣言しています。

carrgo.php

<?php
require_once("cargo_common.php");

/*データベース接続開始*/
if ($err->error_flg == false) {
$conn = pg_connect("host=".DB_HOST." port=".DB_PORT." dbname=".DB_NAME);
if (!$conn) {
	$err->callerror("データベースに接続できません。", true);
	}
if (!pg_query($conn, "BEGIN;")) {
	$err->callerror("トランザクションを開始できません。", true);
	}
if (!pg_query($conn, "LOCK TABLE t_cargo;")) {
	$err->callerror("テーブルをロックできません。", true);
        }			

if (isset($_POST["sbmt"])){

  $result=pg_exec($conn, "DELETE FROM t_cargo WHERE no='$_POST[no]'");

if (!$result){
      print("テーブルの削除に失敗しました");
exit;
}
}

// レコードの件数を表示する
$sql = "SELECT * FROM t_cargo";
$result = pg_exec($sql);
if (!$sql){
        print("SQLの実行に失敗しました");
        exit;
    }
$numrows = pg_numrows($result);
print $numrows;
print("削除した番号は" . $_POST["no"] . "番で" . $numrows . "件のレコードがありました<BR>\n");

// レコードの内容を順に表示する
print("<TABLE border=\"1\"><TBODY>\n");
for ($i = 0; $i < $numrows; $i++) {
  $val = pg_fetch_array($result, $i);
  print ("<tr>");
  print ("<td>" . $val["no"] . "</td>");
  print ("<td>" . $val["gname"] . "</td>");
  print ("<td>" . $val["code"] . "</td>");
  print ("<td>" . $val["img"] . "</td>");
  print ("<td>" . $val["tanka"] . "</td>");
  print ("<td>" . $val["kazu"] . "</td>");
  print ("<td>" . $val["taxrate"] . "</td>");
  print ("<td>" . $val["rem1"] . "</td>");
  print ("<td>" . $val["rem2"] . "</td>");
  print ("<td>" . $val["rem3"] ."</td>");
  print ("<td>" . $val["rem4"] ."</td>");
  print ("<td>" . $val["cals1"] ."</td>");
  print ("<td>" . $val["cals2"] ."</td>");
  print ("</tr>\n");
    }
  print("</tbody></table>\n");
pg_close($conn);

}
html_template ("DB削除");
?>
<html>
<form action="<?php print($_SERVER["PHP_SELF"])?>" method="POST">
<input type=txt name="no" size=3><br>
<input type="submit" name="sbmt" value="削除">
</form>
</html>

cargo.sql
CREATE TABLE t_cargo (
no			int,
gname	         	varchar,
code		        varchar,
img      		text,
tanka			int,
kazu			int,
taxrate			int,
rem1			varchar,
rem2			varchar,
rem3			varchar,
rem4			varchar,
cals1			varchar,
cals2			varchar
);

cargo_common.php

<?php
require_once("HTML/Table.php");
define("DB_HOST", "localhost");
define("DB_PORT", "5432");
define("DB_NAME", "cargo");

/*エラー処理*/
class Cargo_Error {

	var $error_flg;
	
	function Cargo_Error() {
		$this->error_flg = false;
	}

	function callerror($msg, $exit=false) {
		$this->error_flg = true;
		$table = new HTML_Table('border="0" cellpadding="5" cellspacing="3"');
		$table->setCellAttributes(0, 0, 'class="error"');
		$table->setCellContents(0, 0, $msg);
		$table->display();
		if ($exit) {
			exit;
		}
	}
}

/*HTMLヘッダー出力*/
function html_template($title){
$HTML_TEMPLATE =<<<EOT
<html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<title>$title</title>
<meta http-equiv="Content-Type" content="text/html"; charset=EUC-JP>
<link rel="stylesheet" href="css/cargo.css" type="text/css">
</head>
<body>
<body bgcolor="#FFFFFF" text="#000000">
</body>
</html>
EOT;
}

/*mulitipart文字のエンコーディング*/
function encoding ($arg1, $arg2, $arg3){ 
	while (list($arg1, $arg2) = each($arg3)) {
		$_SESSION["post"][$arg1] 
			= htmlspecialchars(
				mb_convert_encoding($arg2, "EUC-JP", "auto"),
				ENT_COMPAT, 
				"EUC-JP");
	}
	return $_SESSION["post"][$arg1];
}



pgsql-jp メーリングリストの案内