PHP & MySQLでの質問です。


データベース「member」のテーブル「list」は
「name」と「pw」と「work」と言う3つのフィールドから成り立っております。
listには現在下記4つのデータが入っております。

name---pw---work(以下データ)
斉藤---1212---不動産業
山田---5854---八百屋
山田---8758---作家
金子--7451---教師

※name=山田は2つありますがpwが異なります。

上記データベースからブラウザ上で
nameとpwを入力して両方とも一致した場合に「work」を表示させたいのですが
どのようにすればよろしいでしょうか?
下記のスクリプトの●●●のところで教えてください。

<?php

$link = mysql_connect('localhost', '0000', '2222');

●●●●

$close_flag = mysql_close($link);

?>

回答の条件
  • 1人2回まで
  • 登録:2007/04/09 19:17:33
  • 終了:2007/04/09 21:21:12

回答(2件)

id:studioes No.1

studioes回答回数522ベストアンサー獲得回数612007/04/09 19:24:46

$rslt = mysql_query("SELECT work FROM member WHERE name='$name' AND pw='$pw'", $link);

if($row = mysql_fetch_array($rslt)){

echo($row['work']);

}

id:t_yasu

Parse error: syntax error, unexpected $end in…と表示されてしまいます。

2007/04/09 21:10:58
id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912007/04/09 20:21:40

ポイント70pt

本来なら名前ではなく、全体でユニークな ID を使用するほうが良いとは思いますが、とりあえずご希望のコードだと下記のようでしょうか。


関数にしてみましたが、ベタに書くなら変数 $name と $pwを設定して、関数の中だけを書けばそれでもできます。

<?
// データベース情報
define( "db_Server", "localhost" );
define( "db_User", "foo" );
define( "db_Password", "bar" );
define( "db_Name", "testdb" );

getWork( 'YAMADA', '1234' ); // 呼出サンプル
//  getWork( $_POST['name'], $_POST['pw'] );  // POST ならこんな感じ?


//-------------------------------------------
function getWork( $name, $pw ) {
//-------------------------------------------
    $conn = mysql_connect( db_Server, db_User, db_Password ) or die("接続エラー");
    mysql_select_db(db_Name) or die("DATABASE 選択エラー:".$dbName );
    $sql = "SELECT * FROM list;";
    $res = mysql_query( $sql, $conn ) or die("データ抽出エラー\n".$sql);
    mysql_close( $conn );

    while ( $row = mysql_fetch_array( $res, MYSQL_ASSOC ) ) {
        if ( ( $name == $row['name'] ) && ( $pw == $row['pw'] ) ) {
            printf( "[%s] さんのお仕事は[%s]です。\n", $name, $row['work'] );
            return;
        }
    }
    printf( "一致する登録がありません。\n" );
}
?>
id:t_yasu

できました!ありがとうございます。

コピーペーストするだけで私の思っていた通りになりました。素晴らしい!!!

本番ではご指摘のとおり「本名」は使いませんのでご心配なく!。

2007/04/09 21:18:58
  • id:studioes
    本番なら
    $name = mysql_real_escape_string($_IN['name']);
    $pw = mysql_real_escape_string($_IN['pw']);
    これをお忘れ無く。
    忘れるとSQLインジェクションで死にますので。
  • id:t_yasu
    studioes様

    終了した質問にも関わらずコメントとして貴重な
    ご指摘をありがとうございます。

    SQLインジェクション?と思いyahooで検索してゾッとしました。
    本番はもっと勉強してからにします。

    またhatenaで質問させていただくことも多々あると思いますので
    今後ともよろしくお願いいたします。
  • id:Mook
    確かに動くのですが、studioes さんのようにクエリで検索したほうがスマートです。

    とくにデータが多い際には性能に影響がでますし、DBサーバとWebサーバが別にある場合には、負荷分散にもなります。

    studioes さんの回答を見て、「しまった~」って感じでした。
  • id:t_yasu
    Mook様

    クリエ検索の方が良かったとのことですか?
    studioes様には不快な気分にさせてしまったと思います。

    只、最初の回答をコピペしてもエラーが出てしまいます…。
  • id:Mook
    動く動かないというのも初心者の方にとっては重要だと思いますので、私はなるべく処理の全体を書くようにしていますし、できるだけ動作確認もしています。

    ただ、それとは別にやり方の良し悪しというのもあります。

    結果としては、どちらでも出来るでのすが「効率的」という意味では studioes さんのやり方のほうが一般的だと思いましたので、上記のようにコメントしました。
  • id:kurukuru-neko
    必要応じて

    // 内部エンコードがEUCの場合
    mb_internal_encoding("EUC-JP");

    // 内部エンコーディングがEUCの場合
    // 接続情報設定
    mysql_query("set names ujis");

    // DB名がtestの場合
    $db = mysql_select_db("test");

    //post_name/post_pwに設定されているとした場合
    // pinrt_r/printは実行の確認用

    $name = mysql_real_escape_string($post_name);
    $pw = mysql_real_escape_string($post_pw);
    $sql = "select name,pw,work,if(pw='${pw}','OK','NG') as verify from member " .
    "where (name='${name}') and (pw='${pw}') limit 2";
    print "SQL=" . $sql . "\n";
    $res = mysql_query($sql);
    if( $res ) {
    $rows= mysql_affected_rows($link);
    $data= mysql_fetch_assoc($res);
    if( $data ) {
    print "rows= " . $rows . "\n";
    print_r($data);
    if( $rows == 1 ) {
    if( $data['name'] == $name && $data['pw']==$pw && $data['verify'] == 'OK' ) {
    print "該当するデータがありました\n";
    } else {
    print "SQLが正しく実行されていません\n";
    };
    } else {
    print "該当するデータが複数あります\n";
    }
    } else {
    print "該当するデータがありません\n";
    };
    mysql_free_result($res);
    } else {
    print "SQLにエラーがあります\n";
    print "ERROR=" . mysql_error() . "\n";
    };
  • id:studioes
    ぁぁぁぁぁ、ずっと勘違いしてた。
    テーブルはlistだったんだ・・・(仕事でいつもmemberテーブル使ってるから勘違いしてた)
    ごめんなさい;;
    SELECT work FROM listだったorz

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません