忍者ブログ

からすまる日誌 mySQL

授業ノートのまとめ

高度(7) あいまい検索

×

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

高度(7) あいまい検索

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

コメント

ただいまコメントを受けつけておりません。

プロフィール

HN:
karasumaru
性別:
非公開

P R