忍者ブログ

からすまる日誌

20200309pm01 あいまい検索

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

20200309pm01 あいまい検索

あいまい検索
 
$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>
 
 
PR

コメント

ブログ内検索

カレンダー

03 2025/04 05
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30