スレッド表示 | フラット表示〕 全トピック 920 件中 129 番目 次≫ ≪前

PHPとPostgreSQLの連携について

created: 2007-03-16 01:36 | modified: 2007-03-20 00:34 | reply: 13

[3652] PHPとPostgreSQLの連携について

user: PHP勉強野郎! | created: 2007-03-16 01:36
いつもお世話になっています。 PHP勉強野郎!です。
PHP動的ページ作成のときには大変お世話になりました。

現在、PHPからデータベースを操作する勉強を始めましたが
早速つまづいた箇所があるので、質問させて頂きたいと思います。

1) トップページで入会登録を選んだら入会登録ページに移動しユーザーIDとパスワード、名前を入力させて登録させたい

※この際PHP側でIDの重複チェックを行いたいのですが、どうも上手く出来ず、現状ではデーターベースのIDを主キーにして重複出来ない様に設定したうえ、重複した場合にメッセージを出すという形で対処しています。
どのようにすればPHP側でIDの重複チェックを行えるでしょうか?

2) トップページ、登録ページ、会員ページを用意して、トップページでIDとPASSを入力させて、データベースに格納されているID・PASSと一致したら会員ページを表示させたい。

※フォームからIDとPASSを入力させるのですが、いまの知識ではフォームから入力された値とデータデースに格納されているID・PASSの値の比較をする事が出来ません。
あとID・PASSが一致したら指定のページを開く動作も一緒にご教授いただければ幸いです。

ソースを乗っけていない為、解り辛いとはおもいますが
宜しくお願いします。
reply: 3653 返信 編集 削除

[3653] Re. PHPとPostgreSQLの連携について

user: ゆうじ | created: 2007-03-16 13:01
こんにちは。

> 現状ではデーターベースのIDを主キーにして重複出来ない様に設定したうえ、重複した場合にメッセージを出すという形で対処しています。
> どのようにすればPHP側でIDの重複チェックを行えるでしょうか?

登録処理の前にあらかじめ
該当のIDがあるかどうか問い合わせ、
該当レコードあれば登録済み(新規登録不可)ですし
無ければ登録可能と判断できます。

select * from USERTABLE where ID = 確認するID


2)の件も同じ理屈で、
問い合わせの条件にIDとパスワードを指定して
該当レコードあれば一致、無ければ不一致と判断できます。

select * from USERTABLE where ID = 確認するID and PASS = 確認するパスワード



「・・・どうも上手く出来ず、・・・」
これは何も情報を含んでないので判断材料がありません。
実際のコードをどう書くかという話でしたら、
この部分を、何を・どうしたところ・どういう現象になったのか、
といった具合に具体的に書いてみてください。

参考:
「上手く出来ません」というキーワードは、
技術系のフォーラムでは使わない方が良い言葉です。
もし「上手く出来ません」と書きそうになったっら
「何を・どうしたところ・どういう現象になったのか」
に変換してみてください。
読み手の判断材料となりもっと的を得たレスポンスが得られます。
また具体的に書いてるうち原因が見つかったりします。
Parent: 3652  reply: 3654 返信 編集 削除

[3654] PHPとPostgreSQLの連携について

user: PHP勉強野郎! | created: 2007-03-17 18:14
ゆうじさん、毎度毎度ご返答ありがとうございます。
返答が遅くなり申し訳ございません。

結局、入会登録ページでのIDとPASSの重複チェックは
        $check = pg_exec($connect, "INSERT INTO test(id, pass, name, reg, state) VALUES('$id', '$pass', '$name', 'now', 1)");
// データベースの『id, pass, name, reg, state』に『$id, $pass, $name, 現在の時刻, 会員ステータス』を挿入する

if($check == FALSE) // $checkにエラーコードが入っているとき、以下を表示
{
echo "<BR><CENTER>このIDは既に使われています。</CENTER><BR>";
}
とする事で実現しました。


トップページでIDとPASSを入力させて、データベースに格納されているID・PASSと一致したら会員ページを表示させる処理は
$result = pg_exec($connect, "SELECT * FROM test WHERE id = '$id' AND pass = '$pass'");
// フォームから入力された値を条件にデータベースから『id』と『pass』の内容を取得・変数$resultに格納する

$num = pg_numrows($result); // データベースの行数を取得

for($i = 0; $i < $num; $i++) // 変数iがnum以下のとき
{
$id = pg_result($result, $i, 'id'); // データベースのi行目の0列目を取得し変数に格納する
$pass = pg_result($result, $i, 'pass'); // データベースのi行目の1列目を取得し、変数に格納する
$name = pg_result($result, $i, 'name'); // データベースのi行目の1列目を取得し、変数に格納する
$reg = pg_result($result, $i, 'reg'); // データベースのi行目の1列目を取得し、変数に格納する
$sec = pg_result($result, $i, 'sec'); // データベースのi行目の1列目を取得し、変数に格納する
$state = pg_result($result, $i, 'state'); // データベースのi行目の1列目を取得し、変数に格納する

echo "<A href = 'member.php'>ログイン</A>";
print("<tr><td>$id</td><td>$pass</td><td>$name</td><td>$reg</td><td>$sec</td><td>$state</td></tr>"); // テーブル>
の中に表示する}
}
とする事で一応実現したのですが…出来るならば
ID・PASSが一致したら自動的に違うページに飛びたいのですが
いまはリンク先を表示させることしか出来ません。
どのようにすれば、入力されたID・PASSとデータベースの内容の値が同じであれば自動的にページが移動出来るのでしょうか?
ご教授お願いいたします。
聞いてばかりで申し訳ありませんが、よろしくお願いします。

>「上手く出来ません」というキーワードは
>技術系のフォーラムでは使わない方が良い言葉です。
>もし「上手く出来ません」と書きそうになったっら
>「何を・どうしたところ・どういう現象になったのか」
>に変換してみてください。
>読み手の判断材料となりもっと的を得たレスポンスが
>得られます。
>また具体的に書いてるうち原因が見つかったりします。

ゆうじさんの仰るとおりです・・・今度このような聞き方はしないように心掛けます。 ご注意ありがとうございました。
Parent: 3653  reply: 3655 3656 返信 編集 削除

[3655] リダイレクト

user: ach | created: 2007-03-17 20:04
自動でページを移動する方法はマニュアルのheaderの項目に書いてあります.

ところで(1)はidを主キーとしてテーブルを作るということでしょうか?
Parent: 3654  reply: 3657 返信 編集 削除

[3657] achさん

user: PHP勉強野郎! | created: 2007-03-17 21:34
早速のお返事ありがとうございます。

>(1)はidを主キーとしてテーブルを作るということでしょうか?
との事ですが、先程までは『ID』を主キーにして作成しておりました。
しかし、これでは
$check = pg_exec($connect, "INSERT INTO test(id, pass, name, reg, state) VALUES('$id', '$pass', '$name', 'now', 1)");
if($check == $id) // $checkにエラーコードが入っているとき、以下を表示
{
echo "<BR><CENTER>このIDは既に使われています。</CENTER><BR>";
}

としているので、重複チェックは出来ても重複している旨のエラーメッセージが出ますので
新たにテーブルを作成して、再度考え直しています。
新しく作った『ID』は主キーではありません。

現在はコードを書き直し
	$check = pg_exec($connect, "SELECT id FROM test WHERE id = '$id'");
if($check == $id) // $checkにエラーコードが入っているとき、以下を表示
{
echo "<BR><CENTER>このIDは既に使われています。</CENTER><BR>";
} else {
pg_exec($connect, "INSERT INTO test(id, pass, name, reg, state) VALUES('$id', '$pass', '$name', 'now', 1)");
}
のように書き直したのですが、重複チェックが出来ず
そのまま書き込まれる状態になってしまいました…

『header』に取り掛かるのはもう少し時間がかかりそうです。
もう少し自分で考えてみます。 返答ありがとうございました。
Parent: 3655  reply: 3658 3662 返信 編集 削除

[3658] pg_exec

user: YOSHI | created: 2007-03-17 22:51
headerに取りかかる前より以前に、
pg_exec を見直された方が良いと思います。

http://jp.php.net/manual/ja/function.pg-query.php

--引用
#注意: この関数は、以前は pg_exec() と呼ばれていました。 pg_exec() は互換性確保のためにまだ使用可能ですが、 新しい名前を使用することが推奨されています。


pg_query に置き換えるべきです。
Parent: 3657  reply: 3659 返信 編集 削除

[3659] pg_exec()について

user: PHP勉強野郎! | created: 2007-03-18 12:56
YOSHIさん、ご返答ありがとうございます。

これからはpg_exec()ではなく、pg_query()を使用するようにします。
ご指摘ありがとうございます。
Parent: 3658  返信 編集 削除

[3662] エラーの抑制

user: ach | created: 2007-03-18 23:59
>重複チェックは出来ても重複している旨のエラーメッセージが出ますので
PHPのWarningとかそういう物でしょうか?
それでしたらブロックや関数の前に"@"を書く事で出力を抑制できます.

書き直したコードが上手く動かないのはpg_exec(pg_query)からかえってくる物がSQLの結果の文字列ではなく結果へのリソース(ファイルハンドラみたいな物)だからです.
結果を得るには
$id = pg_fetch_result($check, 0, "id");
/*
//上のコードはエラーを表示するかもしれないので
$results = (Array)pg_fetch_row($check);
$id = shift($results);
//のように書いてもよい
*/
if ($id) {
//////////////
}
のように書きます.


個人的にはidを主キーにする方がいいと思います.
idを主キーにしておくとプログラムのバグが有っても確実にidをユニークな値にできるからです.
それにidによるソートや検索が早くなるはず(まあインデックスがついてるってだけですが)
Parent: 3657  返信 編集 削除

[3656] header関数

user: ゆうじ | created: 2007-03-17 20:38
違うURLに処理を飛ばすには
header関数で "Location: http://~" を出力します。
http://jp.php.net/manual/ja/function.header.php

header を送信する前に、echo や print
またその他の方法ですでに何か出力がされていると
header送信に失敗しますのでご注意ください。

$result = pg_exec($connect, "SELECT * FROM test WHERE id = '$id' AND pass = '$pass'");
$num = pg_numrows($result);
if(pg_numrows($result)) {
// 認証済処理
header('Location: '. $url); // ヘッダ送信
exit();
} else {
// 認証未処理
}
Parent: 3654  reply: 3660 返信 編集 削除

[3660] header関数

user: ゆうじさん | created: 2007-03-18 19:17
返答遅くなり申し訳ございません。

header関数でページ移動が出来るのですね…
解らなかったです、すいません。

折角header関数を教えて頂いたのですが、いま違うエラーが
出る様になってしまったので、一度設計を見直してみます。

再度上手く動くようになったら、仕上げにheader関数を組み込みたいと思います。

毎度毎度の親切なご教授、本当に感謝しております。
Parent: 3656  reply: 3663 返信 編集 削除

[3663] 再度つまづきました・・・

user: PHP勉強野郎! | created: 2007-03-19 15:55
現在、以下のコードでIDの重複チェック及びIDの追加登録を
しようと試みているのですが、IDの重複チェックは出来るようになったのですが、新規登録が出来ません。
		if($check[j] == $id)
{
echo "<BR><CENTER>このIDは既に使われています。</CENTER><BR>";
} elseif($check[j] != $id) {
の部分でメッセージが表示されているので
elseif($check[j] != $id)
で新規登録の
コードを書けば良いと思ったのですが、実行すると何もアクションがありません。
これにはどのような原因が考えられますでしょうか?
ご教授お願いいたします。

『id』には特に設定を施していません。
以下が現在のコードになります。

$connect = pg_Connect("user='*****' dbname='*****'");
// データベースに接続する
if ($connect == 0) // 接続IDが帰ってこなかったら
{
exit; // 終了する
}
if($id == '' OR $pass == '' OR $name == '')
{
$result = pg_query($connect, "SELECT * from test");
// データベースの全内容を取得・変数$resultに格納する
} else {
$query = pg_query($connect, "SELECT id FROM test WHERE id = '$id'");
$check = array();

$query_num = pg_numrows($query);
// データベースの行数を取得
for($j = 0; $j < $query_num; $j++) // 変数iがnum以下のとき
{
$check = pg_result($query, $j, 'id');
$result = pg_query($connect, "SELECT * FROM test");

if($check[j] == $id)
{
echo "<BR><CENTER>このIDは既に使われています。</CENTER><BR>";
} elseif($check[j] != $id) {
pg_query($connect, "INSERT INTO test(id, pass, name, reg, state) VALUES('$id', '$pass', '$name', 'now', 1)");
// データベースの『id, pass, name, reg, state』に『$id, $pass, $name, 現在の時刻, 会員ステータス』を挿入する
// データベースの内容を取得・変数$resultに格納する
}
}
}


質問ばかりで申し訳ありませんが、自分ではこれ以上進めない為、再度質問させていただきました。
Parent: 3660  reply: 3664 返信 編集 削除

[3664] すいません、事故解決しました♪

user: PHP勉強野郎! | created: 2007-03-19 18:42
if($id == '' OR $pass == '' OR $name == '')
{
$result = pg_query($connect, "SELECT * from test");
// データベースの全内容を取得・変数$resultに格納する
} else {
$query = pg_query($connect, "SELECT id FROM test WHERE id = '$id'");
$check = array();

$query_num = pg_numrows($query);

if($query_num == 1)
{
for($j = 0; $j < $query_num; $j++) // 変数iがnum以下のとき
{
echo "<BR><CENTER>このIDは既に使われています。</CENTER><BR>";
}
} elseif($query_num == 0) {
pg_query($connect, "INSERT INTO test(id, pass, name, reg, state) VALUES('$id', '$pass', '$name', 'now', 1)");
}
}

$result = pg_query($connect, "SELECT * FROM test");
$num = pg_numrows($result);
// データベースの行数を取得
for($i = 0; $i < $num; $i++) // 変数iがnum以下のとき
{
$id = pg_fetch_result($result, $i, 0); // データベースのi行目の0番目を変数に格納する
$pass = pg_fetch_result($result, $i, 1); // データベースのi行目の1番目の変数に格納する
$name = pg_fetch_result($result, $i, 2); // データベースのi行目の1番目の変数に格納する
$reg = pg_fetch_result($result, $i, 3); // データベースのi行目の1番目の変数に格納する
$sec = pg_fetch_result($result, $i, 4); // データベースのi行目の1番目の変数に格納する
$state = pg_fetch_result($result, $i, 5); // データベースのi行目の1番目の変数に格納する

print("<tr><td>$id</td><td>$pass</td><td>$name</td><td>$reg</td><td>$sec</td><td>$state</td><tr>"); // テーブルの中に表示する}
}
pg_close($connect);


このように記述する事で自己解決致しました。
お騒がせして申し訳ありませんでした。
Parent: 3663  reply: 3665 返信 編集 削除

[3665] header関数の使い方について

user: PHP勉強野郎! | created: 2007-03-19 22:13
再度再度の質問申し訳ございません。
現在下記のようなコードにする事によって自分のしたい事はほぼ実現出来るようになりました。
※未完成なのは『header関数』の実装と『文字列の重複チェック』です。
一文字の重複チェックは出来るようになったので、なんとなく文字列の重複チェックも予想が出来ます。
が…どうしてもheader関数の実装が出来ず悩んでおります。
コードは下記のとおりで

<!DOCTYPE html PUBLIC "-W3C//DTD HTML 4.01 Transitional//EN">
<HTML lang = "ja">
<HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=euc-jp">
<TITLE>トップページ</TITLE>
</HEAD>
<BODY>
<CENTER>
<H1>トップページ</H1>
<PRE>
<A href = "regist.php">入会登録ページ</A>
<FORM action = "top.php" method = "POST">
ID :<INPUT type = "text" name = "id" size = "20"><BR>
PASS:<INPUT type = "text" name = "passwd" size = "20"><BR>
<INPUT type = "submit" value = "ログイン">
</FORM></PRE>
<TABLE border=2>
<TR><TH>ID</TH><TH>PASS</TH><TH>NAME</TH><TH>REG</TH><TH>SEC</TH><TH>STATE</TH></TR>
<?php
// PHP開始
$id = htmlspecialchars($_POST['id'], ENT_QUOTES); // クオートの変換(特殊文字を HTML エンティティに変換する
$pass = htmlspecialchars($_POST['passwd'], ENT_QUOTES); // クオートの変換(特殊文字を HTML エンティティに変換する

$connect = pg_Connect("user='yuuji' dbname='database'");
// データベースに接続する
if ($connect == 0) // 接続IDが帰ってこなかったら
{
exit; // 終了する
}
$result = pg_query($connect, "SELECT * FROM test WHERE id = '$id' AND pass = '$pass'");
// フォームから入力された値を条件にデータベースから『id』と『pass』の内容を取得・変数$resultに格納する

$num = pg_numrows($result);
// データベースの行数を取得
for($i = 0; $i < $num; $i++) // 変数iがnum以下のとき
{
$url = "http://***********/****.php";
header('Location: '. $url); // ヘッダ送信
exit();
$id = pg_result($result, $i, 'id'); // データベースのi行目の0列目を取得し変数に格納する
$pass = pg_result($result, $i, 'pass'); // データベースのi行目の1列目を取得し、変数に格納する
$name = pg_result($result, $i, 'name'); // データベースのi行目の1列目を取得し、変数に格納する
$reg = pg_result($result, $i, 'reg'); // データベースのi行目の1列目を取得し、変数に格納する
$sec = pg_result($result, $i, 'sec'); // データベースのi行目の1列目を取得し、変数に格納する
$state = pg_result($result, $i, 'state'); // データベースのi行目の1列目を取得し、変数に格納する

print("<tr><td>$id</td><td>$pass</td><td>$name</td><td>$reg</td><td>$sec</td><td>$state</td></tr>");
// テーブルの中に表示する
}
// データベースとの接続を閉じる
// PHP終了
?>
</TABLE><BR>
<TABLE border=2>
<TR><TH>登録日</TH><TH>登録数</TH></TR>
<?php
$reg = pg_query($connect, "SELECT TO_CHAR(reg, 'yyyy年mm月dd日') AS time, COUNT(*) AS reg FROM test GROUP BY time ORDER BY time");
$num = pg_numrows($reg);
// データベースの行数を取得
for($i = 0; $i < $num; $i++) // 変数iがnum以下のとき
{
$regist_time = pg_result($reg, $i, 'time'); // データベースのi行目の0列目を取得し変数に格納する
$regist_num = pg_result($reg, $i, 'reg'); // データベースのi行目の1列目を取得し、変数に格納する

print("<tr><td>$regist_time</td><td>$regist_num</td></tr>"); // テーブルの中に表示する}
}
?>
</TABLE><BR>
<TABLE border=2>
<TR><TH>退会日</TH><TH>退会数</TH></TR>
<?php
$sec = pg_query($connect, "SELECT TO_CHAR(sec, 'yyyy年mm月dd日') AS time, COUNT(*) AS sec FROM test WHERE state = 0 GROUP BY state , time ORDER BY time");
// $sec = pg_query($connect, "SELECT TO_CHAR(sec, 'yyyymmdd') AS 退会日, COUNT(time) AS 退会数 FROM test WHERE state = 0 GROUP BY state , 退会日 ORDER BY 退会日");
$num = pg_numrows($sec);
// データベースの行数を取得
for($i = 0; $i < $num; $i++) // 変数iがnum以下のとき
{
$release_time = pg_result($sec, $i, 'time'); // データベースのi行目の0列目を取得し変数に格納する
$release_num = pg_result($sec, $i, 'sec'); // データベースのi行目の1列目を取得し、変数に格納する
print("<tr><td>$release_time</td><td>$release_num</td></tr>");
// テーブルの中に表示する}
}
pg_close($connect);
// データベースとの接続を閉じる
?>
</TABLE>
</CENTER></BODY></HTML>


Warning: Cannot modify header information -
headers already sent by (output started at
top.php:14) in /top.php on line 38

このようにエラーメッセージが表示されます。
エラーメッセージに表示されてるように最初の部分で文字を記述しているので、それがエラーの原因となっているのでは? と
思うのですが、どのようにこのエラーを取り除けばいいのか
検討がつきません。
ちなみにやりたい処理はデータベースに格納されている
IDとPASSに一致すれば、違うページに飛ぶ処理です。

質問ばかりして本当に申し訳ございません。
自分の技量では解決出来ないので、どうかご教授お願いします。
Parent: 3664  reply: 3666 返信 編集 削除

[3666] header関数2

user: ゆうじ | created: 2007-03-20 00:34
お察しの通りheaderを出力する前に
いかなる出力も存在してはいけません。
スクリプトにheader出力処理を含む場合は、
出力の前にheader送信処理を持ってきます。

<?php
/**
* DB 接続
*/
$connect = pg_Connect("user='yuuji' dbname='database'");
if (!is_resource($connect)) {
exit();
}

/**
* POST から id と passwd 獲得
* & SQL用にエスケープ処理
*/
$id = pg_escape_string($_POST['id']);
$pass = pg_escape_string($_POST['passwd']);

/**
* id と passwd に一致するレコードを問合せ
*/
$result = pg_query($connect, "SELECT * FROM test WHERE id = '$id' AND pass = '$pass'");
$num = pg_numrows($result);

/**
* 該当レコードがあれば $url にリダイレクト
*/
if ($num) {
$url = "http://***********/****.php";
header('Location: '. $url);
exit();
}

/**
* 一致するレコードが無い場合はページ表示処理
*/
?>
<!DOCTYPE html PUBLIC "-W3C//DTD HTML 4.01 Transitional//EN">
<HTML lang = "ja">
<HEAD>
 ・
 ・
 ・
以降の表示処理
 ・
 ・
 ・
Parent: 3665  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 129 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑