今会員制サイトをphpで作っているのですが会員のIDと名前の変更するアップデート画面で問題が発生していて
画面上ではアップデートされているのですが、
データベース内容は
更新されていませんでした。
作ろうとしてるサイトはIDとパスワード
を入力して、入力されたIDとパスワードとデータベースに入ってるIDとパスワードを比較してログインします。
だから画面上では更新できても、
データベース内容は変わってないので
ログインできない状態です。
何故でしょうか?教えてください
}
?>
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
masaya_ohashiさんの回答のとおりですが、
初心者であろうと察して改善策を付け加えます。
PDOStatement::execute にあるような
「名前付きパラメータ」を使うと、パラメータのバインド順によるミスを防ぐことができるので、
多少手間がかかっても取り組んだほうが良いと思います。
php
1//$sql=$pdo->prepare('UPDATE user set user_id = ?, name = ? where pass = ? '); 2$sql=$pdo->prepare('UPDATE user set user_id = :id, name = :name where pass = :pass ');
php
1//$sql->execute( 2//[htmlspecialchars($_SESSION['userid']), 3//$_SESSION['pass'], $_SESSION['name']] 4//) 5$sql->execute([ 6 ':id' => htmlspecialchars($_SESSION['userid']), 7 ':name' => $_SESSION['name'], 8 ':pass' => $_SESSION['pass'], 9])
細かな話としては、
POSTで受信したパラメータのチェック処理と、
データベースアクセス処理は、
処理ブロックを明瞭に分けた方がコードの見通しが良くなりデバッグしやすくなります。
user_idとして使用する文字列に”や’や&が入ってしまう可能性を考慮して
htmlspecialchars($_SESSION['userid'])
なんてやっているのでしょうか。
html出力するときに文字化けを防ぐために使うのはわかるのですが。
そもそもuser_idに使いたくない文字があるのであれば、
POSTで受信したパラメータのチェック処理の中で点検してエラー報告するようにするべきです。
そのうえで、データベースに格納するときはhtmlspecialchars()は使わないものです。
「php 入力チェック 禁止文字」でネット検索すると事例はいくらでもあります。
投稿2017/12/08 08:04
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/11 09:28
0
executeに渡しているパラメータはuserid,pass,nameの順なのに、SQLの?の順番はuser_id,name,passになってます。passとnameが逆じゃないですか?
あと、UPDATEのwhereに使うのがpassだけって条件としておかしくないですか?
投稿2017/12/08 06:48
総合スコア9206
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/11 09:29
0
ベストアンサー
修正しました。
php
1<?php 2// PHPエラーを強制的に表示する 3ini_set('display_errors', true); 4error_reporting(E_ALL); 5 6// セッションスタート 7session_start(); 8 9// このページのロジックを見る限りSessionに代入する必要がない 10//if (isset($_POST['update'])) { 11// $_SESSION['userid'] = $_POST["userid"]; 12// $_SESSION['name'] = $_POST["name"]; 13//} 14 15function h($string) 16{ 17 return htmlspecialchars($string, ENT_QUOTES, 'utf-8'); 18} 19 20try { 21 $dsn = 'mysql:host=localhost;dbname=kakunabi;charset=utf8mb4'; 22 $db['user'] = "hoge"; 23 $db['pass'] = "1234"; 24 25 $pdo = new PDO($dsn, $db['user'], $db['pass']); 26 27 // PDOエラーを例外で処理する 28 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 29 30 // エラーチェックはSQLの処理の前に行うべき 31 $user_id = filter_input(INPUT_POST, 'user_id'); 32 $name = filter_input(INPUT_POST, 'name'); 33 $pass = filter_input(INPUT_POST, 'pass'); 34 $err = []; 35 if (is_null($user_id)) { 36 $err[] = 'ユーザIDが未入力です。'; 37 } 38 if (is_null($name)) { 39 $err[] = '新しい名前が未入力です。'; 40 } 41 if (is_null($pass)) { 42 $err[] = '新しいパスワードが未入力です。'; 43 } 44 45 if (count($err) === 0) { 46 // トランザクションスタート 47 $pdo->beginTransaction(); 48 49 // user_id が プライマリーキーであると仮定 50 $sql = 'UPDATE user set name = :name, pass = :pass where user_id = :user_id'; 51 $stmt = $pdo->prepare($sql); 52 53 // パラメータセット 54 $params = []; 55 $params['name'] = $name; 56 $params['pass'] = $pass; 57 $params['user_id'] = $user_id; 58 59 // UPDATE文を実行 60 $res = $stmt->execute($params); 61 $pdo->commit(); 62 } 63} catch (PDOException $e) { 64 $err[] = $e->getMessage(); 65} 66?> 67<html> 68 <body> 69 <?php if (count($err) > 0) : ?> 70 <?php foreach ($err as $error) : ?> 71 <p><?php h($error); ?></p> 72 <?php endforeach; ?> 73 <?php endif; ?> 74 <?php if (isset($res) && $res) : ?> 75 <p>更新に成功しました。</p> 76 <?php else: ?> 77 <p>更新に失敗しました。</p> 78 <?php endif; ?> 79 </body> 80</html>
投稿2017/12/11 11:52
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/12/13 01:12
退会済みユーザー
2017/12/13 01:27
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。