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

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

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

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

PHP

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

Q&A

解決済

2回答

3800閲覧

PHP で検索機能を作りたい。

Be_ginner

総合スコア5

MySQL

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

PHP

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

0グッド

0クリップ

投稿2020/02/04 05:54

編集2020/02/05 08:27

質問を修正しました。

前提・実現したいこと

MYSQL内のDBをPHPで検索しようとしています。

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

foreach()が配列になっていないことが問題なのはわかったのですが、配列にする方法が分かりません。

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\phplesson\chap01\hello.php on line 29

該当のソースコード(追記:データベースに正しく接続されていないことが原因でした)

PHP

1<?php 2 //データベースへ接続 3 $dsn = "mysql:dbname=e-money-test;host=localhost;charset=utf8mb4"; 4 $username = "root"; 5 $password = ""; 6 $options = []; 7 $db = new PDO($dsn, $username, $password, $options); 8 9 $query = "SELECT * FROM 'store_data' 10 WHERE Store_Name LIKE '%".$_POST["Name"] ."%'"; 11 12 if(@$_POST["Name"] != ""){ 13 $stmt = $db->query($query); //SQL文を実行して、結果を$stmtに代入する。 14 } 15 16 ?> 17 18<html> 19 <head> 20 <title>Search e-money</title> 21 </head> 22 23 <body> 24 <form action="hello.php" method="Post"> 25 Name:<input type="text" name="Name"><br> 26 <input type="submit"> 27 </form> 28 29 <?php foreach ($stmt as $row): ?> 30 <tr><td><?php echo $row[0]?></td><td><?php echo $row[1]?></td></tr> 31 <?php endforeach; ?> 32 33</body> 34</html> 35

試したこと

foreach ((array)$stmt as $row): 
とすると、
Trying to access array offset on value of type bool in C:\xampp\htdocs\phplesson\chap01\hello.php on line 30
と表示されてしまいました。

###追記(追記:ATTR_EMULATE_PREPARESが誤字でした)
データベースに接続できていないことがわかり、接続できているかを調べましたが、「エラーがありました」と表示されました。「SELECT ID FROM store_data WHERE ID = 1」をPHPMyAdmin のe-money-testのSQL欄で実行してみたところ、エラーは出ずstore_data の ID = 1の表が表示されました。

php

1<?php 2//データベース定義 3$user = 'root'; 4$password = 'root'; 5$dbName='e-money-test'; 6$host = 'localhost'; 7$dsn="mysql:host={$host};dbname={$dbName};charset=utf8mb4"; 8 9//データベース接続 10 11try { 12$pdo = new PDO($dsn, $user, $password); 13$pdo->setAttribute(PDO::ATTER_EMULATE_PREPARES, false); 14$pdo->setAttribute(PDO::ATTER_ERRMODE, PDO::ERRMODE_EXCEPTION); 15 16echo '接続できました'; 17$stmt = $db -> prepare("SELECT ID FROM store_data WHERE ID = ?"); 18$stmt = bindvalue(1, 1); 19$stmt = execute(); 20 21var_dump($stmt); 22 23} catch (Exception $e){ 24echo 'エラーがありました。'; 25// echo $e->getMessage; 26exit(); 27} 28

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/02/04 06:41

MyAdmin とはなんでしょう? phpMyAdmin は今回の質問に何の関係があるのでしょう?
Be_ginner

2020/02/04 15:11

私の知識不足で、適切でない質問を書いてしまい申し訳ございません。 自分なりに修正してみるので、誤った表現等あれば教えていただければ幸いです!
guest

回答2

0

ベストアンサー

エラーからするとPDO::queryの返却値がfalseなんでしょう

PDO::query() は、PDOStatement オブジェクトを返します。 失敗した場合は FALSE を返します。

直に実行して通るSQLかどうかは必ず確認してください。phpMyAdminからも実行できます。
直に実行して想定通りの情報が得られなければ当然PHPから実行しても
想定の結果は得られません。

シングルクォートはSQLにおいては「文字列」を表します。
テーブル名を「文字列」として扱ってませんか?
テーブル名やカラム名は通常は何も囲まないか丁寧にするなら

`table_nawe`

のように(バッククォート2つ)で囲みます。
※全角名称採用は考慮しません

また、直に$_POSTを参照するのではなくfilter_inputを採用することで、
if(@$_POST["Name"] != ""){ というエラーを意図的にスキップする実装を避けることができます。
エラーはむしろ出すべきで、提示のようにスキップする実装は避けるべきです。

また、SQLインジェクションが可能です。
prepare→bindValue→executeの流れを作りましょう。
また、try-catchでPDOExeptionを捕捉する仕組みは入れましょう。
DBはPHPからすると外部のアプリケーションです。
ちゃんと拾ってあげる仕組みにしないと何が起きているのか把握することはできません。

PHPでデータベースに接続するときのまとめ

投稿2020/02/04 06:32

編集2020/02/04 06:45
m.ts10806

総合スコア80875

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

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

Be_ginner

2020/02/04 15:08

確認したところ、falseになっていました!ありがとうございます! またとても参考になる情報をご提供いただきありがとうございます、勉強します。
m.ts10806

2020/02/04 20:13

で、その後のどのように調整されたのでしょうか。 どのように理解されたのか、どう進んでいるのかを具体的に記載されないと次の試行錯誤にはなりませんので。
Be_ginner

2020/02/05 05:12

クオーテーションを消したところ、var_dump($stmt)=falseではなくarray(0){}となりました。 そもそもDBとの接続ができていないのではないか、と思いもう一度インストールからやり直してみるつもりです。
m.ts10806

2020/02/05 05:15

再インストールは全く意味がありません。 回答読まれたのでしょうか。 試すことがたくさんありますし、そもそも何をどうして結果が変わったのか全く伝わってきてません。
m.ts10806

2020/02/05 05:17

特に下記。PHPから実行する前に踏んでおく必須手順です。 >直に実行して通るSQLかどうかは必ず確認してください。phpMyAdminからも実行できます。 直に実行して想定通りの情報が得られなければ当然PHPから実行しても 想定の結果は得られません。
Be_ginner

2020/02/05 06:22

不十分な回答で申し訳ございません。 いただいた回答をもとに書いたコードを追記しました。 お時間あるときに目を通していただければ幸いです!
m.ts10806

2020/02/05 06:30

せっかくexception捕捉してるのに下記をコメントアウトしていてはどんなエラーがきたかわかりませんよ。 echo $e->getMessage;
Be_ginner

2020/02/05 08:30

おっしゃる通りでした、初歩的なことを丁寧に教えていただきありがとうございました。 エラーにしたがって修正していったら、DBに接続することができ、検索機能をつけることができました。 初めてのPHPコードが動いてとても興奮しています、本当にありがとうございました!
m.ts10806

2020/02/05 12:09

解決されたようで何よりですが、 >初めてのPHPコードが動いて もっと簡単なところから「できる」を積み重ねた方が着実に進めると思います
guest

0

まず変数はifの外側で定義しておきましょう

php

1$stmt = []; 2if(@$_POST["Name"] != ""){ 3 $stmt = $db->query($query); //SQL文を実行して、結果を$stmtに代入する。 4}

で、foreachですが

php

1 <?php foreach ($stmt as $row): ?> 2 <tr><td><?php echo $row['ID']?></td><td><?php echo $row['Store_Name']?></td></tr> 3 <?php endforeach; ?>

とかで出ないですか?
出ない場合は一度var_dump($stmt)などで結果が取れているか確認してください。

あと念のため、phpMyadminはDBのクライアントツールであってデータが入っているのはMySQL内のDBです

投稿2020/02/04 06:08

sola-msr

総合スコア876

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

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

Be_ginner

2020/02/04 15:06

var_dumpをしてみたところ、falseになっていました! ありがとうございます! コードをいじっていたら、今度はvar_dump($stmt) = array(0) { }となったのですが、これも結果が取れていない状態なのでしょうか?? 重ね重ねの質問、申し訳ございません。
sola-msr

2020/02/04 15:11

空の配列が入っている状態なのでDBからの結果が取れてませんね もう一度DBの接続情報などを見直してみてください
Be_ginner

2020/02/04 15:17

なるほど!早速見直してみます、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問