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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

Q&A

解決済

2回答

1555閲覧

PHPで編集画面に登録した情報を反映させたい

kyontama

総合スコア7

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

0グッド

0クリップ

投稿2020/03/10 05:58

前提・実現したいこと

いつもありがとうございます。
PHPで本の登録・編集・削除機能が存在するシステムを作っています。
登録した情報を、編集ボタンを押すことで編集フォームに情報を反映させたいです。

反映させたい情報は、
本の登録キー(id)
本のタイトル(title)
画像イメージ(image_url)
の3つです。

編集機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Fatal error: Uncaught Error: Call to undefined function h() in /home/ec2-user/environment/bookshelf/bookshelf_edit.php:2 Stack trace: #0 {main} thrown in /home/ec2-user/environment/bookshelf/bookshelf_edit.php on line 2

該当のソースコード

create_table_bookshelf.sql

CREATE TABLE books( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(100), image_url VARCHAR(100), status VARCHAR(10), created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP );

bookshelf_edit.php(編集フォーム)

php

1<?php 2 var_dump(h($id)); 3?> 4<!DOCTYPE html> 5<html lang="ja"> 6 <head> 7 <meta charset="uft-8"> 8 <title>Bookshelf | 簡単!あなたのオンライン本棚</title> 9 <link rel="stylesheet" href="bookshelf.css"> 10 </head> 11 <body> 12 <header> 13 <div id="header"> 14 <div id="logo"> 15 <a href="./bookshelf_index.php"><img src="./images/logo.png" alt="Bookshelf"></a> 16 </div> 17 <nav> 18 <a href="./bookshelf_form.php"><img src="./images/icon_plus.png" alt="">書籍編集</a> 19 </nav> 20 </div> 21 </header> 22 <div id="wrapper"> 23 <div id="main"> 24 <form action="bookshelf_index.php" method="post" class="form_book" enctype="multipart/form-data"> 25 <div class="book_title"> 26 <input type="text" name="book_title" placeholder="書籍タイトルを入力"> 27 </div> 28 <div class="book_image"> 29 <input type="file" name="book_image"> 30 </div> 31 <div class="book_submit"> 32 <input type="submit" name="submit_edit_book" value="再登録"> 33 </div> 34 </form> 35 </div> 36 </div> 37 <footer> 38 <small>2020 Bookshelf.</small> 39 </footer> 40 </body> 41</html>

bookshelf_index.php

php

1<?php 2 3 //表示データの無害化 htmlspecialcharsの関数化 4 function h($str){ 5 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 6 } 7 8 //MySQLサーバ接続に必要な値を変数に代入 9 $host = 'localhost'; 10 $username = 'root'; 11 $password = ''; 12 $db_name = 'bookshelf'; 13 14 //変数を設定して、MySQLサーバに接続 15 $database = mysqli_connect($host,$username,$password,$db_name); 16 17 //接続を確認し、接続できていない場合にはエラーを出力して終了 18 if($database == false){ 19 die('Connect Error (' . mysqli_connect_errno() . ')' . mysqli_connect_error()); 20 } 21 22 //MySQLにutf8で接続するための設定をする 23 $charset = 'utf8'; 24 mysqli_set_charset($database,$charset); 25 26 //ここにMysqlを使ったなんらかの処理を書く 27 28 //bookshelf_formから送られてくる書籍データの登録 29 if($_POST['submit_add_book']){ 30 31 //まずは送られてきた画像をuploadsフォルダに移動させる 32 $file_name = $_FILES['add_book_image']['name'];//アップロードさせるファイル名 33 $image_path = './uploads/' .$file_name;//アップロード先の場所 34 move_uploaded_file($_FILES['add_book_image']['tmp_name'], $image_path);//第一引数には移動前のパス、第二引数では移動先のパス 35 36 //データベースに書籍を新規登録する 37 $sql = 'INSERT INTO books (title, image_url, status) VALUES(?, ?, "unread")'; 38 $statement = mysqli_prepare($database, $sql); 39 mysqli_stmt_bind_param($statement,'ss', $_POST['add_book_title'],$image_path); 40 mysqli_stmt_execute($statement); 41 mysqli_stmt_close($statement); 42 43 } 44 45 //bookshelf_editに書籍データを送る 46 //もし編集(submit_book_edit)ボタンが押されたら 47 if($_POST['submit_book_edit']){ 48 49 $sql = 'SELECT * FROM WHERE id=?'; 50 $statement = mysqli_prepare($database,$sql); 51 mysqli_stmt_bind_param($statement,'i', $POST['book_id']); 52 mysqli_stmt_execute($statement); 53 mysqli_close($statement); 54 } 55 56 /*一部略*/ 57 58 //すべての書籍を取得する 59 $sql = 'SELECT * FROM books ORDER BY created_at DESC'; 60 61 //いずれかの$sqlを実行して$resultに代入する 62 $result = mysqli_query($database,$sql); 63 64 //MySQLを使った処理が終わると、接続は不要なので切断する 65 mysqli_close($database); 66 67?> 68 69<!DOCTYPE html> 70<html lang="ja"> 71 <head> 72 <meta charset="utf-8"> 73 <title>Bookshelf | 簡単!あなたのオンライン本棚</title> 74 <link rel="stylesheet" href="bookshelf.css"> 75 </head> 76 <body> 77 <!--ヘッダー(ロゴとメニュー)--> 78 <header> 79 <div id="header"> 80 <div id="logo"> 81 <a href="./bookshelf_index.php"><img src="./images/logo.png" alt="Bookshelf"></a> 82 </div> 83 <nav> 84 <a href="./bookshelf_form.php"><img src="./images/icon_plus.png" alt="">書籍登録</a> 85 </nav> 86 </div> 87 </header> 88 89 <!--カバー(最初に目に入るアイキャッチ)--> 90 <div id="cover"> 91 <h1 id="cover_title">カンタン!あなたのオンライン本棚</h1> 92 <form action="bookshelf_index.php" method="post"> 93 <div class="book_status unread active"> 94 <input type="submit" name="submit_only_unread" value="未読"><br> 95 <div class="book_count"><?php print h($count_unread);?></div> 96 </div> 97 <div class="book_status reading active"> 98 <input type="submit" name="submit_only_reading" value="読中"><br> 99 <div class="book_count"><?php print h($count_reading);?></div> 100 </div> 101 <div class="book_status finished active"> 102 <input type="submit" name="submit_only_finished" value="読了"><br> 103 <div class="book_count"><?php print h($count_finished);?></div> 104 </div> 105 </form> 106 </div> 107 108 <!--書籍一覧--> 109 <div class="wrapper"> 110 <div id="main"> 111 <div id="book_list" class="clearfix"> 112 <?php 113 //登録書籍の数だけ.book_itemを繰り返しはじめ 114 if($result){ 115 while($record = mysqli_fetch_assoc($result)){ 116 //1レコード分の値をそれぞれ変数に代入する 117 $id = $record['id']; 118 $title = $record['title']; 119 $image_url = $record['image_url']; 120 $status = $record['status']; 121 $created_at = $record['created_at']; 122 // $update_at = $record['updated_at']; 123 124 ?> 125 <div class="book_item"> 126 <div class="book_detail"> 127 <div class="book_title"> 128 <?php print h($title); ?> 129 </div> 130 131 <form action="bookshelf_index.php" method="post"> 132 <input type="hidden" name="book_id" value="<?php print h($id); ?>"> 133 <div class="book_delete"> 134 <input type="submit" name="submit_book_delete" value="削除する"><img src="images/icon_trash.png" alt="icon trash"> 135 </div> 136 </form> 137 <form action="bookshelf_edit.php" method="post"> 138 <input type="hidden" name="book_id" value="<?php print h($id); ?>"> 139 <input type="hidden" name="book_title" value="<?php print h($title); ?>"> 140 <input type="hidden" name="book_image_url" value="<?php print h($image_url); ?>"> 141 <div class="book_edit"> 142 <input type="submit" name="submit_book_edit" value="編集する"> 143 </div> 144 </form> 145 </div> 146 </div> 147 <?php //繰り返し終了 148 } 149 mysqli_free_result($result); 150 } 151 ?> 152 </div> 153 </div> 154 </div> 155 <footer> 156 <small>2020 Bookshelf.</small> 157 </footer> 158 </body> 159</html> 160

試したこと

POSTで編集フォーム(bookshelf_edit.php)に、hiddenで情報を飛ばすやり方で考えていました。
飛ばした後に、bookshelf_edit.phpでどのように表示させたらよいのか困っております。

<form action="bookshelf_edit.php" method="post"> <input type="hidden" name="book_id" value="<?php print h($id); ?>"> <input type="hidden" name="book_title" value="<?php print h($title); ?>"> <input type="hidden" name="book_image_url" value="<?php print h($image_url); ?>"> <div class="book_edit"> <input type="submit" name="submit_book_edit" value="編集する"> </div> </form>

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

PHP:7.2
FW:なし

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

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

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

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

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

guest

回答2

0

ベストアンサー

bookshelf_index.php
の中で定義している
function h()
を、
ファイルをまたいだ bookshelf_edit.php 上で
そのまま使えるような言語仕様ではありません。

解決方法として
その一、
bookshelf_edit.php
にも
function h()
の定義を置きます。
しかし、phpファイルで機能を追加するたびに
いちいち function h() の定義を書くのはめんどうです。

その二、
共通して使う関数として別途例えば
commons.php
などというファイル名にfunction h()の定義箇所を追い出します。

php

1<?php 2// filename: commons.php 3 //表示データの無害化 htmlspecialcharsの関数化 4 function h($str){ 5 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 6 }

その上で、
bookshelf_index.php
bookshelf_edit.php
それぞれの冒頭で require_once('commons.php'); の行を加えれば、
それぞれのphpで function h() が定義されて使えるようになります。

もしも function h() の定義を変更しても、
require_once('commons.php'); しているそれぞれのphpに反映されるので
便利です。

投稿2020/03/10 06:09

編集2020/03/10 07:25
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kyontama

2020/03/10 14:00

m6u様 早速ご回答いただき、ありがとうございます。 ・commons.phpで関数を共通化すること ・require_onceで共通関数を呼び出すこと 2点を抑えて今後実装にも活かさせていただきます。 非常に丁寧にご回答いただき感謝です。 本当にありがとうございました。
guest

0

この質問と起きてる問題は同じです。

投稿2020/03/10 06:21

m.ts10806

総合スコア80875

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

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

kyontama

2020/03/10 13:56

m.ts10806様 ご回答いただきありがとうございます。 require_onceで読み込みをする処理が抜けていました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問