データベース検索サイト
現在、とある検索サイトのフォーム処理をPHPとSQLで制作しているのですが
データベースに無い値を入力した際の出力結果を$errorsに代入し条件分岐を用いて処理しているのですが、上手くデータが渡りません。
発生している問題・エラーメッセージ
動作としては、フォームに記号を入力(主にアルファベット)しデータベースとデータが合致した際に検索結果が表示されるようにしています。
例えば、下記のようにアルファベットではない文字が渡った際にif文の条件分岐によって
"検索結果がありませんでした"と表示したいのですが上手く処理が行われません。
どなたかお知恵をお貸し頂けないでしょうか?
記号あで検索 検索結果は0件です。 Warning: Undefined variable $rows in C:\xampp\htdocs\製造所固有記号\sr.php on line 101
該当のソースコード
<?php //入力の確認 $errors = array(); if(isset($_GET["symbol"])) { $symbol = ($_GET["symbol"]); //$symbolに値があればSQL実行 if(!empty($symbol)) { $dsn = "mysql:dbname=製造所固有記号;host=localhost;charset=utf8mb4"; $username = "root"; $password = ""; //PDOでデータベース接続 try { $dbh = new PDO($dsn,$username,$password,); //SQL文の実行 $stmt = $dbh->prepare("SELECT * FROM search WHERE symbol LIKE (:symbol) "); if($stmt) { $search_symbol = $symbol; $stmt->bindValue(':symbol', $search_symbol, PDO::PARAM_STR); //SQL文の実行 if ($stmt->execute()){ //レコード件数の取得 $row_conunt = $stmt->rowCount(); while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $rows[] = $row; } }else{ $errors['error'] = "検索結果がありませんでした"; } $dbh = null; } } catch(PDOException $e) { echo 'DB接続エラー :' . $e->getMessage(); } }else{ $errors['error'] = "<p class=not_symobl>"."※記号が入力されていません"."</p>"; } } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Language" content="ja" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>製造所固有記号</title> <link rel="stylesheet" href="./stylesheet/stylesheet.css"> </head> <body> <form action="sr.php" method="get"> <!--Main Title--> <h1 align="center">製造所固有記号検索</h1> <!--Sub Title--> <div id="form"> <h2>記号検索</h2> </div> <!--Searh Contents Area--> <div class="search_contents"> <table class="search"> <tr> <td class="label">記号:<span style="color: #FF0000">必須<span></td> <td class="search_symbol"><input type="text" name="symbol" size="5" max_length="10" placeholder="例: A"> </tr> <tr> <td class="label">製造者:</td> <td class="search_maker"><input type="text" name="product_maker" size="30" maxlength="50" class="maker" placeholder="例: ○○株式会社"></td> </tr> <tr> <td class="search_button"><input type="submit" value="検索" name="search" id="search"> </tr> </table> </div> <div class="result"> <?php if (count($errors) === 0): ?> <h3><b>検索結果</b></h3> <?php if(isset($search_symbol)){ ?> <p>記号<b><?php echo htmlspecialchars($search_symbol, ENT_QUOTES, 'UTF-8')?></b>で検索</p> <?php }else{ ?> <?php if(isset($not_input_errors)) { foreach($not_input_errors as $message){ echo "<p>".$message."</p>"; } } ?> <?php } ?> <p>検索結果は<?=$row_conunt?>件です。</p> <!--Result--> <table border='1'> <tr><td>所在地</td><td>記号</td><td>法人番号</td><td>製造者名</td><td>製造者所在地</td></tr> <?php foreach((array)$rows as $row){ ?> <tr> <td><?=htmlspecialchars($row['prefecture'],ENT_QUOTES,'UTF-8')?></td> <td><?=htmlspecialchars($row['symbol'],ENT_QUOTES,'UTF-8')?></td> <td><?=htmlspecialchars($row['number'],ENT_QUOTES,'UTF-8')?></td> <td><?=htmlspecialchars($row['maker_name'],ENT_QUOTES,'UTF-8')?></td> <td><?=htmlspecialchars($row['maker_address'],ENT_QUOTES,'UTF-8')?></td> </tr> <?php } ?> <?php elseif(count($errors) > 0): ?> <?php foreach($errors as $value){ echo "<p>".$value."</p>"; } ?> <?php endif; ?> </div> <!--Back Home--> <div class="back_button"> <hr width="98%"> <table width="100%"> <tr align="center"> <td class="item_button"><input class="button" name="back" type="button" value="閉じる" /></td> </tr> </table> </div> <footer>フッター</footer> </body> </html>
試したこと
var_dump関数で配列の中身を確認したがnullが代入されている。
補足情報(FW/ツールのバージョンなど)
ローカル環境でコーディング中です。
VScodeにて記述
PHPver 8.0.9
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/26 15:33
2021/11/26 20:05
2021/11/30 12:11