回答編集履歴
6
SQL文の見直し
answer
CHANGED
@@ -31,9 +31,9 @@
|
|
31
31
|
|
32
32
|
$mysqli = new mysqli('localhost', 'root', '', '');
|
33
33
|
$sql = <<<EOT
|
34
|
-
|
34
|
+
SELECT `user_id`, `user_name`, `address`, `pass`
|
35
|
-
|
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
見直し
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
加筆修正
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
見直し
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 = $
|
36
|
+
$stmt = $mysqli->prepare($sql);
|
33
|
-
$stmt->bind_param('is', $
|
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
加筆修正
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
見直し
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がおかしいのを直しましょう。
|