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>
具体的に起きている現象を記載してください。
https://teratail.com/help/question-tips#questionTips34
どういうデータがあってどういう入力や操作を行っていて
どういう結果が出るのを想定していて
実際はどういう結果になっているのか
を具体的に。
コードがマークダウンからはみ出しています。
質問投稿画面ではプレビューが表示されているはずなので、
落ち着いて編集してください。
あと念のためPHPのバージョンと、
比較したいので「SELECT文抜き」のコードも別のコードブロックに入れて提示してください。
>SELECT文抜き
こちら、未定義の変数$sqlをprepare()に突っ込んでいたり
エラーが出ないように思えないのですが、本当にこの通りのコードですか?
一応思うところを回答にはしておきますが、PHPのバージョンによって起きたり起きなかったりするかもしれません。

回答1件
あなたの回答
tips
プレビュー