Call to a member function prepare() on nullの解決方法
解決したいこと
PHPで検索機能を作成しています。
データベースから該当データを取得するところでエラーが発生します。
stock_search.phpのSQL文にミスがあると思われます。
アドバイス頂ると幸いです。
発生している問題・エラー
Fatal error: Uncaught Error: Call to a member function prepare() on null in /Applications/MAMP/htdocs/public2/stock_search.php:27 Stack trace: #0 {main} thrown in /Applications/MAMP/htdocs/public2/stock_search.php on line 27
該当するソースコード
list.php 検索欄にキーワード入力して検索
<form method="post" action="stock_branch.php">
<input type="text" name="search_name" class="search">
<input type="submit" value="検索">
</form>
stock.branch.php 検索欄入力内容チェック
<?php
if(isset($_POST['search_name'])==true)
{
if(isset($_POST['search_name'])==false)
{
header('Location:stock_ng.php');
exit();
}
$search_name=$_POST['search_name'];
//print_r($search_name);
header('Location:stock_search.php?search_name='.$search_name);
exit();
}
?>
stock_search.php 該当データをDBから取得してブラウザ表示
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/common.css">
<title>検索結果</title>
</head>
<body>
<?php
try
{
//require_once('../common/common.php');
//$post=sanitize($_POST);
//$search_name=$_GET['search_name'];
//$search_name = (string)filter_input(INPUT_POST, 'search_name');
//var_dump($search_name);
$dsn='mysql:dbname=user;host=localhost;charset=utf8';
$user='yusei';
$password='rogin1111';
$dbh=new PDO($dsn,$user,$password);
$stmt = $pdo->prepare("SELECT * FROM stocks WHERE stock_name LIKE (:stock_name) ");
if($stmt){
$search_name=$_POST['search_name'];
$like_search_name="%".$search_name."%";
//プレースホルダーへ実際の値を設定する
$stmt->bindValue(':stock_name', $like_search_name, PDO::PARAM_STR);
if($stmt->execute()){
//レコード件数取得
$row_count=$stmt->rowCount();
while($row=$stmt->fetch()){
$rows[]=$row;
}
}else{
$errors['error']="検索失敗しました。";
}
$dbh=null;
}
}
catch(PDOException $e)
{
print('Error:'.$e->getMessage());
$errors['error'] = "データベース接続失敗しました。";
}
?>
<?php if(count($errors)===0): ?>
<p><?=htmlspecialchars($search_name, ENT_QUOTES, 'UTF-8')."で検索しました。"?></p>
<p><?=$row_count?>件の該当商品がありました。</p>
<table border='1'>
<tr><th>ID</th><th>購入日</th><th>消費期限</th><th>商品名</th><th>値段</th><th>数量</th><!--<th>画像</th>--></tr>
<?php foreach ($rows as $row): ?>
<tr>
<td><?= $row['stock_id']?></td>
<td><?= htmlspecialchars($row['purchase_date'], ENT_QUOTES, 'UTF-8') ?></td>
<td><?= htmlspecialchars($row['deadline'], ENT_QUOTES, 'UTF-8') ?></td>
<td><?= htmlspecialchars($row['stock_name'], ENT_QUOTES, 'UTF-8') ?></td>
<td><?= htmlspecialchars($row['price'], ENT_QUOTES, 'UTF-8') ?></td>
<td><?= htmlspecialchars($row['number'], ENT_QUOTES, 'UTF-8') ?></td>
</tr>
<?php endforeach; ?>
</table>
<?php elseif(count($errors) > 0): ?>
<?php
foreach($errors as $value){
echo "<p>".$value."</p>";
}
?>
<?php endif; ?>
<br />
<form>
<input type="button" onclick="history.back()" value="戻る">
</form>
</body>
</html>
自分で試したこと
https://noumenon-th.net/programming/2016/02/15/pdo_search/
こちらのサイトを参考にSQL文の見直し。
1