Perl上でのMySQL文での変数比較について

このQ&Aのポイント
  • Perl上でMySQL文を使用して変数を比較する方法について説明します。
  • 変数を文字列比較する場合、シングルコーテーションで囲む必要があります。
  • シングルクォーテーションで囲まずに変数を比較すると正確な結果が得られず、動作しない場合があります。
回答を見る
  • ベストアンサー

Perl上でのMySQL文について

ユーザー名とパスワードを入力してもらい、パスワードが一致していればOK、違っていればNGがでてくるプログラムを作りました。 if ( $password eq &sub_db( "SELECT password FROM login WHERE user LIKE '" . $user . "'") ) { print "OK!"; } else { print "NG!"; } ちなみに &sub_db というのはSQL文を実行するだけのサブルーチンです。 想定通りに動きましたが、SQL文の "SELECT password FROM login WHERE user LIKE '" . $user . "'" の '" . $user . "'" なんですが、最初はこうしてました "SELECT password FROM login WHERE user LIKE $user" これだと動きませんでした。多分シングルコーテーションで囲まなければいけない決まりがあるんだと思います。変数を文字列比較するときはこうしなければいけないのでしょうか?

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5081/13278)
回答No.1

SQL文の記述ルールで文字列はシングルコーテーションで囲まなければいけない事になってます。 あと、LIKE検索なのにワイルドカードを使って無いようですが、いいのでしょうか? ワイルドカードを使わないならLIKEではなく = にして完全一致検索させた方がいいと思いますよ。

nakisan2011_12
質問者

お礼

ご返信、ありがとうございます。 LIKEは一部分でも一致すればOKなのですね。完全一致の場合は文字列でも = がきくのですね。 LIKEは文字列専用の演算子なのかと思いました。

関連するQ&A

  • PHP+MySQL

    PHP4で、MySQLに接続しています。 $connには、接続IDが格納されています。 以下のスクリプトで、「エラー」が出てしまうのですが、何故でしょうか? $sql = "SELECT (User_num, User_name, User_pass) FROM User WHERE User_name='$login_name'"; if (!$result= mysql_query($sql, $conn)){ die (print ("エラー")); } SQL文を、 SELECT (User_num) FROM User WHERE User_name='$login_name' と書き換えるとうまくいきます。複数にするとエラーというのはどうしてでしょう

    • ベストアンサー
    • MySQL
  • プリペアードステートメントの最終的なSQL文の確認

    プリペアードステートメントでSQLを実行しております。 プリペアードステートメントで最終的に実行されたSQL文を確認する方法はないでしょうか。 <実行SQL> $sql = "SELECT * FROM member where user = :username and password = :password and delflag ='0'"; $stmt = $this->db->prepare($sql); $flag = $stmt->execute(array(':username' => $user,':password' => $pass)); $passには、ユーザーから入力されたパスワード情報 $userには、ユーザーから入力されたユーザー名が入っております。 executeで実行された、$userの内容と$passwordの内容が埋め込まれ実行された 最終的な$SQL文を確認したいと思っています。 どのようにすれば確認できるものなのでしょうか。 ご教授よろしくお願いします。

    • ベストアンサー
    • PHP
  • MYSQLでストアドプロシージャの引数を二つ

    MYSQL初心者で参考書にかじりついてプログラミングしています。 主にDBの内容をPHPで吐き出させるといった使い方をしています。 SQL文があまりにも長ったらしくなってきたのでストアドプロシージャを使いたいのですが、使っているSQL文が (SELECT * FROM .変数. WHERE .変数. LIKE '.変数.') UNION (SELECT * FROM .変数. WHERE .変数. LIKE '.変数.'); となっており、引数を複数使えないとスッキリさせられない状況です。 ストアドプロシージャで複数の引数を設定することはできないのでしょうか?

    • ベストアンサー
    • MySQL
  • ハッシュ値のパスワードMYSQL検索で一致しない

    PHPでMYSQLにハッシュ値にしたパスワードを登録して、同じハッシュ値で検索を行いましたが、どうしても検索結果で一致しません。 パスワードの文字列をMD5を使ってハッシュ値に変換して次のようにMYSQLに登録しました。 $email = htmlspecialchars($_POST["email"]); $user_name = htmlspecialchars($_POST["user_name"]); $password = md5(htmlspecialchars($_POST["password"])); $sql = 'INSERT INTO user_tbl (email,user_name,password) VALUES ( "' . $email . '","' . $user_name . '","' . $password . '" )'; $sth = $dd->prepare($sql); $sth->execute( array() ); $qid = $dd->lastInsertId(); ※user_tblの定義のこんな感じにしてあります。 CREATE TABLE user_tbl ( email varchar(50) NOT NULL, user_name varchar(20) NOT NULL, password VARCHAR(50) NOT NULL ); 検索する処理でSQL等は次のように処理しましたが、検索結果がゼロ件でした。 $email = htmlspecialchars($_POST["email"]); $beforepass = md5(htmlspecialchars($_POST["beforepass"])); $afterpass = md5(htmlspecialchars($_POST["afterpass"])); $sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '" and password = "' . $beforepass . '"'; $q = $dd->prepare( $sql ); $q->execute(); if($q->fetchColumn() == 1){ //ここでパスワードが一致した場合の処理を書く } そこで次の2パターンのようにSQL文を少し変えてみたらそれぞれの検索結果が1件でした。 $sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '" and password = "' . $beforepass . '"';                     ↓ $sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '"'; $sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '" and password = "' . $beforepass . '"';                     ↓ $sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '" and user_name = "tanaka"'; (MYSQLのuser_tblのuser_nameには'tanaka'と入っている状態で実行したものです) SQLに渡される各変数には文字列が代入済みであることが確認できています。 MD5でハッシュ化した文字列同士を比較してどうして検索結果が一致しないのでしょうか? ちなみに検索したいパスワードのハッシュ値とDBに格納されているパスワードのハッシュ値を目で比較したら一致していました。 以上です。 ハッシュ値を検索条件に入れる場合に特殊な事をするのでしょうか? ヒントだけでもよいので教えて下さい。 宜しくお願いします。 os: windows 7 eclipse: Version: 4.2.0 Build SDK: Android 4.1(API 16) PHP 5

    • ベストアンサー
    • PHP
  • VBSの中で書くSQL文の記述方法

    よろしくお願いします。 select * from db1 into id,password,date,name where db1_id = **** and db1_password = **** and db1_date = 99999999; (db1_id,db1_password,db1_dateがプライマリキー) db1という表からプライマリキーに該当したデータを取り出し、 変数に格納したいと思っています。 このSQL文をASPのVBSの中で実現する方法を教えてください。 <% Dim Conn,SQL,RS Dim id Dim password Dim date Dim name db1=server.mappath("db1.mdb") DBName="Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & db1 Set Conn = Server.CreateObject("ADODB.Connection") Conn.open DBName SQL = "select * from db1" INTO = "into id,password,date,name" WHERE = "where db1_id = **** and db1_password = **** _ and db1_date = 99999999" SQL = SQL & INTO & WHERE & ";" Set RS = Server.CreateObject("ADODB.Recordset") RS.Open SQL, Conn,3,3 %> これでうまくいくかな~と思ったのですが・・・。

  • jspでMysql検索で困っています。

    jspでMysql検索で困っています、 コマンド画面で下記の入力をすると条件の検索が出来ます。 select * from kanagawa where fish like '%コイ%'; (8件中検索されるのは1件でそれが表示されます) jspで命令すると、違う結果が返されてきます。 String sql; sql="select * from kanagawa where fish like '%コイ%'"; ResultSet rs=db.executeQuery(sql); 最初は変数でテーブル名等受け取っていたのですがうまくいかなかったので直接検索文を入れたのですが結果は同じく違う物が検索されてしまいます。(fishのフィールド8件中5件が結果としてでます。) 何を調べても間違いなさそうですが・・ どうにもならず困っています、助けてください、お願いします。

  • functionを使ってmysqlの指定を分けたい

    functionを使ってmysqlの指定を分けって、 分けたいのですが、どうしても $rst = mysql_query($mydbsql, $con_mydb); とこで、エラーが呼び出されてしまいどうしたらいいのかわかりません。 function my_sql_ini(){ require_once("mydb_ini.php"); $con_mydb = mysql_connect($MYDBSERVER, $MYDBUSER, $MYDBPASSWARD); $selectmydb = mysql_select_db($MYDBNAME, $con_mydb); $num = 0; $mydbsql = "select * from schedule_user"; $rst = mysql_query($mydbsql, $con_mydb); $num = mysql_affected_rows(); } function my_sql_user(){ my_sql_ini(); if($con_mydb){ print "ok"; } else { print "ng"; } } function user_display(){ my_sql_ini();   $mydbsql = "select * from schedule_user order by user_id"; if($con_mydb){ print "ok"; } else { print "ng"; } }

    • 締切済み
    • PHP
  • MYSQLで全てのカラムから検索する。

    tbというテーブルのbangというカラムに4が含まれていれば表示というのは select * from tb where (bang) like '%4%' ; という形になりますが、このtbテーブルにさらにname,tukiというカラムがあったとして カラムに関係なくレコードのどこかに4が入っていれば抽出するというSQL文が書きたいです。 select * from tb where bang like '%4%' or name like '%4%' or tuki like '%4%' ; と書くことで何とか今まではやってきたのですが、カラム数が増えてきてしまったので、ものすごく長いSQL文なってしまいました。 もう少しスマートにする方法はありませんか?

    • ベストアンサー
    • MySQL
  • ユーザー定義関数の意味

    下記のユーザー定義関数の意味を自分なりに解釈しました。 下記の意味で合っていますか? // $dbと$user_idを受け取ったget_user関数は、$dbと$sqlを受け取ったユーザーの情報を取り出す function get_user($db, $user_id){ // データベースに接続してusersテーブルからuser_idが$user_idに一致するuser_id、name、password、typeを1行だけ表示する $sql = " SELECT user_id, name, password, type FROM users WHERE user_id = {$user_id} LIMIT 1 "; return fetch_query($db, $sql); } // $dbを受け取ったget_login_user関数は、変数dbと変数login_user_idを受け取ったget_user関数を返す function get_login_user($db){ // 変数login_user_idをセッションのユーザーIDと定義する $login_user_id = get_session('user_id'); return get_user($db, $login_user_id); }

    • ベストアンサー
    • PHP
  • PostgresSQL文→MySQL文への変換について

    始めまして、soulutionと申します。 この度、社内イントラネット構築により、備品発注機能をポータルサイトに追加することになりました。 ポータルサイトはphp+mysqlにて動作しております。 なのでphp+mysqlにて備品発注機能を実装しようと思いまして、ベースはショッピングカート機能で作成しようかと思っております。 googleなどでphpによるショッピングカート作成しているフリープログラムを見つけ、プログラム解析をしていたのですが、そのプログラムのデータベースはPostgresSQLベースで組まれており、当方ではPostgresSQL文をMysql文に変換できなかったため、皆様にお力添えしていただけたらと思っております。 いろいろ思考錯誤しましたが、エラーとなりました。。 一応下記に構文を載せておきます。 どうぞよろしくお願い致します。 開発環境(サーバ) OS:windows XP sp2 PHP:バージョン5.28 MySQL:バージョン5.1 エディタ:Adove DreamweaverCS3 ブラウザ:Internet Explore ver6.0 PostgreSQL文(これをMySQL用に変換します) ------------------------------------------------------------ if($mode == 'sort'){ if($a){ $sql = "select * from db01 where a = " . $a . " order by " . $b . " " . $c; }else{ $sql = "select * from db01 order by " . $b . " " . $c; } }else{ $sql = "select * from db01 order by " . $b . " " . $c; } MySQL(当方が考えました) ------------------------------------------------------------ if($mode == 'sort'){ if($a){ $sql = "select * from db01 where a=$a ORDER BY $b.$c "; $mysql->query($sql); }else{ $sql = "select * from db01 ORDER BY $b.$c"; $mysql->query($sql); } }else{ $sql = "select * from db01 ORDER BY $b.$c"; $mysql->query($sql); } エラー ------------------------------------------------------------ Fatal error: Call to undefined function pg_query() in C:\Program Files\Apache Group\Apache2\htdocs\Prototype\equipment-order.php on line 408

    • 締切済み
    • PHP

専門家に質問してみよう