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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

解決済

3回答

2367閲覧

使用者IDの更新処理を行いたい

dashu_sena

総合スコア2

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

0グッド

0クリップ

投稿2020/06/08 08:02

編集2020/06/08 12:12

前提・実現したいこと

アカウント設定画面にて使用者IDの更新処理を行いたい。
会員管理TBに会員IDを更新後、関連あるお問い合わせ履歴TBは会員管理TBを参照して、会員IDを更新処理を行います。

使用者IDの更新な機能を実装中に以下のエラーメッセージが発生しました。

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\PHP\pleiades\xampp\htdocs\test_mailform\PHPsouce\accountSetting.php on line 63 Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\PHP\pleiades\xampp\htdocs\test_mailform\PHPsouce\accountSetting.php on line 73

該当のソースコード

アカウント設定画面

PHP

1<?php 2session_start(); 3require ('../dbconnect.php'); 4require ('../PHPsouce/accountSetting.php'); 5 6?> 7<!DOCTYPE html> 8<html lang="ja"> 9<head> 10 <meta charset = "utf-8"> 11 <title>メールフォーム</title> 12</head> 13<body> 14 <div class = "all"> 15 <div class = "header"></div> 16 <div class = "header_title"> 17 <h1>メールフォーム</h1> 18 </div> 19 <div style="text-align: right"><a href="../logout.php">ログアウト</a></div> 20 <div class = "content"> 21 <ul> 22 <li><a href="http://s-yamauchi.heteml.net/mbms_version1/top.php">TOP</a></li> 23 <li><a href="javascript:window.open('http://s-yamauchi.heteml.net/mbms_version1/form/index.php','お問い合わせ','width=700, height=1080, menubar=no, toolbar=no, scrollbars=yes');">入力フォーム</a></li> 24 <li><a href="http://s-yamauchi.heteml.net/mbms_version1/accountSetting/index.php">アカウント設定</a></li> 25 </ul> 26 </div> 27 <div class = "main"> 28 <div class = "main_title"> 29 <p>使用者ID、またはパスワード変更する際、以下のフォーム欄を入力し、最後「変更」ボタンを押下して下さい。</p> 30 <p>変更したい部分だけを入力してください。</p> 31 </div> 32 <div class = "main_part"> 33 <form action="" method="post"> 34 <dl> 35 <dt>使用者ID</dt> 36 <?php if (array_key_exists('change',$_POST)):?> 37 <?php if (array_key_exists('before_id', $error)):?> 38 <?php if ($error['before_id'] == 'false'):?> 39 <p class="error">* ログイン中使用者IDとは一致していません。</p> 40 <?php endif; ?> 41 <?php endif; ?> 42 <?php if (array_key_exists('after_id', $error)):?> 43 <?php if ($error['after_id'] == 'double'):?> 44 <p class="error">* 入力した使用者IDは既に利用されています。</p> 45 <?php endif;?> 46 <?php endif;?> 47 <?php if (array_key_exists('check_id',$error)):?> 48 <?php if ($error['check_id'] == 'false'):?> 49 <p class="error">* 入力した使用者IDが一致していません。</p> 50 <?php endif; ?> 51 <?php endif; ?> 52 <?php endif; ?> 53 <dd> 54 <p>現在の使用者ID</p> 55 <input type = "text" name = "before_id" size="35" maxlength="255" value = ""> 56 <p>新しい使用者ID</p> 57 <input type = "text" name = "after_id" size="35" maxlength="255" value = "" > 58 <p>新しい使用者ID(確認用)</p> 59 <input type = "text" name = "check_id" size="35" maxlength="255" value = "" > 60 <p></p> 61 </dd> 62 <dt>パスワード</dt> 63 <?php if (array_key_exists('change',$_POST)):?> 64 <?php if (array_key_exists('before_password',$_POST)):?> 65 <?php if (array_key_exists('before_password',$error)):?> 66 <?php if ($error['before_password'] == 'false'):?> 67 <p class="error">* 入力した現在のパスワードが間違っています。</p> 68 <?php endif; ?> 69 <?php endif; ?> 70 <?php endif; ?> 71 <?php if (array_key_exists('check_password',$_POST)):?> 72 <?php if (array_key_exists('check_password',$error)):?> 73 <?php if ($error['check_password'] == 'false'):?> 74 <p class="error">* 入力した新しいパスワードが一致していません。</p> 75 <?php endif; ?> 76 <?php endif; ?> 77 <?php endif; ?> 78 <?php endif; ?> 79 <dd> 80 <p>現在のパスワード</p> 81 <input type = "password" name = "before_password" size = "35" maxlength = "255" value = "" > 82 <p>新しいパスワード</p> 83 <input type = "password" name = "after_password" size = "35" maxlength = "255" value = "" > 84 <p>新しいパスワード(確認用)</p> 85 <input type = "password" name = "check_password" size = "35" maxlength = "255" value = "" > 86 <p></p> 87 </dd> 88 </dl> 89 <input type="submit" name = "change" id = "change" value="変更"> 90 </form> 91 </div> 92 </div> 93 </div> 94</body> 95</html>

/PHPSouce/accountSetting.php

PHP

1<?php 2if (!empty($_POST)){ 3 4 //ログイン中会員情報取得sql文 5 $sql1 = sprintf('SELECT member_id as input_id, member_pass as password FROM m_member where member_id = "%s"', 6 mysqli_real_escape_string($db,$_SESSION['member_id']) 7 ); 8 9 //SQL文を実行処理に代入 10 $query1 = mysqli_query($db, $sql1); 11 12 //実行した結果をセット 13 $row1 = mysqli_fetch_assoc($query1); 14 15 //現在使用者ID、または現在のパスワード 16 //現在使用者IDが入力された場合 17 if (!empty($_POST['before_id'])){ 18 19 //入力した値を変数に格納 20 //使用者ID 21 $input_BeforeID = mysqli_real_escape_string($db, $_POST['before_id']); 22 $input_AfterID = mysqli_real_escape_string($db, $_POST['after_id']); 23 $input_CheckID = mysqli_real_escape_string($db, $_POST['check_id']); 24 25 26 //入力チェック 27 //現在の使用者IDとログイン中使用者IDの一致チェック 28 if ($row1['input_id'] != $_POST['before_id']){ 29 $error['before_id'] = 'false'; 30 } 31 32 //新しい使用者IDが入力された場合 33 if ($_POST['after_id'] != '') { 34 35 //重複登録チェック 36 $sql01 = sprintf('SELECT count(*) as cnt FROM m_member WHERE member_id = "%s"',$input_AfterID); 37 $query01 = mysqli_query($db, $sql01); 38 $row01 = mysqli_fetch_assoc($query01); 39 40 if ( $row01 == 1) { 41 $error ['after_id'] = 'double'; 42 } 43 if ( $_POST['after_id'] != $_POST['check_id']) { 44 $error['check_id'] = 'false'; 45 } 46 } 47 48 //エラーがなかった場合、使用者IDの更新を行う 49 if (empty($error['before_id']) && empty($error['check_id']) && empty($error['after_id'])) { 50 51 //更新用変数 52 $UPdate_BeforeID =$input_BeforeID; 53 $UPdate_AfterID =$input_AfterID; 54 55 //会員情報Tbを更新 56 //使用者IDの更新SQL文を用意 57 $sql2 = sprintf('UPDATE m_member SET member_id = "%s" WHERE member_id = "%s"', $UPdate_BeforeID,$UPdate_AfterID); 58 59 //SQL文を実行処理に代入 60 $query2 = mysqli_query($db, $sql2); 61 62 //実行した結果をセット 63 $row2 = mysqli_fetch_assoc($query2); 64 65 //申込履歴TB更新 66 //申込履歴一覧更新SQL文を用意 67 $sql4 = sprintf('UPDATE h_form h SET h.member_id = ( SELECT member_id FROM m_member m where m.member_id = "%s") WHERE EXISTS ( SELECT 1 FROM m_member mm WHERE mm.member_name = h.member_nm )',$input_AfterID); 68 69 //SQL文を実行処理に代入 70 $query4 = mysqli_query($db, $sql4); 71 72 //実行した結果をセット 73 $row4 = mysqli_fetch_assoc($query4); 74 75 } 76 } 77 78 //現在のパスワードが入力された場合 79 if (!empty($_POST['before_password'])) { 80 81 //会員IDを変数に格納 82 $updatePass_memberID = mysqli_real_escape_string($db,$_SESSION['member_id']); 83 84 //入力したパスワードを変数に格納 85 $input_BeforePass = mysqli_real_escape_string($db, sha1($_POST['before_password'])); 86 87 88 //パスワード桁数用 89 $input_AfterPassLen = strlen($_POST['after_password']); 90 $input_CheckPassLen = strlen($_POST['check_password']); 91 92 //登録された現在パスワードと一致するかを確認 93 if ($input_BeforePass != $row1['password']) { 94 $error['before_password'] = 'false'; 95 } 96 97 //新しいパスワードと新しいパスワード(確認用)の桁数チェック 98 if ($input_AfterPassLen <4){ 99 $error['after_password'] = 'length'; 100 } 101 if ($input_CheckPassLen<4){ 102 $error['check_password'] = 'length'; 103 } 104 105 //新しいパスワードと新しいパスワード(確認用)一致チェック 106 if ($_POST['after_password'] != $_POST['check_password']) { 107 $error['check_password'] = 'false'; 108 } 109 110 //エラーがなかった場合、パスワードの更新処理を行う 111 if ((empty($error['before_password'])) && (empty($error['after_password'])) && (empty($error['check_password']))) { 112 113 //更新用暗号化パスワード 114 $input_AfterPassMask = mysqli_real_escape_string($db, sha1($_POST['after_password'])); 115 116 //パスワードの更新SQL文を用意する 117 $sql3 = sprintf('UPDATE m_member SET member_pass = "%s" WHERE member_id = "%s"',$input_AfterPassMask,$updatePass_memberID); 118 119 //SQL文を実行処理に代入 120 $query3 = mysqli_query($db, $sql3) or die (mysqli_error($db)); 121 122 //実行した結果をセット 123 $row3 = mysqli_fetch_assoc($query3); 124 125 126 //アカウント設定変更完了画面へ遷移 127 header('Location: complete.php'); 128 exit; 129 } 130 } 131} 132?>

試したこと

代入する引数を事前に変数宣言を行う。

$input_BeforeID = mysqli_real_escape_string($db, $_POST['before_id']);
$input_AfterID = mysqli_real_escape_string($db, $_POST['after_id']);
$input_CheckID = mysqli_real_escape_string($db, $_POST['check_id']);

補足情報(FW/ツールのバージョンなど)

Eclipse(4.4.2)
XAMPP(3.2.1)
Windows 10

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

//会員情報Tb更新SQL文を実行
$stmt2->execute();

//実行結果を変数に格納 $row2 = mysqli_stmt_result_metadata($stmt2); //お問い合わせ履歴TB更新SQLを準備 $sql4 = sprintf('UPDATE h_form h SET h.member_id = ( SELECT member_id FROM m_member m where m.member_id = "%s") WHERE EXISTS ( SELECT 1 FROM m_member mm WHERE mm.member_name = h.member_nm )',$input_AfterID); $stmt4 = $db->prepare($sql4); //SQL文を実行 $stmt4->execute(); //実行結果を変数に格納 $row4 = mysqli_stmt_result_metadata($stmt4);

投稿2020/06/08 14:42

dashu_sena

総合スコア2

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

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

0

自己解決

//会員管理TBを更新SQLを準備
$sql2 = sprintf('UPDATE m_member SET member_id = "%s" WHERE id = "%d"', $UPdate_AfterID,$_SESSION['id']);
$stmt2 = $db->prepare($sql2);

//SQL文を実行
$stmt2->execute();

//実行結果を変数に格納
$row2 = mysqli_stmt_result_metadata($stmt2);

//お問い合わせ履歴TB更新SQLを準備
$sql4 = sprintf('UPDATE h_form h SET h.member_id = ( SELECT member_id FROM m_member m where m.member_id = "%s") WHERE EXISTS ( SELECT 1 FROM m_member mm WHERE mm.member_name = h.member_nm )',$input_AfterID);
$stmt4 = $db->prepare($sql4);

//SQL文を実行
$stmt4->execute();

//実行結果を変数に格納
$row4 = mysqli_stmt_result_metadata($stmt4);

投稿2020/06/08 14:39

dashu_sena

総合スコア2

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

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

0

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\PHP\pleiades\xampp\htdocs\test_mailform\PHPsouce\accountSetting.php on line 53

mysqli_fetch_assocの関数の引数にmysqli_resultを要求してるけど、boolean型の値が渡されました。って書いてます。

53行目なので

php

1 //会員情報Tbを更新 2 //使用者IDの更新SQL文を用意 3 $sql2 = sprintf('UPDATE m_member SET member_id = "%s" WHERE id = "%d" and member_id = "%s"',$input_AfterID , $_SESSION['id'], $input_BeforeID); 4 5 //SQL文を実行処理に代入 6 $query2 = mysqli_query($db, $sql2) or die(mysqli_errno($db)); // ここが53行目 7 8 //実行した結果をセット 9 $row2 = mysqli_fetch_assoc($query2);

$query2 = mysqli_query($db, $sql2) or die(mysqli_errno($db));
の結果でtrueが帰ってるのではないかと思います。

mysqli_query

失敗した場合に FALSE を返します。 SELECT, SHOW, DESCRIBE あるいは EXPLAIN が成功した場合は、mysqli_query() は mysqli_result オブジェクトを返します。それ以外のクエリが成功した場合は、 mysqli_query() は TRUE を返します。

なので

php

1 //実行した結果をセット 2 $row2 = mysqli_fetch_assoc($query2);

をしてはいけません

投稿2020/06/08 09:48

編集2020/06/08 10:49
rururu3

総合スコア5545

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

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

dashu_sena

2020/06/08 10:36 編集

回答していただきありがとうございます。 現在の状況では、 $query1 = mysqli_query($db, $sql1);の結果ですが、TRUEで帰ってきましたが、 なぜかmysqli_fetch_assocところにセットすると、NULLとなっていました。 ネットでUPDATE処理を調べると、やはりprepareとexecuteで書くのは多いです。 ただ、mysqli_executeが非推奨となっているので、どうすればいいですか...? また、実行結果を判定処理使いたいので、なにか変数に格納必要がありますか?
rururu3

2020/06/08 10:44

$query1 = mysqli_query($db, $sql1); の結果がtrueですか?
rururu3

2020/06/08 10:46

って、よく見たら53行目だからupdate部分か… ちょっと書き直します
dashu_sena

2020/06/08 12:07

失礼しました。 展開しておりました。 ソースを書き直していたします。 エラー文も修正いたします。
dashu_sena

2020/06/08 12:15

改めてソースを修正いたしました。 エラー発生部分が63と73行目になります。 会員管理TBに会員IDを更新後、関連にあるお問い合わせ履歴TBも会員IDを更新を行うというイメージ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問