dポイントプレゼントキャンペーン実施中!

今、PHPでPostgreSQLに接続して
データを書き込もうとしていますが、
”ページを表示できません”とエラーが出てしまいます。
<html>
<body>
<title>PostgreSQL実験</title>
<div align="center">
<table border=1>
<caption>検索結果</caption>
<tr>
<td>ID</td>
<td>氏名</td>
<td>点数</td>
</tr>
<br>
</table>
<?php
$d_base = pg_pconnect("user=postgres password=grjtf dbname=mytbl");
if($action == post && $sign == '書き込み')
{
if($id && $name && $score)
{
pg_query($d_base,"insert into mytbl values($id,$name,$score)");
}
}
if($action == post && $sign == '点数修正')
{
if($id && $score)
{
pg_query($d_base, "update mytbl set score=$score where id=$id");
}
}
if($action == post && $sign == '一行削除')
{
if($id)
{
pg_query($d_base, "delete from mytbl where id=$id");
}
}
if($result = pg_exec($d_base, "select * from mytbl"))
{
$row = pg_num_rows($result);
for($i = 0; $i < $row; $i++)
{
$arr = pg_fetch_row($result, $i);
echo "<tr>";
for($j = 0; $j < count($arr); $j++)
{
echo "<td>$arr[$j]</td>";
}
echo "</tr>";
}
}
?>

A 回答 (4件)

> ”ページが見つかりません”と出てきます。



なるほど。原因は、
<FORM ACTION=<?php echo $PHP_SELF; ?> METHOD=POST>
の部分ですね。正しくは、↓です。
<FORM ACTION=<?php echo $_SERVER["PHP_SELF"]; ?> METHOD=POST>
php.iniのデフォルト設定なんですが
register_globals=Off
の場合、"$PHP_SELF"とか書いちゃダメです。
ソースを読むと他にも問題ありそうですね。
"$action"と"$sign"等もこのままでは、上手くいきませんよ。
"内部変数"と"外部変数"の違いについて調べてみて下さい。

この回答への補足

tbshさん、迅速な解答アドバイスありがとうございます。

><FORM ACTION=<?php echo $PHP_SELF; ?> METHOD=POST>
の部分を、tbshさんの
<FORM ACTION=<?php echo $_SERVER["PHP_SELF"]; ?> METHOD=POST>
にしたら、’ページを表示できません’が出なくなりました。

tbshさんの言っている内部変数と外部変数を今から調べて見ます。
色々とアドバイスありがとうございます。

補足日時:2007/01/22 13:12
    • good
    • 0

> if($_POST["id"] && $_POST["name"] && $_POST["score"])


> pg_query($d_base,"INSERT INTO mytbl VALUES($id,$name,$score)");

ご自身で、答えを見つけていらっしゃるようですが・・・(笑)
あと、アドバイスとしては、No.1の方が仰っているように
実行エラーの時のデバック処理を入れていくと良いと思います。
例えば、
print "id=" . $_POST["id"];
などして、入力値がちゃんと変数に入っているか?
SQL文は、一旦変数に入れてから実行し、
falseが返ってきたら、SQL文とエラーメッセージを画面表示する
といった感じで。
(例)
$strSQL = "select * from mytbl";
$rs = pg_exec($d_base, $strSQL))
if (!$rs){
 print "[SQL]<br>" . $strSQL . "<br>";
 print "[ERROR]<br>" . pg_last_error ($d_base);
}

この回答への補足

tdshさん、いつもアドバイスありがとうございます。
<?php
//データベースに接続する
$conn = pg_pconnect("user=postgres password=grjtf dbname=mytbl");

//データベースに接続出来るかチェック
if(!$conn)
{
//エラーメッセージ
echo "An error occured.\n";
exit;
}
else
//接続成功メッセージ
print "DB(mytbl)に接続しました。<br>";

//データベースに接続し、mytblからidとnameを取り出す
$result = pg_query($conn, "SELECT id,name FROM mytbl");

//データベース(mytbl)からidとnameを取得する
if (!$result)
{
//エラーメッセージ
echo "An error occured.\n";
exit;
}
else
{
//接続成功メッセージ
print "idとnameを取得しました。<br>";
}

//データベースmytblに書き込む
if($_POST['action'] && $_POST['post'] == '書き込み')
{
if($_POST['id'] && $_POST['name'])
{
pg_query($d_base,"INSERT mytbl($id,'$name) VALUES($id,$name,$score)");
print "DB(mytbl)に書き込みました。";
}
else
{
print "書き込めませんでした。";
}
}

//DBに入力されている行を取得する
while ($row = pg_fetch_row($result))
{
//IDとNameを取得する
echo "id: $row[0] name: $row[1]";
echo "<br />\n";
}


//フォームからデータが取得できるかチェック
//print "id: " .$_POST["id"] ." name: " .$_POST["name"];
?>
<!--idとname入力欄-->
<p>
<FORM ACTION=<?php echo $_SERVER['PHP_SELF']; ?> METHOD=POST>
<input type=hidden name=action value=post>
ID:<input type=text name=id size=5>
Name:<input type=text name=name size=15>
<input type=submit name=sign value="書き込み">
</form>
<p>
idとnameを書いた後、書き込むボタンを押しましたが、
//エラーメッセージも//接続成功メッセージも表示されませんでした。
この部分がどうやら悪いようです。
後、tbshさんの言っていた>print "id=" . $_POST["id"];
をやりましたが、うまくフォームから値を取得することができました。

補足日時:2007/01/23 10:32
    • good
    • 0

どんなエラーなのか具体的に書いて下さい。


そうすれば原因の推測もし易くなりますので。
個人的には、pg_pconnectの部分が気になります。
hostの指定が無い事と、持続的な接続である事の2つ。
pg_connectの方が良いと思いますよ。

この回答への補足

”id”と”name”と”score”を入れて”書き込みボタン”
を押したのですが、”ページが見つかりません”と出てきます。

補足日時:2007/01/22 10:06
    • good
    • 0
この回答へのお礼

補足ができなかったので補足させて頂きます。
tdshさん、一応こんな風にやってみたのですが出来ませんでした。
どうでしょうか?
if(isset($_POST['action']) && $_POST['sign'] == '書き込み')
 {
 if($_POST["id"] && $_POST["name"] && $_POST["score"])
  {
  pg_query($d_base,"INSERT INTO mytbl VALUES                          ($id,$name,$score)");
 }
}

お礼日時:2007/01/22 15:03

WebサーバやPostgresのログにエラーが記録されてないか(insertあたりがおかしそう。

)を調べてみては。

DBへの接続失敗やクエリ実行エラーなどに対するエラーハンドラーが全く記述されてないので、そこらへんを作り込んでデバッグしてみるとか。

この回答への補足

osamuyさん、迅速な解答ありがとうございます。
乗せられなかったコードを乗せておきます。
追記
<P><FORM ACTION=<?php echo $PHP_SELF; ?> METHOD=POST>
<INPUT TYPE=HIDDEN NAME=action VALUE=post>
ID:<INPUT TYPE=TEXT NAME=id SIZE=5>
氏名:<INPUT TYPE=TEXT NAME=name SIZE=15>
点数:<INPUT TYPE=TEXT NAME=score SIZE=5>
<INPUT TYPE=SUBMIT NAME=sign VALUE="書き込み">
<INPUT TYPE=SUBMIT NAME=sign VALUE="点数修正">
<INPUT TYPE=SUBMIT NAME=sign VALUE="一行削除">
</FORM></P>
<P><FONT COLOR='red'>*「点数修正」と「一行削除」の場合はID指定のみでO.K.です。</FONT></P>
</div>
</body>
</html>

補足日時:2007/01/18 11:47
    • good
    • 0

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