質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

1708閲覧

アップデートしたけど反映されません

maqtaro

総合スコア14

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/12/08 06:34

今会員制サイトをphpで作っているのですが会員のIDと名前の変更するアップデート画面で問題が発生していて
画面上ではアップデートされているのですが、
データベース内容は
更新されていませんでした。
作ろうとしてるサイトはIDとパスワード
を入力して、入力されたIDとパスワードとデータベースに入ってるIDとパスワードを比較してログインします。
だから画面上では更新できても、
データベース内容は変わってないので
ログインできない状態です。
何故でしょうか?教えてください

<html> <body> <?php session_start(); if (isset($_POST['update'])) { $_SESSION['userid'] = $_POST["userid"]; $_SESSION['name'] = $_POST["name"];

}
?>

<?php $dsn = 'mysql:host=localhost;dbname=kakunabi'; $db['user'] = "hoge"; $db['pass'] = "1234"; $pdo=new PDO($dsn, $db['user'], $db['pass']); // UPDATE文を実行 $sql=$pdo->prepare('UPDATE user set user_id = ?, name = ? where pass = ? '); if (empty($_SESSION['userid'])) { echo 'ユーザIDが未入力です。'; echo '<a href="up.php">戻る</a>'; } elseif (empty($_SESSION['name'])) { echo '新しい名前を入力してください。'; echo '<a href="up.php">戻る</a>'; } elseif($sql->execute( [htmlspecialchars($_SESSION['userid']), $_SESSION['pass'], $_SESSION['name']] )) { echo '更新に成功しました。'; echo '<a href="login.php">戻る</a>'; } else { echo '更新に失敗しました。'; echo '<a href="login.php">戻る</a>'; } $pdo->commit(); ?> </body> </html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/12/11 11:36

テーブルの定義を提示してください。
guest

回答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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maqtaro

2017/12/11 09:28

ありがとうございます。 言われたとおりに直したのですが 動きませんでした。 問題はデータベースに格納する所 で発生していると考えています。 (画面上ではアップデートされて いたので)すみませんでした。 -------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------- --------------------------------------アップデート用1--------------------------------------- -------------------------------------(入力フォームのみ)------------------------------------- -------------------------------------------------------------------------------------------- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title>変更画面</title> </head> <body> <div align="center" <?php echo $errorMessage ?>> <?php echo htmlspecialchars($errorMessage, ENT_QUOTES); ?> <form action="up2.php" method="POST"> <span style="background-color:#FFCCFF;">ユーザID:</span> <input type="text" name="userid" size="30" maxlength="20" placeholder="ユーザーIDを入力" value="<?php if (!empty($id)) {echo htmlspecialchars([$id], ENT_QUOTES);} ?>"> <br> <span style="background-color:#FFCCFF;"><label for="pass">名前:::</label></span> <input type="text" name="name" value="" size="30" maxlength="20" placeholder="名前を入力"> <br><br> <input style="background-color:#FFCCFF;" type="submit" name="login" value="ログイン" style="WIDTH: 200px; HEIGHT: 30px"> <br> </body> </html> -------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------- --------------------------------------アップデート用2--------------------------------------- ------------------------------------------(未完成)------------------------------------------ -------------------------------------------------------------------------------------------- <html> <body> <?php session_start(); if (isset($_POST['update'])) { $_SESSION['userid'] = $_POST["user_id"]; $_SESSION['name'] = $_POST["name"]; } ?> <?php $dsn = 'mysql:host=localhost;dbname=kakunabi'; $db['user'] = "hoge"; $db['pass'] = "1234"; $pdo=new PDO($dsn, $db['user'], $db['pass']); // UPDATE文を実行 $sql=$pdo->prepare("UPDATE user set user_id = ?, name = ? where pass = ?"); if (empty($_SESSION['userid'])) { echo 'ユーザIDが未入力です。'; echo '<a href="up.php">戻る</a>'; } elseif (empty($_SESSION['name'])) { echo '新しい名前を入力してください。'; echo '<a href="up.php">戻る</a>'; } else { $sql->bindValue(1,$_SESSION['userid']); $sql->bindValue(2,$_SESSION['pass']); $sql->bindValue(3,$_SESSION['name']); $sql->execute(); //$sql->execute(array($_SESSION['userid'], $_SESSION['pass'],$_SESSION['name'])); } //$pdo->commit(); ?> <?php print($_SESSION['userid'].','); print($_SESSION['pass'].','); print($_SESSION['name'].','); echo '<a href="login.php">戻る</a>'; ?>
guest

0

executeに渡しているパラメータはuserid,pass,nameの順なのに、SQLの?の順番はuser_id,name,passになってます。passとnameが逆じゃないですか?
あと、UPDATEのwhereに使うのがpassだけって条件としておかしくないですか?

投稿2017/12/08 06:48

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maqtaro

2017/12/11 09:29

ありがとうございます。 言われたとおりに直したのですが 動きませんでした。 問題はデータベースに格納する所 で発生していると考えています。 (画面上ではアップデートされて いたので)すみませんでした。 -------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------- --------------------------------------アップデート用1--------------------------------------- -------------------------------------(入力フォームのみ)------------------------------------- -------------------------------------------------------------------------------------------- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title>変更画面</title> </head> <body> <div align="center" <?php echo $errorMessage ?>> <?php echo htmlspecialchars($errorMessage, ENT_QUOTES); ?> <form action="up2.php" method="POST"> <span style="background-color:#FFCCFF;">ユーザID:</span> <input type="text" name="userid" size="30" maxlength="20" placeholder="ユーザーIDを入力" value="<?php if (!empty($id)) {echo htmlspecialchars([$id], ENT_QUOTES);} ?>"> <br> <span style="background-color:#FFCCFF;"><label for="pass">名前:::</label></span> <input type="text" name="name" value="" size="30" maxlength="20" placeholder="名前を入力"> <br><br> <input style="background-color:#FFCCFF;" type="submit" name="login" value="ログイン" style="WIDTH: 200px; HEIGHT: 30px"> <br> </body> </html> -------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------- --------------------------------------アップデート用2--------------------------------------- ------------------------------------------(未完成)------------------------------------------ -------------------------------------------------------------------------------------------- <html> <body> <?php session_start(); if (isset($_POST['update'])) { $_SESSION['userid'] = $_POST["user_id"]; $_SESSION['name'] = $_POST["name"]; } ?> <?php $dsn = 'mysql:host=localhost;dbname=kakunabi'; $db['user'] = "hoge"; $db['pass'] = "1234"; $pdo=new PDO($dsn, $db['user'], $db['pass']); // UPDATE文を実行 $sql=$pdo->prepare("UPDATE user set user_id = ?, name = ? where pass = ?"); if (empty($_SESSION['userid'])) { echo 'ユーザIDが未入力です。'; echo '<a href="up.php">戻る</a>'; } elseif (empty($_SESSION['name'])) { echo '新しい名前を入力してください。'; echo '<a href="up.php">戻る</a>'; } else { $sql->bindValue(1,$_SESSION['userid']); $sql->bindValue(2,$_SESSION['pass']); $sql->bindValue(3,$_SESSION['name']); $sql->execute(); //$sql->execute(array($_SESSION['userid'], $_SESSION['pass'],$_SESSION['name'])); } //$pdo->commit(); ?> <?php print($_SESSION['userid'].','); print($_SESSION['pass'].','); print($_SESSION['name'].','); echo '<a href="login.php">戻る</a>'; ?>
guest

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

横から失礼します、prepare()からexecute()までの流れで、名前付きパラメータを配列キーに与えるときに「$params[':name'] = $name;」などとしなくても良かったんでしょうか? 参考: http://php.net/manual/ja/pdostatement.execute.php
退会済みユーザー

退会済みユーザー

2017/12/13 01:27

あ、コロンが抜けちゃってますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問