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

回答編集履歴

6

SQL文の見直し

2020/01/20 02:37

投稿

退会済みユーザー
answer CHANGED
@@ -31,9 +31,9 @@
31
31
 
32
32
  $mysqli = new mysqli('localhost', 'root', '', '');
33
33
  $sql = <<<EOT
34
- select user_id, user_name, address, pass
34
+ SELECT `user_id`, `user_name`, `address`, `pass`
35
- from user_data
35
+ FROM `user_data`
36
- WHERE user_id = ? AND pass = ?
36
+ WHERE `user_id` = ? AND `pass` = ?
37
37
  EOT;
38
38
  $stmt = $mysqli->prepare($sql);
39
39
  $stmt->bind_param('is', $u_id, $pass); // $userがintのつもり、stringなら'ss'を指定

5

見直し

2020/01/20 02:37

投稿

退会済みユーザー
answer CHANGED
@@ -26,6 +26,8 @@
26
26
  ```php
27
27
  $u_id = $_POST["user_id"];
28
28
  $pass = $_POST["pass"];
29
+ // このあたりに、$u_id や $pass に不正な文字や不適切な文字が含まれていないかを
30
+ // 検証する処理を置くこと。
29
31
 
30
32
  $mysqli = new mysqli('localhost', 'root', '', '');
31
33
  $sql = <<<EOT
@@ -36,7 +38,7 @@
36
38
  $stmt = $mysqli->prepare($sql);
37
39
  $stmt->bind_param('is', $u_id, $pass); // $userがintのつもり、stringなら'ss'を指定
38
40
  $result = $stmt->execute();
39
- while ($row = $result->fetch_array(MYSQLI_ASSOC)){
41
+ while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
40
42
  echo $row['user_id']. '<br />';
41
43
  echo $row['user_name']. '<br />';
42
44
  echo $row['address']. '<br />';

4

加筆修正

2020/01/20 02:25

投稿

退会済みユーザー
answer CHANGED
@@ -43,4 +43,10 @@
43
43
  echo $row['pass']. '<br />';
44
44
  }
45
45
  ```
46
- (あくまで机上、テストしてない。そして変数名とか勝手に直しといた)
46
+ (あくまで机上、テストしてない。そして変数名とか勝手に直しといた)
47
+
48
+ あと、DBに格納されている文字列をhtml出力するのに、
49
+ [htmlspecialchars](https://www.php.net/manual/ja/function.htmlspecialchars.php)()を使うことや、
50
+ パスワード文字列を生のままデータベース上に保存したり比較したりするのではなく、
51
+ 例えば [password_hash](https://www.php.net/manual/ja/function.password-hash.php)() で加工して保持したものを、
52
+ [password_verify](https://www.php.net/manual/ja/function.password-verify.php)() を使ってフォーム入力値と比較するということはよく見かけます。

3

見直し

2020/01/20 02:22

投稿

退会済みユーザー
answer CHANGED
@@ -24,19 +24,23 @@
24
24
  GROUP BYがおかしいのを直しましょう。
25
25
 
26
26
  ```php
27
+ $u_id = $_POST["user_id"];
28
+ $pass = $_POST["pass"];
29
+
30
+ $mysqli = new mysqli('localhost', 'root', '', '');
27
31
  $sql = <<<EOT
28
32
  select user_id, user_name, address, pass
29
33
  from user_data
30
34
  WHERE user_id = ? AND pass = ?
31
35
  EOT;
32
- $stmt = $new_mysqli->prepare($sql);
36
+ $stmt = $mysqli->prepare($sql);
33
- $stmt->bind_param('is', $user, $pass); // $userがintのつもり、stringなら'ss'を指定
37
+ $stmt->bind_param('is', $u_id, $pass); // $userがintのつもり、stringなら'ss'を指定
34
38
  $result = $stmt->execute();
35
- while($row = $result->fetch_array(MYSQLI_ASSOC)){
39
+ while ($row = $result->fetch_array(MYSQLI_ASSOC)){
36
40
  echo $row['user_id']. '<br />';
37
41
  echo $row['user_name']. '<br />';
38
42
  echo $row['address']. '<br />';
39
43
  echo $row['pass']. '<br />';
40
44
  }
41
45
  ```
42
- (あくまで机上、テストしてない)
46
+ (あくまで机上、テストしてない。そして変数名とか勝手に直しといた

2

加筆修正

2020/01/20 02:19

投稿

退会済みユーザー
answer CHANGED
@@ -21,4 +21,22 @@
21
21
 
22
22
  query() を使って fetch_array() する場面でエラーになるのは、
23
23
  query() に失敗しているためなので、
24
- GROUP BYがおかしいのを直しましょう。
24
+ GROUP BYがおかしいのを直しましょう。
25
+
26
+ ```php
27
+ $sql = <<<EOT
28
+ select user_id, user_name, address, pass
29
+ from user_data
30
+ WHERE user_id = ? AND pass = ?
31
+ EOT;
32
+ $stmt = $new_mysqli->prepare($sql);
33
+ $stmt->bind_param('is', $user, $pass); // $userがintのつもり、stringなら'ss'を指定
34
+ $result = $stmt->execute();
35
+ while($row = $result->fetch_array(MYSQLI_ASSOC)){
36
+ echo $row['user_id']. '<br />';
37
+ echo $row['user_name']. '<br />';
38
+ echo $row['address']. '<br />';
39
+ echo $row['pass']. '<br />';
40
+ }
41
+ ```
42
+ (あくまで机上、テストしてない)

1

見直し

2020/01/20 02:09

投稿

退会済みユーザー
answer CHANGED
@@ -17,4 +17,8 @@
17
17
  execute()
18
18
  bind_result()
19
19
  fetch()
20
- の流れを真似して実装を見直してください。
20
+ の流れを真似して実装を見直してください。
21
+
22
+ query() を使って fetch_array() する場面でエラーになるのは、
23
+ query() に失敗しているためなので、
24
+ GROUP BYがおかしいのを直しましょう。