MySQLで検索機能(PHP)
解決したいこと
MySQLで作成した資産管理DBをPHPで表示させるプログラムを作っています。
・デフォルト画面
→検索結果を非表示にしたい。(レコード数が5000を超え、ページが重くなる為)
・「検索」ボタン押下時
→指定した条件で検索結果を表示したい。
当初mysqliでプレースホルダを指定しようとして組んでいましたが、PDOに切り替えることになり、
データベース接続後、プリペアドステートメントを指定してみましたが、検索結果が常に
「検索対象は見つかりませんでした。」と表示され、抽出されません。
解決策をご教示お願いします。
DBの定義
CREATE TABLE `devices` (
`device_name` char(9) NOT NULL,
`serial_number` varchar(9) NOT NULL,
`manufacturer` varchar(9) NOT NULL COMMENT 'メーカー名 1:FUJITSU 2:Microsoft',
`model` varchar(32) NOT NULL,
`os` char(7) NOT NULL DEFAULT 'Windows',
PRIMARY KEY (`device_name`),
UNIQUE KEY `serial_number` (`serial_number`),
該当するソースコード
devices.php
<?php
try {
$db = new PDO ('mysql:dbname=deviceswithinventory;host=localhost;charset=utf8mb4', 'root','');
} catch (PDOException $e) {
echo 'DB接続エラー : ' . $e->getMessage();
}
// 検索条件の変数を初期化する
$device_name = '';
$serial_number = '';
$manufacturer ='';
$model = '';
$os = '';
// SQL文を作成する
$sql = 'SELECT * FROM devices';
conditions = array();
if(isset(GET['device_name']))$conditions[] = 'device_name =?';$device_name = $_GET['device_name'];if(isset($_GET['serial_number'])) {
conditions[] =' serial_number =?';serial_number = $_GET['serial_number'];
}
if (isset($_GET['manufacturer'])) {
conditions[] =' manufacturer =?';manufacturer = $_GET['manufacturer'];
}
if (isset($_GET['model'])) {
conditions[] =' model =?';model = $_GET['model'];
}
if (isset($_GET['os'])) {
conditions[] =' os =?';os = $_GET['os'];
}
if (!empty(conditions)) {
sql.=' WHERE'.implode('AND',conditions);
}
// プリペアドステートメントを作成する
stmt = $db ->prepare($sql);
// プレースホルダと変数を結びつける
i = 1;if(!empty(device_name)) {
stmt->bindparam(i++, device_name, PDO::PARAM_STR);
}
if (!empty(serial_number)) {
stmt->bindparam(i++, serial_number, PDO::PARAM_STR);
}
if (!empty(manufacturer)) {
stmt->bindparam(i++, manufacturer, PDO::PARAM_STR);
}
if (!empty(model)) {
stmt->bindparam(i++, model, PDO::PARAM_STR);
}
if (!empty(os)) {
stmt->bindparam(i++, os, PDO::PARAM_STR);
}
// 実行する
$stmt->execute();
// 検索結果を取得する
devices =stmt->fetchAll(PDO::FETCH_ASSOC);
// デフォルト画面の場合はレコードを取得せずに終了する
if (empty($conditions)) {
die();
}
$devices = $db ->query('SELECT * FROM devices ORDER BY device_name')
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>端末テーブル表示</title>
<!-- Bootstrap読み込み(スタイリングのため) -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css">
</head>
<body>
<div class="flex_test-box">
<div class="flex_test-item">
<h1 class="col-xs-6 col-xs-offset-3">端末テーブル</h1>
</div>
</div>
<h3 class="col-xs-6 col-xs-offset-3">検索フォーム</h3>
<div class="col-xs-6 col-xs-offset-3 well">
<?php //②検索フォーム ?>
<form method="get">
<div class="form-group">
<label for="InputDevice_name">端末名</label>
<input name="device_name" class="form-control" id="InputDevice_name" value="<?php echo isset($_GET['device_name']) ? htmlspecialchars($_GET['device_name']) : '' ?>">
</div>
<div class="form-group">
<label for="InputSerial_number">シリアル</label>
<input name="serial_number" class="form-control" id="InputSerial_number" value="<?php echo isset($_GET['serial_number']) ? htmlspecialchars($_GET['serial_number']) : '' ?>">
</div>
<div class="form-group">
<label for="InputManufacturer">メーカー</label>
<select name="manufacturer" class="form-control" id="InputManufacturer">
<option value="0" <?php echo empty($_GET['manufacturer']) ? 'selected' : '' ?>>選択しない</option>
<option value="1" <?php echo isset($_GET['manufacturer']) && $_GET['manufacturer'] == '1' ? 'selected' : '' ?>>FUJITSU</option>
<option value="2" <?php echo isset($_GET['manufacturer']) && $_GET['manufacturer'] == '2' ? 'selected' : '' ?>>Microsoft</option>
</select>
</div>
<div class="form-group">
<label for="InputModel">品名/型番</label>
<select name="model" class="form-control" id="InputModel">
<option value="0" <?php echo empty($_GET['model']) ? 'selected' : '' ?>>選択しない</option>
<option value="1" <?php echo isset($_GET['model']) && $_GET['model'] == '1' ? 'selected' : '' ?>>Surface Laptop Go</option>
<option value="2" <?php echo isset($_GET['model']) && $_GET['model'] == '2' ? 'selected' : '' ?>>ARROWS Tab Q5010/EEG(FARQ25045Z)</option>
<option value="3" <?php echo isset($_GET['model']) && $_GET['model'] == '3' ? 'selected' : '' ?>>ARROWS Tab Q509/VE(FARQ22014)</option>
<option value="4" <?php echo isset($_GET['model']) && $_GET['model'] == '4' ? 'selected' : '' ?>>ARROWS Tab Q508/SE(FARQ18011)</option>
<option value="5" <?php echo isset($_GET['model']) && $_GET['model'] == '5' ? 'selected' : '' ?>>ARROWS Tab Q507/PE(FARQ14011)</option>
</select>
</div>
<div class="form-group">
<label for="InputOs">OS</label>
<input type="os" class="form-control" id="InputOs" value="Windows">
</div>
<button type="submit" class="btn btn-default" name="search">検索</button>
</form>
</div>
<div class="col-xs-6 col-xs-offset-3">
<?php //③取得データを表示する ?>
<?php if(isset($deviceData) && count($deviceData)): ?>
<p class="alert alert-success"><?php echo count($deviceData) ?>件見つかりました。</p>
<table class="table">
<thead>
<tr>
<th>端末名</th>
<th>シリアル</th>
<th>メーカー</th>
<th>品名/型番</th>
<th>OS</th>
</tr>
</thead>
<tbody>
<?php foreach($deviceData as $row): ?>
<tr>
<td><?php echo htmlspecialchars($row['device_name']) ?></td>
<td><?php echo htmlspecialchars($row['serial_number']) ?></td>
<td><?php echo htmlspecialchars($row['manufacturer'] == 1 ? 'FUJITSU' : 'Microsoft') ?></td>
<td><?php echo htmlspecialchars($row['model'] ) ?></td>
<td><?php echo htmlspecialchars($row['os']) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php else: ?>
<p class="alert alert-danger">検索対象は見つかりませんでした。</p>
<?php endif; ?>
</div>
</body>
</html>
0 likes