@Tarzan3154

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

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

2Answer

変数$deviceDataが初期化されていないので、条件が常にfalseになっていると思います。

こういうものはコードを眺めていても解決しないので、手を動かして原因を探りましょう。
原始的ですがvar_dumpメソッドなどで値出力して確認する方法があります。

    <?php var_dump(isset($deviceData) && count($deviceData)) ?>
    <?php var_dump($deviceData) ?>
	<?php if(isset($deviceData) && count($deviceData)): ?>

このようにデバッグ用の処理を差し込めば、今よりも状況がわかるでしょう。
さらに差し込む位置を変えたりして、どのように処理が進んでいるのか観測したりします。

1Like

This answer has been deleted for violation of our Terms of Service.

Your answer might help someone💌