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

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

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

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

2531閲覧

phpでデータの追加

moka-kuro

総合スコア3

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/04/13 06:44

前提・実現したいこと

php初心者です。ご教授お願い致します。
dbを操作し、自分で入力した「商品」と「値段」を追加してhtmlで表示したいです。エラーメッセージが出てますが、もう一度表示すると正常になります。どこを修正すればいいのでしょうか。
以下の画像が参考です。
イメージ説明

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

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

Fatal error: Uncaught TypeError: mysqli_fetch_array(): Argument #1 ($result) must be of type mysqli_result, bool given in C:\xampp\htdocs\test\test18.php:29 Stack trace: #0 C:\xampp\htdocs\test\test18.php(29): mysqli_fetch_array(true) #1 {main} thrown in C:\xampp\htdocs\test\test18.php on line 29

該当のソースコード

<?php $syohin = ''; if(isset($_POST['syohin']) === TRUE){ $syohin = $_POST['syohin']; } $nedan = ''; if(isset($_POST['nedan']) === TRUE){ $nedan = $_POST['nedan']; } $syohin_data = []; $host = 'localhost'; $username = 'root'; $passwd = ''; $dbname = 'sample'; $link = mysqli_connect($host, $username, $passwd, $dbname); if ($link) { mysqli_set_charset($link, 'utf8'); $query = "SELECT * FROM good_table"; if($syohin !== ""){ $query = "INSERT INTO good_table(good_name, good_price) VALUES('$syohin', '$nedan')"; } $result = mysqli_query($link, $query); while ($row = mysqli_fetch_array($result)) { $syohin_data[] = $row; } mysqli_free_result($result); mysqli_close($link); } else { print 'DB接続失敗'; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> table, td, th { border: solid black 1px; } table { width: 300px; } .texta { width: 100px; } .texta { margin-bottom: 20px; } p { display: inline-block; } </style> </head> <body> <h1>追加する商品は</h1> <form method="POST"> <p>商品:<input type="text" class="texta" name="syohin"></p> <p>値段:<input type="text" class="texta" name="nedan"></p> <input type="submit" value="追加"> </form> <table> <tr> <th>商品</th> <th>値段</th> </tr> <?php foreach ($syohin_data as $value) { ?> <tr> <td><?php print htmlspecialchars($value['good_name'], ENT_QUOTES, 'UTF-8'); ?></td> <td><?php print htmlspecialchars($value['good_price'], ENT_QUOTES, 'UTF-8'); ?></td> </tr> <?php } ?> </table> </body> </html>

試したこと

while文の所が失敗しているのは分かるのですが・・・

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

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

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

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

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

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

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

guest

回答2

0

デバッグをしてください。
説明をそのまま解釈しないで、ソースコードから解釈すると・・。

最初の表示は正常に表示される。
次に、商品名と価格を入力して実行すると、エラーが出て止まってしまう。
そして、再度、表示させると、追加した商品名と価格が追加された状態で表示される。

だと思います。

”INSERT”を行って、表示を行うのがうまく動作していないことになります。

そりゃぁそうですよね。
$result = mysqli_query($link, $query);
では、INSERTの命令が実行されています。返ってくる値は、リファレンスを見てください。

そのまま、mysqli_fetch_array($result)を実行しても、SELECTで取得すべき情報は取れません。

解決方法は、SQL文法を工夫するか、挿入と表示を分ける必要があります。

投稿2021/04/13 07:06

nfox

総合スコア231

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

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

moka-kuro

2021/04/13 07:27

デバッグの件失礼しました。
moka-kuro

2021/04/13 07:51

回答ありがとうございました。
guest

0

ベストアンサー

エラーメッセージのまんまじゃないですかね。

この箇所:

php

1 $query = "SELECT * FROM good_table"; 2 if($syohin !== ""){ 3 $query = "INSERT INTO good_table(good_name, good_price) VALUES('$syohin', '$nedan')"; 4 } 5 6 $result = mysqli_query($link, $query);

この$resultが2種類起こりうるのが問題です。

PHP: mysqli::query - Manual

返り値

失敗した場合に false を返します。 結果セットを生成するクエリ、 つまり SELECT, SHOW, DESCRIBE あるいは EXPLAIN が成功した場合は、mysqli_query() は mysqli_result オブジェクトを返します。それ以外のクエリが成功した場合は、 mysqli_query() は true を返します。

INSERT INTO文を実行すると、おそらくtrueが返ってきます。
mysqli_fetch_arrayの引数としてmysqli_result $result型である必要があって、
「SELECT, SHOW, DESCRIBE あるいは EXPLAIN が成功した場合」にしか得られません。
mysqli_fetch_array()の引数には適さないです。

なるべくは、
INSERT INTO文を単独で実行した後、改めてSELECT文を実行してmysqli_fetch_array()するよう
コードの見直しをしていただくのが良いかと。
また、老婆心ながら、
SQL文内に変数を直接展開せずmysqli_prepareしつつ
mysqli_stmt_bind_paramして安全にクエリーに組み込んでいただきたく。
(SQLインジェクションって一度調べてみてください。)

投稿2021/04/13 07:06

編集2021/04/13 08:43
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

moka-kuro

2021/04/13 07:53

勉強不足で回答の理解が難しい次第です。 回答ありがとうございました。
moka-kuro

2021/04/13 10:55

INSERT INTO文を単独でやり、少しいじっていたら出来ました。誠にありがとうございました。SQLインジェクションについても勉強します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問