あいまい検索
$sql="SELECT menu FROM foods WHERE menu LIKE '%定食%'";
%というワイルドカードを使う
しかし普通「定食」じゃなく送られてくる検索単語だったりする
でも
%:key%
という指定はできない
ので、全体をプレイスホルダーにするのが唯一の解決法
$sql="SELECT menu FROM foods WHERE menu LIKE :key";
なお午前中のテストでbindValueの第2引数をまちがえた
$stmtは文字列結合でこう記述する
$stmt->bindValue(":key","%".$_POST["key"]."%",PDO::PARAM_STR);
ここまで
list.php
$host="localhost";
$dbname="lunch";
$dbuser="root";
$dbpass="";
$dsn="mysql:host={$localhost},dbname={$dbname},charset=utf8";
$pdo=new PDO($dsn, $dbuser, $dbpass);
$sql="SELECT menu FROM foods WHERE menu LIKE :key";
$stmt=$pdo->prepare($sql);
$stmt->bindValue(":key","%".$_POST["key"]."%",PDO::PARAM_STR);
$stmt->execute();
?>
<!DOCTYPE html>
<html land="ja">
<head>
<meta charset="utf-8">
<title>あいまい検索</title>
</head>
<body>
<form action="" method="post">
<p>
<input type="search" name="key">
<button type="submit">検索</button>
</p>
</form>
</body>
</html>
全体を分岐する
$flagでわかりやすくキーワードありとしておく
それがあるときだけ回す
ループ処理でフェッチしながらリストで書き出し
リストの中でwhileする
endwhileは先回りして記述しましょう
flagがfalseの場合も記述しておかないと
flagってなんだそんな変数ないよになってしまう
フェイタルエラーがでましたが原因は一行上のここ
list.php
<?php
if(!empty($_POST["key"])){
$flag=true;
$host="localhost";
$dbname="lunch";
$dbuser="root";
$dbpass="";
$dsn="mysql:host={$host};dbname={$dbname};charset=utf8";
$pdo= new PDO($dsn,$dbuser,$dbpass);
$sql="SELECT menu FROM foods WHERE menu LIKE :key";
$stmt=$pdo->prepare($sql);
$stmt->bindValue(":key","%".$_POST["key"]."%",PDO::PARAM_STR);
$stmt->execute();
}else{
$flag = false;
}
?>
<!DOCTYPE html>
<html land="ja">
<head>
<meta charset="utf-8">
<title>あいまい検索</title>
</head>
<body>
<form action="" method="post">
<p>
<input type="search" name="key">
<button type="submit">検索</button>
</p>
</form>
<?php if($flag): ?>
<ul>
<?php while($row=$stmt->fetch(PDO::FETCH_ASSOC)): ?>
<li><?php echo htmlspecialchars($row["menu"],ENT_QUOTES); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
</body>
</html>
<p><?php echo htmlspecialchars($_POST["key"],ENT_QUOTES); ?> の検索結果</p>
があってるかきく
→
よろしいらしい。よかった。
<?php
if(!empty($_POST["key"])){
$flag=true;
$host="localhost";
$dbname="lunch";
$dbuser="root";
$dbpass="";
$dsn="mysql:host={$host};dbname={$dbname};charset=utf8";
$pdo= new PDO($dsn,$dbuser,$dbpass);
$sql="SELECT menu FROM foods WHERE menu LIKE :key";
$stmt=$pdo->prepare($sql);
$stmt->bindValue(":key","%".$_POST["key"]."%",PDO::PARAM_STR);
$stmt->execute();
}else{
$flag = false;
}
?>
<!DOCTYPE html>
<html land="ja">
<head>
<meta charset="utf-8">
<title>あいまい検索</title>
</head>
<body>
<form action="" method="post">
<p>
<input type="search" name="key">
<button type="submit">検索</button>
</p>
</form>
<?php if($flag): ?>
<p><?php echo htmlspecialchars($_POST["key"],ENT_QUOTES); ?> の検索結果</p>
<ul>
<?php while($row=$stmt->fetch(PDO::FETCH_ASSOC)): ?>
<li><?php echo htmlspecialchars($row["menu"],ENT_QUOTES); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
</body>
</html>