前提
MySQLで作成した検索機能をPHPで表示させるプログラムを作っています。
下記のようにmysqliでプレースホルダを指定しようとして、
devices.phpを出力した際にFatal errorが出てしまい、mysqliが未定義となってしまうのですが、
どのように修正すればよろしいでしょうか?
実現したいこと
mysqliを使用したプレースホルダの正しい指定方法と、検索結果を一覧表示させる為の構文
発生している問題・エラーメッセージ
Warning: Undefined variable $mysqli in C:\xampp\htdocs\test\devices.php on line 9 Fatal error: Uncaught Error: Call to a member function prepare() on null in C:\xampp\htdocs\test\devices.php:9 Stack trace: #0 {main} thrown in C:\xampp\htdocs\test\devices.php on line 9
DBの定義
1CREATE TABLE `devices` ( 2 `device_name` char(9) NOT NULL, 3 `serial_number` varchar(9) NOT NULL, 4 `manufacturer` varchar(9) NOT NULL COMMENT 'メーカー名 1:FUJITSU 2:Microsoft', 5 `model` varchar(32) NOT NULL, 6 `os` char(7) NOT NULL DEFAULT 'Windows', 7 PRIMARY KEY (`device_name`), 8 UNIQUE KEY `serial_number` (`serial_number`),
該当のソースコード
devices.php
1<?php 2//①データ取得ロジックを呼び出す 3include_once('model.php'); 4$deviceData = getDeviceData($_GET); 5 6// ここでSQL文を作成する 7$sql = "SELECT * from devices where device_name = ? and serial_number = ? and manufacturer = ? and model = ? and os = ?"; 8// SQL文を$stmt オブジェクトに紐付ける 9if ($stmt = $mysqli->prepare($sql)) { 10 11// プレースホルダと変数を結びつける 12$stmt->bind_param('sssss', $device_name, $serial_number, $manufacturer, $model, $os); 13 14// 実行する 15$stmt->execute(); 16 17// 取得した値を変数に結びつける 18$stmt->bind_result($folder_name); 19 20// 結びつけた変数に取得した値をセットする。 21$stmt->fetch(); 22 23// クローズする 24$stmt->close(); 25 26/* 接続を閉じます */ 27$mysqli->close(); 28} 29?> 30 31<!DOCTYPE html> 32<html lang="ja"> 33<head> 34<meta charset="utf-8"> 35<meta name="viewport" content="width=device-width, initial-scale=1"> 36<title>端末テーブル表示</title> 37<link rel="stylesheet" href="style.css"> 38<!-- Bootstrap読み込み(スタイリングのため) --> 39<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css"> 40</head> 41<body> 42<div class="flex_test-box"> 43 <div class="flex_test-item"> 44 <h1 class="col-xs-6 col-xs-offset-3">端末テーブル</h1> 45 </div> 46</div> 47<h3 class="col-xs-6 col-xs-offset-3">検索フォーム</h3> 48<div class="col-xs-6 col-xs-offset-3 well"> 49 50 <?php //②検索フォーム ?> 51 <form method="get"> 52 <div class="form-group"> 53 <label for="InputDevice_name">端末名</label> 54 <input name="device_name" class="form-control" id="InputDevice_name" value="<?php echo isset($_GET['device_name']) ? htmlspecialchars($_GET['device_name']) : '' ?>"> 55 </div> 56 <div class="form-group"> 57 <label for="InputSerial_number">シリアル</label> 58 <input name="serial_number" class="form-control" id="InputSerial_number" value="<?php echo isset($_GET['serial_number']) ? htmlspecialchars($_GET['serial_number']) : '' ?>"> 59 </div> 60 <div class="form-group"> 61 <label for="InputManufacturer">メーカー</label> 62 <select name="manufacturer" class="form-control" id="InputManufacturer"> 63 <option value="0" <?php echo empty($_GET['manufacturer']) ? 'selected' : '' ?>>選択しない</option> 64 <option value="1" <?php echo isset($_GET['manufacturer']) && $_GET['manufacturer'] == '1' ? 'selected' : '' ?>>FUJITSU</option> 65 <option value="2" <?php echo isset($_GET['manufacturer']) && $_GET['manufacturer'] == '2' ? 'selected' : '' ?>>Microsoft</option> 66 </select> 67 </div> 68 <div class="form-group"> 69 <label for="InputModel">品名/型番</label> 70 <select name="model" class="form-control" id="InputModel"> 71 <option value="0" <?php echo empty($_GET['model']) ? 'selected' : '' ?>>選択しない</option> 72 <option value="1" <?php echo isset($_GET['model']) && $_GET['model'] == '1' ? 'selected' : '' ?>>Surface Laptop Go</option> 73 <option value="2" <?php echo isset($_GET['model']) && $_GET['model'] == '2' ? 'selected' : '' ?>>ARROWS Tab Q5010/EEG(FARQ25045Z)</option> 74 <option value="3" <?php echo isset($_GET['model']) && $_GET['model'] == '3' ? 'selected' : '' ?>>ARROWS Tab Q509/VE(FARQ22014)</option> 75 <option value="4" <?php echo isset($_GET['model']) && $_GET['model'] == '4' ? 'selected' : '' ?>>ARROWS Tab Q508/SE(FARQ18011)</option> 76 <option value="5" <?php echo isset($_GET['model']) && $_GET['model'] == '5' ? 'selected' : '' ?>>ARROWS Tab Q507/PE(FARQ14011)</option> 77 </select> 78 </div> 79 <div class="form-group"> 80 <label for="InputOs">OS</label> 81 <input type="os" class="form-control" id="InputOs" value="Windows"> 82 </div> 83 <button type="submit" class="btn btn-default" name="search">検索</button> 84 </form> 85 86</div> 87<div class="col-xs-6 col-xs-offset-3"> 88 <?php //③取得データを表示する ?> 89 90 <?php if(isset($deviceData) && count($deviceData)): ?> 91 <p class="alert alert-success"><?php echo count($deviceData) ?>件見つかりました。</p> 92 <table class="table"> 93 <thead> 94 <tr> 95 <th>端末名</th> 96 <th>シリアル</th> 97 <th>メーカー</th> 98 <th>品名/型番</th> 99 <th>OS</th> 100 </tr> 101 </thead> 102 <tbody> 103 <?php foreach($deviceData as $row): ?> 104 <tr> 105 <td><?php echo htmlspecialchars($row['device_name']) ?></td> 106 <td><?php echo htmlspecialchars($row['serial_number']) ?></td> 107 <td><?php echo htmlspecialchars($row['manufacturer'] == 1 ? 'FUJITSU' : 'Microsoft') ?></td> 108 <td><?php echo htmlspecialchars($row['model'] ) ?></td> 109 <td><?php echo htmlspecialchars($row['os']) ?></td> 110 </tr> 111 <?php endforeach; ?> 112 </tbody> 113 </table> 114 <?php else: ?> 115 <p class="alert alert-danger">検索対象は見つかりませんでした。</p> 116 <?php endif; ?> 117 118</div> 119</body> 120</html>
model.php
1<?php 2 3function getDeviceData($params){ 4 //DBの接続情報 5 include_once('config/database.php'); 6 7 //DBコネクタを生成 8 $Mysqli = new mysqli('localhost', 'root', '', 'deviceswithinventory'); 9 if ($Mysqli->connect_error) { 10 error_log($Mysqli_connect_error); 11 exit; 12 } 13} 14?>
config/database.php
1<?php 2 3//DBの接続情報 4$host = "localhost"; 5$username = "root"; 6$password = ""; 7$dbname = "deviceswithinventory"; 8
試したこと
Mysqli(プリペアドステートメント~execute)の箇所の構文をdevices.phpからmodel.phpに転記させても結果変わりませんでした。
補足情報(FW/ツールのバージョンなど)
PHP7、MySQL8.0を使用
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/01/25 08:55
2023/01/25 11:56 編集
2023/01/25 13:10
2023/01/26 02:03
2023/01/26 02:27
2023/01/26 02:36