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

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

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

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

Q&A

解決済

1回答

614閲覧

SELECT(WHERE)文がなかなか反映出来ません。

MIRE

総合スコア4

PHP

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

0グッド

1クリップ

投稿2022/10/13 05:40

編集2022/10/13 07:58

PHP初心者です。PHPで検索画面を作りたいです。

実現したいこと

PHPで検索画面を作りたいのですが、SELECT文が上手く反映されません。

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

PHP バージョン : 7.2.x

SELECT文抜きですと、表は表示されますが、

イメージ説明

SELECT文を加えるとデータ等が反映されません。

500 Internal Server Error

イメージ説明

該当のソースコード

<?php try { // 入力された検索したい名前を取得 $playerName = isset($_GET['productName']) ? $_GET['productName'] : ''; // 接続処理 $dsn ='mysql:dbname=******;host=*****.com;charset=utf8;';//データベースのホスト名及びデータベース名 $user = 'ki'; //MySQLのユーザ名 $password = 'H'; //MySQLのパスワード //データベースに接続 $dbh = new PDO($dsn, $user, $password); // SELECT文を発行 $sql = <<<EOM SELECT p.id AS playerId , p.name AS productName , p.name AS countryName , p.price , u.name AS user , p.user_lank AS userlank FROM product p JOIN users u ON p.userlank = u.lank WHERE p.name LIKE :productName EOM; $stmt = $dbh->prepare($sql); $bindPlayerName = '%'.$productName.'%'; $stmt->bindParam(':productName', $bindPlayerName, PDO::PARAM_STR); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_OBJ); // レコードを取得 // 接続切断 $dbh = null; } catch (PDOException $e) { print $e->getMessage() . "<br/>"; die(); } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous"> <title>検索画面</title> </head> <body> <div class="container"> <div class="h1 mb-3">検索画面</div> <div class="card mb-3"> <div class="card-header bg-primary text-white"> 検索 </div> <div class="card-body"> <form action=""> <div class="row mb-3"> <div class="col-6"> <label for="productName" class="form-label">商品名</label> <input type="productName" class="form-control" id="productName" name="productName" placeholder="" value="<?php print($productName); ?>"> </div> </div> <button type="submit" class="btn btn-primary">検 索</button> </form> </div> </div> <table class="table table-striped"> <tr> <th>ID</th> <th>商品名</th> <th>値段</th> <th>顧客名</th> <th>ランク</th> </tr> <?php if($rows) { foreach($rows as $row){ ?> <tr> <td><?php print($row->playerId) ?></td> <td><?php print($row->productName) ?></td> <td><?php print($row->price) ?></td> <td><?php print($row->userName) ?></td> <td><?php print($row->userlank) ?></td> </tr> <?php } } ?> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script> </body> </html>

SELECT文抜き

<?php try { // 入力された検索したい名前を取得 $playerName = isset($_GET['productName']) ? $_GET['productName'] : ''; // 接続処理 $dsn ='mysql:dbname=******;host=*****.com;charset=utf8;';//データベースのホスト名及びデータベース名 $user = 'ki'; //MySQLのユーザ名 $password = 'H'; //MySQLのパスワード //データベースに接続 $dbh = new PDO($dsn, $user, $password); $stmt = $dbh->prepare($sql); $bindPlayerName = '%'.$productName.'%'; $stmt->bindParam(':productName', $bindPlayerName, PDO::PARAM_STR); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_OBJ); // レコードを取得 // 接続切断 $dbh = null; } catch (PDOException $e) { print $e->getMessage() . "<br/>"; die(); } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous"> <title>検索画面</title> </head> <body> <div class="container"> <div class="h1 mb-3">検索画面</div> <div class="card mb-3"> <div class="card-header bg-primary text-white"> 検索 </div> <div class="card-body"> <form action=""> <div class="row mb-3"> <div class="col-6"> <label for="productName" class="form-label">商品名</label> <input type="productName" class="form-control" id="productName" name="productName" placeholder="" value="<?php print($productName); ?>"> </div> </div> <button type="submit" class="btn btn-primary">検 索</button> </form> </div> </div> <table class="table table-striped"> <tr> <th>ID</th> <th>商品名</th> <th>値段</th> <th>顧客名</th> <th>ランク</th> </tr> <?php if($rows) { foreach($rows as $row){ ?> <tr> <td><?php print($row->playerId) ?></td> <td><?php print($row->productName) ?></td> <td><?php print($row->price) ?></td> <td><?php print($row->userName) ?></td> <td><?php print($row->userlank) ?></td> </tr> <?php } } ?> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script> </body> </html>

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

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

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

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

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

m.ts10806

2022/10/13 05:44

具体的に起きている現象を記載してください。 https://teratail.com/help/question-tips#questionTips34 どういうデータがあってどういう入力や操作を行っていて どういう結果が出るのを想定していて 実際はどういう結果になっているのか を具体的に。
m.ts10806

2022/10/13 06:35

コードがマークダウンからはみ出しています。 質問投稿画面ではプレビューが表示されているはずなので、 落ち着いて編集してください。
m.ts10806

2022/10/13 06:36

あと念のためPHPのバージョンと、 比較したいので「SELECT文抜き」のコードも別のコードブロックに入れて提示してください。
m.ts10806

2022/10/13 08:00

>SELECT文抜き こちら、未定義の変数$sqlをprepare()に突っ込んでいたり エラーが出ないように思えないのですが、本当にこの通りのコードですか? 一応思うところを回答にはしておきますが、PHPのバージョンによって起きたり起きなかったりするかもしれません。
guest

回答1

0

ベストアンサー

PHPのバージョン次第ではありますが(後述)、ヒアドキュメントの置き方を調整してみて下さい。

PHP

1 $sql = <<<EOM 2 SELECT 3 p.id AS playerId 4 , p.name AS productName 5 , p.name AS countryName 6 , p.price 7 , u.name AS user 8 , p.user_lank AS userlank 9 FROM 10 product p JOIN users u 11 ON p.userlank = u.lank 12 WHERE 13 p.name LIKE :productName 14EOM; // <-スペース詰めて行頭に。 15 16

https://www.php.net/manual/ja/language.types.string.php#language.types.string.syntax.heredoc
終端ID は、スペースまたはタブでインデントできます。 その場合、インデントされた部分は文字列の全ての行から取り除かれます。** PHP 7.3.0 より前のバージョンでは、 終端ID はその行の最初のカラムから始めなければ いけませんでした。 **

500エラーは原因多岐に渡るので、画面に500としか出てないのでしたら、エラーログ確認してみてください。
ヒアドキュメントの問題であればParseErrorが出ているはず。

IDEなどでも警告は出ます。
イメージ説明

※PHP7.4にパスを通している場合は実行はできる

投稿2022/10/13 08:03

編集2022/10/13 08:13
m.ts10806

総合スコア80850

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

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

MIRE

2022/10/13 08:31

ご丁寧にご回答有難うございました。 初歩的な事もご指摘頂き、申し訳ございませんでした。 教えて頂いた事を、確認しながら再度挑戦してみます。
m.ts10806

2022/10/13 08:38 編集

解決されたようですが、私の回答を以てどのように解決したか教えていただきたく。 コメントだけ見るとまだ試してないように見受けられます。
MIRE

2022/10/14 05:03

真っ先に記述して頂いたEOM;の行頭スペースを詰めましたら、完璧に出てきました。 大変助かりました。昨日はお礼が遅くなってはいけないと思い…先にご連絡させて頂きました、 失礼いたしました。
m.ts10806

2022/10/14 05:09

いえ、回答者としては「本当に解決できたかどうか」のほうが大事なので、 しっかり確認してからにしてもらったほうが良いです。 「解決済み」にしてしまうと終わってしまいますから(心境的に)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問