質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.94%

検索フォームについて(複数のフィールドから検索できるようにしたいです)

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,216

score 8

人の名前や電話番号や性別という複数のフィールドから検索し、表示できるようにしたいのですが(例:検索フォームに男と打ったら検索結果に人の名前と電話番号と性別が出てくる等にしたいです)
エラー文にこう出てきます
「Warning: PDOStatement::bindValue() expects at most 3 parameters, 5 given in /○○○/○○○/○○○/○○○/○○○/search.php on line 28」と
「Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in /○○○/○○○/○○○/○○○/○○○/search.php on line 30」というエラーは色々調べた結果出なくなったのですが「検索失敗しました。」と出てきます
教えてくださったら助かります
よろしくお願い致します

コードがこちらです

hitoがテーブル名です
name,tel,sexがフィールド名(名前、電話番号、性別)です

<?php
header("Content-type: text/html; charset=utf-8");

if(empty($_POST)) {
header("Location: search.html");
exit();
}else{
//名前入力判定
if (!isset($_POST['yourname'])  || $_POST['yourname'] === "" ){
$errors['hito'] = "入力されていません。";
}
}

if(count($errors) === 0){

$dsn = 'mysql:host=○○○';'dbname=○○○;charset=utf8';
$user = '○○○';
$password = '○○○';

try{
$dbh = new PDO($dsn, $user, $password);
$statement = $dbh->prepare("SELECT * FROM hito where name LIKE (:name) and tel LIKE (:tel)");

if($statement){
$yourname = $_POST['yourname'];
$like_yourname = "%".$yourname."%";
//プレースホルダへ実際の値を設定する
$statement->bindValue(':name', $like_yourname, PDO::PARAM_STR);
$statement->bindValue(':tel', $like_yourname, PDO::PARAM_STR);
if($statement->execute()){
//レコード件数取得
$row_count = $statement->rowCount();

while($row = $statement->fetch()){
$rows[] = $row;
}

}else{
$errors['error'] = "検索失敗しました。";
}

//データベース接続切断
$dbh = null;    
}

}catch (PDOException $e){
print('Error:'.$e->getMessage());
$errors['error'] = "データベース接続失敗しました。";
}
}

?>

<!DOCTYPE html>
<html>
<head>
<title>検索結果</title>
<meta charset="utf-8">
</head>
<body>

<?php if (count($errors) === 0): ?>

<p><?=htmlspecialchars($yourname, ENT_QUOTES, 'UTF-8')."さんで検索しました。"?></p>
<p><?=$row_count?>件です。</p>

<table border='1'>
<tr><td>名前</td><td>性別</td></tr>

<?php 
foreach((array)$rows as $row){
?> 
<tr> 
<td><?=$row['name,tel,sex']?></td> 
</tr> 
<?php 

?>

<?php elseif(count($errors) > 0): ?>
<?php
foreach($errors as $value){
echo "<p>".$value."</p>";
}
?>
<?php endif; ?>

</body>
</html>

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2018/03/11 21:02

    エラーメッセージに書かれている通りなのに、何がわからないのでしょうか?

    キャンセル

  • Orlofsky

    2018/03/11 21:41

    質問のプログラムコードは[対応しているMarkdownの機能](https://teratail.com/help#about-markdown) の[コードを入力]を使いましょう。

    キャンセル

回答 3

+2

全体的な流れとしてはこうするとよいでしょう

<?PHP
foreach(["name","tel","sex"] as $val){
  $$val=filter_input(INPUT_POST,$val);
}

$data=[];
$sql="SELECT * FROM hito where 1 ";
if(is_null($name)){
  $sql.=" and 0 ";
}else{
  foreach(["name","tel","sex"] as $val){
    if($$val!==""){
      $sql.="and {$val}=? ";
      $data[]=$$val;
    }
  }
}
print $sql.";<br>";
print_r($data);
/* 実際には以下のような処理
  $stmt = $pdo->prepare($sql);
  $stmt->execute($data);
  $rows=$stmt->fetchAll(PDO::FETCH_ASSOC);
  print_r($rows);
*/
?>
<form method="post">
<input type="text" name="name" placeholder="name"><br>
<input type="text" name="tel" placeholder="tel"><br>
<input type="text" name="sex" placeholder="sex"><br>
<input type="submit" value="go">
</form>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/12 10:01

    おそらくname,tel,sexのどれか入力されたものを使って
    and検索をしたいのだと思いますのでサンプルをあげておきました

    キャンセル

+1

以下の部分でSQLが正しくないですね。
バインドもそうですけど、いきなりlikeで始まってますし。

$statement = $dbh->prepare("SELECT * FROM hito where name = :name and tel = tel and sex = :sex LIKE (:name,:tel,:sex)");

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/11 21:19

    すみません、これをどう直せばいいでしょうか?質問だらけで申し訳ありません

    キャンセル

  • 2018/03/11 21:41

    SQLが明らかにおかしかったので回答しましたが、すみませんPHPには詳しくないです。
    抽出条件も単に(名前、電話番号、性別)のANDでいいなら、以下になります。
    where name = :name and tel = :tel and sex = :sex
    ですが、バインド変数に値がうまく設定されているか良くわかりませんし、条件って可変じゃなくてよいのか?って気がします。

    キャンセル

  • 2018/03/11 22:21

    ご回答ありがとうございます。自分の勉強不足なのでもっと勉強しようと思います
    ありがとうございました。

    キャンセル

-1

Warning: PDOStatement::bindValue() expects at most 3 parameters, 5 given

PDOStatement :: bindValue()は最大で3つのパラメータが許可されていますが、5つ与えられています。(Google翻訳ほぼそのまま)

コードに行数がないので見た感じですが、エラーとなっているのは下記ですね。

$statement->bindValue(':name',':tel',':sex', $like_yourname, PDO::PARAM_STR); 

使い方間違ってます。

エラーメッセージは検索する癖をつけましょう。
Google翻訳にかければおおよそ意味は分かります。
そこからPHPマニュアルで機能の確認をすればほとんどのエラーは解決できます。

また、既に指摘されているようにSQLそのものも正しく組めていないので上記が解決したとしても想定通りには動かないと思いますので、指摘されている内容を参考にSQLも修正してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/12 08:37

    まあSQL、Bindをなおしても最低あと一つありますしね。

    キャンセル

  • 2018/03/12 09:29

    そこはなるべく本人に気づいてもらいたいところですね。
    おそらくそこもエラーとなるので、「エラーがでたらまず検索」の習慣化の1歩目として。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.94%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る