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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

1回答

1819閲覧

掲示板で投稿を編集する際、データベースから指定された番号の名前だけ取り出し投稿フォームに表示したい。

MakotoIshizawa

総合スコア32

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

0クリップ

投稿2019/12/04 09:15

編集2019/12/04 09:21

php5.2.4(指定による)
テキスト保存で作った掲示板を今度はMySQLに保存する形の課題に取り組んでいます。
編集機能の作成をしていますが、
編集番号をpost送信すると、投稿用フォームに名前とコメントが表示されるようにしたいです。
現在作業中なのは名前の表示で、今はこの問題だけ解決したいです。
それができればコメントもできるだろうと考えています。

表示されるエラーはNotice: Undefined index: name 省略 on line 54
調べてみると未定義の変数のようですが、なぜ出るのかわかりません。
54行目は$edit_name = $edit_select['name'];のところです。

サーバー情報は伏せてあります。
テーブルの項目はnum,name,comment,date,passwordです。
現在途中のため保存内容は名前とコメントのみで、行番号は自動で増える形を取っています。

php

1<?php 2ini_set( "display_errors", 1 ); 3error_reporting( E_ALL ); 4//変数の定義 5$name = filter_input( INPUT_POST, "name" ); //投稿者の名前 6$comment = filter_input( INPUT_POST, "comment" ); //投稿したコメント 7$delete_no = filter_input( INPUT_POST, "delete_no" ); //削除指定番号 8$edit_no = filter_input( INPUT_POST, "edit_no" ); //編集指定番号 9$edit_decision = filter_input( INPUT_POST, "edit_decision" ); //投稿と編集の判別用のhidden送信 10$password = filter_input( INPUT_POST, "password" ); //送信するpassword 11$check_password = filter_input( INPUT_POST, "check_password" ); //照合するパスワード 12$date = date( "Y-m-d H:i:s" ); //投稿日時 13$replace_search = array( "\r\n", "\r", "\n" ); //置き換えのための改行コードの検索 14$replace = array( "<<改行win>>", "<<改行mac>>", "<<改行unix>>" ); //改行コードを置き換える文字 15$replace_name = str_replace( $replace_search, $replace, $name ); //改行を置き換えた名前 16$replace_comment = str_replace( $replace_search, $replace, $comment ); //改行を置き換えられたコメント 17//MySQL接続情報 18$servername = ""; 19$username = ""; 20$serverpassword = ""; 21$dbname = ""; 22//編集時の表示用名前とコメントの初期化 23$edit_name = ""; 24//書き込み内容のsql文 25$insert_sql = "INSERT INTO toko( 26name, comment 27) VALUES ( 28'$replace_name', '$replace_comment' 29)"; 30//削除のsql文 31$delete_sql = "DELETE FROM toko WHERE num='$delete_no'"; 32//データベースに接続 33try { 34 $db = new PDO( "mysql:dbname=$dbname;host=$servername;charset=utf8mb4", $username, $serverpassword, [ 35 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 36 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 37 ] ); 38 //投稿機能 39 if ( !empty( $name ) && !empty( $comment ) ) { 40 $insert = $db->query( $insert_sql ); //書き込みsql実行 41 //リロードし二重書き込み防止 42 header( 'Location: keijiban_mysql.php', true, 303 ); 43 exit; 44 } 45 //削除機能 46 elseif ( !empty( $delete_no ) ) { 47 $delete = $db->query( $delete_sql ); 48 } 49 //編集番号指定 50 elseif ( !empty( $edit_no ) ) { 51 $edit_select = $db->prepare("SELECT * FROM toko WHERE num = '$edit_no'"); 52$edit_select->execute(); 53$edit_select = $edit_select->fetchAll(PDO::FETCH_ASSOC); 54$edit_name = $edit_select['name']; 55 echo $edit_name; 56 } 57} catch ( PDOException $e ) { 58 print( "エラー:" . $e->getmessage() ); 59 die(); 60 //リロードし二重書き込み防止 61 header( 'Location: keijiban_mysql.php', true, 303 ); 62 exit; 63} 64?> 65<!doctype html> 66<html lang="ja"> 67<head> 68<meta charset="utf-8"> 69<title>簡易掲示板MySQL保存版</title> 70<script> 71window.addEventListener('DOMContentLoaded', function(){ 72document.querySelector('#delbtn').addEventListener('click',function(e){ 73if(!confirm('本当に削除しますか?')){ 74alert('キャンセルされました'); 75e.preventDefault(); 76} 77}); 78}); 79</script> 80<style> 81.akaji { 82 color : red; 83} 84.komoji { 85 font-size: 0.8em; 86} 87</style> 88</head> 89<body> 90<?php 91//XSS対策 92function h( $str ) { 93 return nl2br( htmlspecialchars( $str, ENT_QUOTES, 'UTF-8' ) ); 94} 95//改行の置き換え 96$replace_seach = array( "<<改行win>>", "<<改行mac>>", "<<改行unix>>" ); //改行の置き換え文字の検索 97$replace = array( "\r\n", "\r", "\n" ); //改行コードへの置き換え 98/*$replace_edit_name = str_replace( $replace_search, $replace, $edit_name);//改行コードに置き換えられた編集時の表示用の名前 99$replace_edit_comment = str_replace( $replace_search, $replace, $edit_comment );//改行コードに置き換えられた編集時の表示用のコメント*/ 100?> 101 102<!--投稿フォーム--> 103<form method="post" > 104 <label for="name">お名前<span class="akaji">【必須】</span></label> 105 <br> 106 <input type="text" name="name" id="name" required="required" value="<?php echo $edit_name; ?>" > 107 <br> 108 <label for="comment">コメント<span class="akaji">【必須】</span></label> 109 <br> 110 <textarea name="comment" cols="30" rows="3" id="comment" required="required"></textarea> 111 <br> 112 <input type="submit" value="投稿"> 113</form> 114<br> 115<!--削除番号指定用フォーム--> 116<form method="post" name="delete"> 117 <label for="delete_no">削除対象番号</label> 118 <br> 119 <input type="number" name="delete_no" id="delete_no" required="required"> 120 <br> 121 <input type="submit" value="削除" name="btn" id="delbtn"> 122</form> 123 <br> 124<!--編集番号指定用フォーム--> 125<form method="post"> 126 <label for="edit_no">編集対象番号(半角)</label> 127 <br> 128 <input type="number" name="edit_no" id="edit_no" required="required"> 129 <br> 130 <input type="submit" value="編集"> 131</form> 132<br> 133<?php 134//投稿内容の表示 135try { 136 //テーブルの行数取得 137 $sql = 'select count(*) from toko'; 138 $count = $db->query( $sql ); 139 $count = $count->fetchColumn(); 140 141 142 $select = "SELECT * FROM toko"; //テーブルデータの取得のクエリ 143 $select = $db->query( $select ); //クエリの実行 144 145 if ( $count == 0 ) { 146 echo "<p>投稿はまだありません</p>"; 147 } else { 148 foreach ( $select as $row ) { //ループして表示 149 echo "<span class='komoji'>No</span>:" . h( $row[ 'num' ] ) . "&emsp;&emsp;" . 150 "<span class='komoji'>名前</span>: " . h( $row[ 'name' ] ) . "<br>" . h( $row[ 'comment' ] ) . "<br>" . h( $row[ 'date' ] ) . "<br>"; 151 } 152 } 153 154} catch ( PDOException $e ) { 155 print( "表示エラー:" . $e->getmessage() ); 156 die(); 157} 158 159?> 160</body> 161</html> 162

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

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

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

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

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

guest

回答1

0

ベストアンサー

$edit_select = $edit_select->fetchAll(PDO::FETCH_ASSOC);

であれば$edit_selectは配列ですね
なので「$edit_select['name']」を参照してもヒットしません
たぶん・・・

PHP

1$edit_select = $edit_select->fetchAll(PDO::FETCH_ASSOC); 2$edit_name = $edit_select[0]['name']; 3もしくは 4$edit_select = $edit_select->fetch(PDO::FETCH_ASSOC); 5$edit_name = $edit_select['name']; 6

投稿2019/12/04 09:19

yambejp

総合スコア114773

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

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

MakotoIshizawa

2019/12/04 09:40

ありがとうございます。 最初に提案していただいたコードで出来ました。 この[0]を加えるのはどういう意味があるのどしょうか。 参考ページか解説して頂けると助かります。 二番目のコードは元のコードと同じですよね? 配列であるということでfoeachでとりだしてみたりもして、それもうまくいきました。 最終的には[0]を加えたものを使わせて頂きました。 まだ、基本的なことの理解が足りていないようです。 助かりました。
MakotoIshizawa

2019/12/04 09:41

0番目の配列ということでしょうか?
yambejp

2019/12/04 09:44

> この[0]を加えるのはどういう意味があるのどしょうか。 回答に書いてあるとおりfetchAllするとSQLからの戻り値を キーが0から始まる配列として保持します。 最初のデータを指定する場合は[0]をつければよいのは配列の普通の使い方です。 > 二番目のコードは元のコードと同じですよね? fetchAllじゃなくてfetchしているので、最初の戻り値だけ拾ってます
MakotoIshizawa

2019/12/04 09:47

ああ、見落としました。 ありがとうございます。 勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問