teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

加筆修正

2019/11/15 09:02

投稿

退会済みユーザー
answer CHANGED
@@ -23,7 +23,7 @@
23
23
  開示できる範囲のミニマルなもの(コード、データ構造、テストデータ)を別途工夫して用意しないといけないのです。
24
24
  めんどうですか? わずらわしいですか? 手間暇かけなくないですか?
25
25
  そう思うのであれば、そもそも teratail でデバッグ依頼のようなことを投稿してはいけないのです。
26
- それを丁寧にやってくれる質問者さんが解決にたどり着いています。
26
+ それを丁寧にやってくれる質問者さんが、経験豊富な回答者の情報を上手に引き出し、解決にたどり着いています。
27
27
 
28
28
  回答しようとする側は、
29
29
  足りない情報を自分の経験や知識に照らし合わせて補おうとしたり、

3

リニューアル

2019/11/15 09:02

投稿

退会済みユーザー
answer CHANGED
@@ -1,3 +1,58 @@
1
+ まず、情報不足の段階で、解決につながるかどうか怪しい情報を提供し
2
+ 混乱させてしまったことについては申し訳ないと思っております。
3
+
4
+ teratail など第三者に自分の関わるコードを評価してもらい
5
+ 解決につながるアドバイスを得る場合において、
6
+ 大事なことは、**質問者さんと回答者側とで**
7
+ **同じコード、同じデータでテストし評価すること**です。
8
+ 開発中のコードを全部開示しろ、
9
+ 動かすのに必要なデータ全部開示しろ、ということではなく、
10
+ 要求された機能を満たすだけの最小限(ミニマル)なコードと、
11
+ 要求された機能をテストするのに必要な、リアルと関係ない仕様を満たすテストデータが必要で、
12
+ 解決に至る回答をつけようとしてくれる第三者の手元で試せるよう、
13
+ 質問者さんが頑張って情報提供しないと始まらないのです。
14
+
15
+ それを怠ってしまうと、
16
+ 回答者側が再現できなかった部分を適当に解釈してコードを書き、
17
+ 実態に則さない状態でテストして「もしかしたらこれで解決するんじゃないだろうか」という状態の
18
+ 回答が寄せられます。
19
+ (私が最初に書いたみたいに)
20
+
21
+ 質問者さんが直接動かしている実行環境のコードやデータを開示できないのは、実によくある話です。
22
+ それでも teratail などを利用しようとするなら、
23
+ 開示できる範囲のミニマルなもの(コード、データ構造、テストデータ)を別途工夫して用意しないといけないのです。
24
+ めんどうですか? わずらわしいですか? 手間暇かけなくないですか?
25
+ そう思うのであれば、そもそも teratail でデバッグ依頼のようなことを投稿してはいけないのです。
26
+ それを丁寧にやってくれる質問者さんが解決にたどり着いています。
27
+
28
+ 回答しようとする側は、
29
+ 足りない情報を自分の経験や知識に照らし合わせて補おうとしたり、
30
+ ネット上の参考情報がないか調べる時間を使ったりと、
31
+ 質問者さんが考えるよりも多くの時間を(何人もの人が大なり小なり)費やしています。
32
+ 本業を抱えている人も多く、業務の合間を縫って手助けしようとしてくれているのに、
33
+ 情報が足りない、テスト用のデータがない部分を工夫するために余計に手間暇をかけて付き合おうとしています。
34
+ 質問者さん一人がめんどうでわずらわしいのではないのです。
35
+
36
+ そして今回は、password_verify()の件以外に、
37
+ 文法エラーや、データベースアクセスにまつわる作法など、さまざまな
38
+ 「なぜここはこういう書き方をしているのだろう?」という箇所があり、
39
+ 実行環境の差異を騙して動かそうとしても、password_verify()の件じゃないところで引っかかり、
40
+ 回答する側としてはそこに手間暇がかかっています。
41
+ そこを解決してからpassword_verify()の件に取り組みたい主旨で私は回答を書きました。
42
+ それなのに、
43
+ 「※質問に関係のないことは情報追加・修正依頼に書かないでください。」などと言われては、
44
+ デッドロックですよ。
45
+ これでアドバイスしようかなと思っていた潜在的な回答者を追い出してしまっています。
46
+ (情報セキュリティ方面の第一人者も戸惑っていましたし。)
47
+
48
+ 質問者と回答者側が同じテーブルにつかないと始まらない、
49
+ そのために必要な指摘には柔軟に対応してください。
50
+ なにもリアルなものを出してくれとは言っていません。
51
+ 第三者が検証・テストできる情報がほしいだけです。
52
+
53
+ 以下、リニューアル前の回答:
54
+ ---
55
+
1
56
  えーっと、回答につながるかどうかわかりませんが、
2
57
  整形ツールにかけた上で書き直してみた。
3
58
  机上デバッグのみで、実際に動作まではさせていない点についてはあしからず。

2

見直し

2019/11/15 09:00

投稿

退会済みユーザー
answer CHANGED
@@ -129,7 +129,7 @@
129
129
  );
130
130
 
131
131
  $stmt = $pdo->query("SELECT * FROM user_tb");
132
- while($row = $stmt -> fetch(PDO::FETCH_ASSOC)) {
132
+ while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { // ここいらは何をやっているかわかんないから放置してる
133
133
  $emails .= "[".$row["email"]."]";
134
134
  $userids .= "[".$row["userid"]."]";
135
135
  }

1

見直し

2019/11/13 09:30

投稿

退会済みユーザー
answer CHANGED
@@ -53,4 +53,94 @@
53
53
  } catch (PDOException $e) {
54
54
  exit('sql:' . $e->message);
55
55
  }
56
+ ```
57
+
58
+ ---
59
+
60
+ signup.phpもガッチャガチャ引っ掻き回してみた。
61
+ これもあくまで机上デバッグで文法エラーが出ないだろうというところまで詰めただけ。
62
+
63
+ bindParamじゃなくbindValueを使ったり、
64
+
65
+ try~catchの使い方を変えたり、
66
+
67
+ `$pdo`を関数の引数に使って外にだしてもアクセスできるようにしたり、
68
+
69
+ **全角空白でインデント**している箇所を直したり、
70
+
71
+ まだ納得していない部分として、
72
+ ra()で新しいユーザーIDを作っているみたいだけど、
73
+ データベース上に登録済みのを生成しているかもしれないので、
74
+ ユーザー登録する前に検証する処理を入れるべき。
75
+
76
+ ```php
77
+ <?php
78
+
79
+ function ra(){
80
+ $len="";
81
+ for( $i=0; $i<10; $i++ ){
82
+ $len.=substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'), 0, 10);
83
+ }
84
+ return $len;
85
+ }
86
+
87
+ function newusers( $pdo, $userids ) {
88
+ $kuserid = ra();
89
+ if (strpos($userids, $kuserid) !== false) {
90
+ newusers();
91
+ } else {
92
+ $name = filter_input(INPUT_POST, 'name');
93
+ $email = filter_input(INPUT_POST, 'email');
94
+ $pass1 = filter_input(INPUT_POST, 'password');
95
+ $pass2 = filter_input(INPUT_POST, 'password2');
96
+ $niti = date("Y/m/d H:i:s");
97
+ $pdo->beginTransaction();
98
+ $stmt = $pdo->prepare("INSERT INTO user_tb (name, password,password2,userid,createddate,email) VALUES (:name, :password,:password2,:userid,:createddate,:email)");
99
+ $pass1s = password_hash($pass1, PASSWORD_DEFAULT);//ここでハッシュ化
100
+ $pass2s = password_hash($pass2, PASSWORD_DEFAULT);//ここでハッシュ化
101
+ $stmt->bindValue(':name', $name, PDO::PARAM_STR);
102
+ $stmt->bindValue(':password', $pass1s, PDO::PARAM_STR);
103
+ $stmt->bindValue(':password2', $pass2s, PDO::PARAM_STR);
104
+ $stmt->bindValue(':email', $email, PDO::PARAM_STR);
105
+ $stmt->bindValue(':userid', $kuserid, PDO::PARAM_STR);
106
+ $stmt->bindValue(':createddate', $niti, PDO::PARAM_STR);
107
+ $stmt->execute();
108
+ $pdo->commit();
109
+ $_SESSION['id'] = $kuserid;
110
+ exit("ok"); // ここでphpの処理が抜けちゃうけどいいのかい?
111
+ }
112
+ }
113
+
114
+ function fu001 ( $pdo, $emails ) {
115
+ $email = $_POST['email'];
116
+ if (strpos($emails,$email) !== false) {
117
+ exit( "emailerror" );
118
+ } else {
119
+ newusers($pdo, $userids);
120
+ }
121
+ }
122
+
123
+
124
+ $emails = "";
125
+ $userids = "";
126
+ try {
127
+ $pdo = new PDO('mysql:host=example.jp;dbname=user_data;charset=utf8','user','password',
128
+ array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
129
+ );
130
+
131
+ $stmt = $pdo->query("SELECT * FROM user_tb");
132
+ while($row = $stmt -> fetch(PDO::FETCH_ASSOC)) {
133
+ $emails .= "[".$row["email"]."]";
134
+ $userids .= "[".$row["userid"]."]";
135
+ }
136
+
137
+ fu001($pdo, $emails);
138
+ //~~~省略~~~
139
+
140
+
141
+
142
+
143
+ }catch(PDOException $e){
144
+  exit("spl");
145
+ }
56
146
  ```