PHPでユーザーにURLでパラメーター付メールを送り、そのURLをクリックするとMySQLに保存されているユーザー名「hoge」というレコード内のsignという項目の値が0なら1にするというプログラムを書いています。
phpadminでsignが0なのを確認しているのに、URLをクリックしてプログラムを走らせると、//■■■■(3)■■■■の場所で終わってしまいます。(つまり0だと認識されていない?)その場合、echo $pass;の表示はなぜか1です。
echo $pass;は、//■■■■(2)■■■■のsignを1にする前の処理なのになぜ前もって1となるかが分からない点です。
そこでコメントされている■■■■(1)■■■■のexit;を、コメントアウトさせてからプログラムを走らせるとecho $pass;の表示は0です。
この現象が分かる方は教えて欲しいです。
宜しくお願いします。
//(これより以前省略)
$db = mysql_connect($db_host,$db_user,$db_passwd);
$sql = "select * from $db_table where username like 'hoge'";
$result = mysql_query($sql) or die("SQLに失敗しました".mysql_error());
//■■■■MySQLに保存されているデータを抜き出し
$row = mysql_fetch_array($result);
$sign = $row{'sign'};
$pass = $row{'password'};
echo $pass;
//■■■■メールに書いてあるクリックされたURLの分解
$a = explode('&', $_SERVER['QUERY_STRING']);
$urlpass = split('=', $a[1]);
//exit;//■■■■(1)■■■■
if ( $sign == 0 ){
if ( $urlpass == $pass ){sign
$sql = "update $db_table set sign = 1 where username like 'hoge'";■■■■(2)■■■■
$result = mysql_query($sql) or die("SQLに失敗しました".mysql_error());
if ($result){
echo"認証できました。";
}
}else{
echo"認証できません。";
}
}else{//$signが0以外なら
echo"認証済みです";//■■■■(3)■■■■
}
No.4
- 回答日時:
> likeは不必要かもしれません。
検証してみます。like は 俺の認識では 前方一致(like 'hoge%') とか 後方一致(like '%hoge')のような時に使うものだと思ってます。
ユーザー名の場合は、完全一致の必要があるものだと思いますので、
username='hoge'
であるべきかな~。と思います。
> //■■■■メールに書いてあるクリックされたURLの分解
> $a = explode('&', $_SERVER['QUERY_STRING']);
> $urlpass = split('=', $a[1]);
↑ は スーパーグローバル変数に縛りがなければ↓ で OKです。
$urlpass = $_GET['password'];
$username = $_GET['username'];
likeは不必要でしたね。完全一致で問題ないので
おっしゃるとおりusername='hoge'ですね。
またスーパーグローバル変数でも使えましたので
これもおっしゃるとおり
$urlpass = $_GET['password'];
$username = $_GET['username'];
で修正します。
ありがとうございました。
No.3
- 回答日時:
PHPではクエリ文字列を分解せずとも、スーパーグローバル「$_GET」を利用することでより簡単に必要とする値を取得できます。
参考URL:http://php.net/manual/ja/reserved.variables.get. …
No.2ベストアンサー
- 回答日時:
全く 検証してませんし、ざっと読んだだけで ???となった箇所があります。
> //■■■■メールに書いてあるクリックされたURLの分解
> $a = explode('&', $_SERVER['QUERY_STRING']);
> $urlpass = split('=', $a[1]);
・これだと split が explode と同じ役割しかしていないので、両方 explode で いいのでは?
・URLに渡しているパラメータが不明なので、なんともいえませんが、見た感じ「a=1&b=2」みたいなのかと思ったのですが、
これだと$_GETと同じでは?
・上のようなパラメータだとして、$urlpass に入るのは 配列で array(0 => b , 1 => 2) みたいになるのでは?
> if ( $urlpass == $pass ){sign
末尾の「sign」は 削り忘れと解釈しました。
・配列と文字列の比較???内部的には 「Array == $pass」になってるような気が。
> $sql = "update $db_table set sign = 1 where username like 'hoge'";■■■■(2)■■■■
・like の 意味ありますか?イコール と 同じように見えるのですが。。
Q . どんなパラメータを投げていますか?
この回答への補足
両方 explode でしたね。試して問題ないようです。
投げているパラメータは
http://www.XXX.com/test.php?password=XXXX&userna …
のようなものです。
$urlpassは配列でした。だから$urlpass[1]となります。
likeは不必要かもしれません。検証してみます。
bm_hiroさんはじめ
みなさんの通り修正しましたが
やはり//■■■■(3)■■■■の処理に入ってしまいます。
でも色々勉強になりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
チェックボックスでチェックし...
-
dbに登録したデータをphpのプル...
-
PHPのupdate文はこれでいいので...
-
PHPで[]の使い方について
-
データ関連付けした際
-
PHPでMySQLデータを呼び出し、w...
-
文字化けが解決できません。お...
-
CSVにエクスポートする保存...
-
実行時エラー3131 FROM 句の構...
-
MySQLでデータベースにデータin...
-
VBAをつかってクエリの情報を抽...
-
Accessへ日付をINSERT
-
ACCESSのテーブルをHTMLファイ...
-
PHP(PDO)でDBの情報を完全一...
-
PHP初心者です。syntax error, ...
-
phpで複数の検索語を検索対象に...
-
DB(MySQL)から複数行のデータを...
-
insert1つの処理でもトランザ...
-
JAVA SQLServerException 列名 ...
-
SQL文が実行できません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPで[]の使い方について
-
dbに登録したデータをphpのプル...
-
アラートでyes noを作りたいです。
-
phpでmysqlを使ってデータベー...
-
ヒアドキュメントについて
-
MySQLに保存した画像を表示したい
-
PHP 10件表示 "前へ" "次へ"
-
mysqlから取得した配列をカンマ...
-
DBで検索結果に該当するデータ...
-
PEAR DBでの行取得について
-
検索結果にラジオボタンを付加...
-
SELECT結果から動的にコンボボ...
-
検索結果をgoogleのように数件...
-
PHPでMySQLデータを呼び出し、w...
-
PHPでMySQLのデータを2次元配...
-
checkboxクリック時、SQLを実行...
-
php5.2.9に変更後に不具合について
-
PDOでLIKE検索
-
PHP+MySQLでの配列のinsert文に...
-
PHP・MySQL使用で、年齢制限を...
おすすめ情報