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

データベースからの"抽出"

created: 2005-03-26 03:34 | modified: 2005-03-26 08:46 | reply: 2

[2204] データベースからの"抽出"

user: なおき | created: 2005-03-26 03:34
XREA上でphpとMySQLそしてphpMyAdminを使って初めて
Webデータベースにチャレンジしています。

やりたいことは全文検索ではなくて複数項目からの抽出です。
(動作イメージとしては「Excelのオートフィルタ」)

SELECY * FROM table WHERE a AND b ;

つまりaとbを満たすレコードだけを表示させたくて

aかbどちらか一方が定数ならエラーにならないのですが
aとb両方を変数にするとエラーになります。
なので自分では選択された項目のデータをSQL文(クエリ)に
渡す方法に問題があると考えています。

サンプルの改造で汚いですが以下にソースを貼ります。
ソースファイルは2つに分かれており、
form.htmlで取得した値をform.phpに渡して
form.phpからMySQLにクエリをだします。

ちなみに返すエラーは
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in

/virtual/db_name/public_html/form.php on line 33

Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in

/virtual/db_name/public_html/form.php on line 46
です

もう少しで完成できそうなんですがお手上げ状態で
困っています。どなたか力を貸して下さい。
宜しくお願いします。

----form.html------
<HTML>
<HEAD>
<TITLE>メンバー抽出</TITLE>
</HEAD>
<BODY>
<FONT SIZE=5 COLOR=GREEN>メンバー抽出</FONT>
<HR>
<FORM ACTION="form.php" METHOD="GET">

<P>
<INPUT TYPE="checkbox" NAME="keitai" VALUE="1">携帯アドレスの場合チェックする
<P>

<B>会費負担</B>
<SELECT NAME="futan">
<OPTION VALUE="100">全額負担</OPTION>
<OPTION VALUE="50">半額負担</OPTION>
<OPTION VALUE="0">無料</OPTION>
</SELECT>
<P>
<INPUT TYPE="submit" VALUE="抽出">
<INPUT TYPE="reset" VALUE="クリア">
</FORM>
</BODY>
</HTML>

----form.php-------
<?php
//フォーム送信内容を取得
$keitai = $_GET['keitai'];
$futan = $_GET['futan'];

//MySQLに接続
if( ! $conn = mysql_connect( 'localhost', 'db_name', 'db_pass') ){
die( 'MySQL接続失敗' );
}

//データベースの選択
mysql_select_db( 'db_name', $conn );

//ヘッダ出力をします
header('Content-Type: text/html; charset=euc-jp');
?>
<HTML>
<HEAD>
<TITLE>mysql関数テスト1</TITLE>
</HEAD>
<BODY>

<?php
//SQL発行  ここで「$keitai」を定数にすると正常になります。
$rs = mysql_query( "select * from member where futan = ${futan} && keitai = $keitai ", $conn );

//<TABLE>ヘッダ
echo "<table border=1>";
echo "<tr><th>email</th><th>keitai</th><th>name</th><th>futan</th></tr>";

//1件ずつ取り出すループ
while( $rec = mysql_fetch_array( $rs, MYSQL_ASSOC ) ){
echo "<tr>";
echo "<td>" . $rec['email'] . "</td>";
echo "<td>" . $rec['keitai'] . "</td>";
echo "<td>" . $rec['name'] . "</td>";
echo "<td>" . $rec['futan'] . "</td>";
echo "</tr>";
}

//<TABLE>フッタ
echo "</table>";

//結果セットの解放
mysql_free_result( $rs );

//切断
mysql_close($conn);

?>
</BODY>
</HTML>
reply: 2205 返信 編集 削除

[2205] typo?

user: Smarty | created: 2005-03-26 05:51
変数、定数をもっと理解しましょうね。
いずれも変数。

//フォーム送信内容を取得
$keitai = $_GET['keitai'];
$futan = $_GET['futan'];
ここで
var_dump($_GET);
exit;

として$_GETの中を確認してください。

checkbox は、チェックされていなければnullの可能性があります。
$_GET['futan'];ここでerror Noticeが出ているはず。

$futan = null;
なので
このSQLは
"select * from member where futan = && keitai = 50 ",
となり、mysql_queryはfalse

falseなのにwhileしようとしているだけ。
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in

結果リソースがfalseなのに
mysql_free_result( $rs );

Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in

//初期化
$query = '';
//int型として評価する
$keitai = intval($_GET['keitai']);

//変数存在確認
if (isset($_GET['futan'])) {
//変数が存在すればWHERE分を生成する
//SQLインジェクション防止にも変数は''で囲む(MySQLには効果がある)
$query = "futan = '".intval($_GET['futan'])."'";
}
$sql = "select * from member where ".$query." && keitai = '".$keitai."'";

または
$futan = (isset($_GET['futan'])) ? intval($_GET['futan']): 0;
$sql = "select * from member where futan = '".$futan."' && keitai = '".$keitai."'";

//SQL成功をチェック
if ($rs = mysql_query($sql, $conn) {
//成功なら
while($rs = mysql_fetch_array($rs, MYSQL_ASSOC)) {
処理を書く
}
} else {
//失敗したときの処理を書く
}
Parent: 2204  reply: 2207 返信 編集 削除

[2207] 解決しました!!!

user: なおき | created: 2005-03-26 08:46
先ずはこんな見ず知らずの私の質問に快く回答して頂き
本当にありがとうございます。

職場の人間よりも的確かつ丁寧な回答に
見た瞬間は目から鱗でした。
Smartyさんの回答が処理の順を追った解説でわかりやすかったので
自分のミスにすぐ気付くことができました。

>checkbox は、チェックされていなければnullの可能性があります。
>$_GET['futan'];ここでerror Noticeが出ているはず。
>
>$futan = null;
>なので
>このSQLは
>"select * from member where futan = && >keitai = 50 ",
>となり、mysql_queryはfalse

こちらが大きなヒントになりました。
フォームをチェックボックスからプルダウンリスに変更しただけで解決しました。
お恥ずかしいことにphp以前にhtmlタグを理解してなかったわけですね。

これでコンテンツを完成させらそうですが、
今回のことでさらに興味がわきました。
満足せずにこれからも日々精進したいと思います。
本当にありがとうございました。
Parent: 2205  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 455 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

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