プログラミングPHP内でのSQL文に関するご質問

このQ&Aのポイント
  • PHPの学習中に、掲示板のプログラムで使用されているSQL文について疑問があります。
  • 特に、セッション変数を扱う箇所でのピリオドの意味が分かりません。
  • 詳しい方に教えていただきたいです。
回答を見る
  • ベストアンサー

プログラミングPHP内でのSQL文に関するご質問

プログラミングのPHPの学習中です。 掲示板に関するプログラミングで下記の様なソースコードが記述されていました。 (usersテーブルのusernameとpasswordとセッション変数のusernameとpasswordが等しいという条件の下、情報を抽出するというSQL文です。) $sql = "select * from users where username = '".$_SESSION["username"]."' and password='".$_SESSION["password"]."'"; 上記ソースコードでご質問です。 '".$_SESSION["username"]."'と、'".$_SESSION["password"]."'の箇所で、セッション変数をダブルクォーテーションで囲んでいるのは、変数展開するためと理解しました。また、更にシングルクォーテーションで囲むのは、変数展開したものを文字列として扱う為と理解しました。しかし、セッション変数の両隣にあるピリオドの意味がよく分かりません。文字列と変数を結合する為だと思うのですが、府に落ちません。 どなたかお教え頂ければ幸いです。 何卒宜しくお願い致します。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • duron
  • ベストアンサー率77% (73/94)
回答No.2

セッション変数がダブルクォーテーションで囲われているのではなく 「select * from users where username = '」 「' and password='」 「'」 のそれぞれがダブルクォーテーションに囲まれて文字列として扱われているのです。

A0574025
質問者

お礼

回答誠に有難うございます。 「select * from users where username = '」 「' and password='」 「'」のそれぞれが文字列として扱われ、更にセッション変数の箇所が両隣のピリオドで文字列と連結しているということで理解できました。

その他の回答 (1)

回答No.1

既にご存じじゃぁ、ないですか。 php に限りませんが、ピリオドの意味は、次のようになります。 ・文字列演算子として、ピリオドの左右の文字列をつなげる。 仮に username= pascal password=newton とした場合 select * from users where username = 'pascal' and password='newton' という文字列になるはずです

A0574025
質問者

お礼

回答有難うございます。 変数の箇所に具体的に値を代入した例で分かり易かったです。

関連するQ&A

  • 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
  • プリペアードステートメントの最終的な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
  • PL/SQLの変数について

    困っています。 ホスト引数で :NAME = "あいうえお" としてoracleに渡し、 PL/SQLでNAMEという変数で受け取った後、 Xという変数にその"あいうえお"を'あいうえお' のように、シングルクォーテーションで囲んで入れたいのです。 ですが、 NAME = 'X' としたら文字列として認識してしまい、 NAME = ''X'' としたらPLS-00103のエラーが出てしまいます。 シングルクォーテーションで囲んだ文字列を変数にセットする場合はどのように書いたら宜しいのでしょうか??

  • 変数を使ってのSQL文の書き方(ASP)

    プログラム未経験者です。 aspのSQL文の書き方を教えてください。 (ASP.NETではなく、ASPの方です。) FORMで受けっ取った日付データをstrdayという変数に代入し、 そのstardayを使ってのSQL文の書き方ですが、 以下のような書き方で良いのか分かりません。 例えば、 前の行の「SQL」という同じ変数の直後に連結する書き方や 文字列との連結の書き方です。 また日付をシングルクオーテーションで囲む書き方などです。 strday = Request.Form("StartDay") SQL = "SELECT ・・・,・・・," SQL = SQL & strday & "as startday_date, ・・・," SQL = SQL & " WHERE ('" & strday & "' >= CONVERT(DATETIME, '2012-07-05 00:00:00', 102)) " SQL = SQL & " AND ('" & endday & "' <= CONVERT(DATETIME, '2012-07-06 00:00:00', 102)) " すみません。 宜しくお願いします。

  • PHP,SQL,オブジェクト指向プログラミング

    こんにちは。僕は、現在、PHPとSQLとオブジェクト指向を用いて、掲示板を作成しています。 今ログインフォームまで完成しましたが、その中の認証処理でつまづいています。 ソースを載せますので、アドバイス等お願いします。 session_start(); include 'class.php'; include 'useclass.php'; $its=new keijibandatabase(); $its->k_conect(); $its->k_usertable(); $its2=new userdata; $its2->k_login(); function k_usertable() { //テーブルuserの呼び出し $sql = 'SELECT * FROM user'; $stmt=$this->pdo->query($sql); while($row = $stmt -> fetch(PDO::FETCH_ASSOC)){ } //データベースクラス function k_login() { //ユーザ認証 $row; $user=$_POST['user']; $pass=$_POST['pass']; if($user===$row['uid'] && $pass===$row['pass']){ echo "成功"; }else{ echo "失敗"; } } 以上です。 これらのコードは別々のファイルに記述されています。 回答よろしくお願いします

  • 簡単なif文でちゃんと分岐しません

    今参考書を見ながらやっていますがうまくいきません。 postからusernameとpasswordの値を受け取って処理する スクリプトなんですが、うまく作動してくれません。 ■問題点 分岐点が4箇所ありますが、 パスワードだけ間違っても、すべて■1■ ログイン処理状態になります。 どうしてもパスワード再設定の画面に切り替わりません。 入力されたデータはデータベースにきちんと入ります。 3日間これで悩んでいて、ついに投稿してみました。 こんなこともわからない私ですが なんとかお願い致します。 ----ここから---- <?php session_start(); $username = $_POST["username"]; $sql = "SELECT * FROM `art_users` WHERE `user_name` = '%{$username}%'"; $query = mysql_query($sql) or die("データ追加エラー" . mysql_error()); $record = mysql_fetch_array($query, MYSQL_ASSOC); if ( $_POST["mode"] == "login" && mysql_num_rows($query) > 0 && $_POST["password"] == $record["user_password"] ) { $_SESSION["userid"] = $record["user_id"]; header("Location: kaukau_top.php"); } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>ログイン処理</title> </head> <body> <?php // ■1■ ログイン処理状態 if ( $_POST["mode"] == "login" ) { // 新規登録:クエリ実行結果が0行=既存ユーザー名と一致しない if ( mysql_num_rows($query) == 0 ) { echo '新規ユーザー登録<br>'; echo '<form action="kaukau_login.php" method="POST">'; echo '<input type="hidden" name="mode" value="register">'; echo '<input type="submit" value="登録">'; echo '</form>'; } // パスワードミス:クエリ実行結果のパスワードと入力されたパスワードが一致しない elseif ( $_POST["password"] != $record["user_password"] ) { echo 'パスワードが違います。<br>'; echo 'ひみつの質問に答えると、パスワードを変更できます。<br>'; echo '<form action="kaukau_login.php" method="POST">'; echo '<input type="hidden" name="username" value="' . $username . '">'; echo '<input type="hidden" name="mode" value="resetpassword">'; echo '<input type="submit" value="送信">'; echo '</form>'; } } // ■2■ パスワード再設定状態 elseif ( $_POST["mode"] == "resetpassword" ) { if( $record["user_answer"] == $_POST["answer"] ) { echo 'パスワード再設定<br>'; echo '<form action="kaukau_login.php" method="POST">'; echo '<input type="hidden" name="username" value="' . $username . '">'; echo '<input type="hidden" name="mode" value="modifypassword">'; echo '<input type="submit" value="登録">'; echo '</form>'; } else{ echo "ひみつの答えが違います"; } } // ■3■ 新規ユーザー登録状態 elseif ( $_POST["mode"] == "register" ) { if( $_POST["password"] == $_POST["confirm"] ) { $sql = "INSERT INTO users (user_name, user_password, user_question, user_answer) VALUES ("; $sql .= " '" . $_POST["username"] ."',"; $sql .= " '" . $_POST["password"] ."',"; $sql .= " '" . $_POST["question"] ."',"; $sql .= " '" . $_POST["answer"] ."')"; $result = mysql_query($sql); echo '登録しました。'; } else { echo 'パスワードを再確認してください。'; } } // ■4■ パスワード変更状態 elseif ( $_POST["mode"] == "modifypassword" ) { if ( $_POST["password"] == $_POST["confirm"] ) { $sql = "UPDATE users"; $sql .= " SET user_password = '" . $_POST["password"] . "'"; $sql .= " WHERE user_name = '" . $_POST["username"] . "'"; mysql_query( $db, $sql ); echo '登録しました。'; } else { echo 'パスワードを再確認してください。'; } } ?> </body> </html>

    • 締切済み
    • PHP
  • PL/SQLの初歩的な質問

    失礼します。 PL/SQLについて、初歩的な質問をさせてください。 DBに以下のような文字列が入っていて、 それを抽出し変数にセットするとします。 A'1234567'→変数aにセット B'  12A345B'→変数bにセット 質問1 Aの文字列を取得した際、'123-4567'のように 間にハイフンを付けて変数aにセットする場合 どのようなPL/SQLの記述になりますか? 質問2 Bの文字列を取得した際、'12345'のように 左側の空欄と数字以外の文字を取り、 なおかつ数字を半角にして変数bにセットする場合 どのようなPL/SQLの記述になりますか? お手数お掛けしますが ご回答宜しくお願いします。

  • PLSQLでのSQLの実行に関しての質問

    [環境] db:oracle 11g express edition os:windowsXP 言語:PLSQL [質問] PLSQLを使用したプログラムを作成していたのですが、SQLの文字数がVARCHAR2(32767)で宣言した変数の文字数を超えてしまいエラーとなります。 理由としては、引数で受け取った配列の数分だけUNIONでSQLを結合し、変数に格納しているのですが、配列の量が多いと変数の最大文字列を超えてしまうようです。(ソースイメージは下記に記述) 対応としては、変数を分割し、SQLを実行することや、SQLを組みなおすなどの対応が考えられるのですが、”(1)処理速度の都合上、できれば1度のSQLで実行したい。”、”(2)抽出条件が配列の条件によって、複雑に変わることと、既に稼働しているプログラムの為あまりソースを変更したくない”という理由から検索条件は変えずに、1度のSQLでどうにか実行できないかと考えています。 上記条件をクリアする何か良い方法はありますでしょうか? (もし、1回のSQLで実行は難しいのであれば、最悪配列を使用してSQLを分割して対応しようとは思っています。ただ、他に方法があるのであればそれに越したことはないです。) どなたか良い方法をご存知の方がおりましたら教えていただけないでしょうか? 宜しくお願い致します。 [ソースイメージ] <引数> 配列[100];          <-- 条件が格納された配列 <変数定義部> hensu_union VARCHAR2(32767); <-- 結合したSQLを格納 hensu_where VARCHAR2(1000); <-- SELECTの条件の格納 <プログラム部>  <省略>  .  .  .   FOR i IN 1..配列分 LOOP <-- 配列の数分、UNIONでSQLを結合 IF i > 1 THEN hensu_union := hensu_union || 'union '; END IF; hensu_union := hensu_union || 'select A,B,C .... from マスタA、マスタB WHERE ' || hensu_where ;  ←ここのUNIONで結合しすぎると最大文字列を超えエラー  END LOOP; . .  省略 . .   OPEN カーソル名 FOR hensu_union ; ←SQLを実行する部分でどうにか1回で済ませたい。                    VARCHAR2を超えるような文字列を格納できたり、                    他の良い方法はあるのか?

  • XAMPPでSQL文を流すとフリーズしてしまいます

    現在、PHPでホームページを開発中で、XAMPPで試行錯誤しています。 数回(5~10回程度) SQL文を流すとApach自体が落ちる?サーバに接続出来ない状態になってしまいます。 自分の予想だと、接続が解除出来ていず複数接続になってしまい落ちているのかと思っています。 XAMPPのバージョンは1.7.3です。 実際に作成したログイン画面のソースコードを貼ります。 よろしくお願いいたします。 $server = "localhost"; $id = "ID"; $pw = "パスワード"; $dbname = "dbname"; $conn = mysql_connect($server, $id, $pw ); if( $conn == false ) { die("MySQL 接続エラー"); } mysql_select_db( $dbname ); $sql = " SELECT * FROM user where user_id='".$_POST["user_name"]."'"; $res = mysql_query( $sql ); while( $row = mysql_fetch_array( $res ) ) { // ログイン画面から取得したPWとデータベースのパスワード(pass)を照合する if($cryptpass == $row["password"]){ $user = new User($row["user_id"], $row["mail"]); $_SESSION["user"] = serialize($user); } } mysql_free_result($resource); mysql_close();

    • ベストアンサー
    • PHP
  • MS-DOSでのSQL実行について

    MS-DOSでSQLPlusを使い、select文などを実行しようと思うのですがソースコードの書き方がいまいち分かりません。 sqlplus ユーザ名/パスワード@データベース名 @実行したいSQLファイル1 if "%a%"==1( @実行したいSQLファイル2 ) else ( @実行したいSQLファイル3 exit というような形でソースを書いたのですがSQLのファイルが開かなかったりでうまく動きません。 SQLファイルの中身はselect文などで、 変数aはSQLの中でsetされる変数です。 どのように書けばうまく実行できるのでしょうか? また、参考になるサイトなどありましたら教えて頂けると助かります。 よろしくお願いします。

専門家に質問してみよう