

DBのデータを抽出できる検索ページを作りました。（index.php）  
ただ、条件を指定してもその条件通りのレコードを上手くDBから引っ張って来れません、、、

[実現したいこと]  
以下の検索フォーム(index.html)にて、検索した条件とマッチするにレコードをブラウザに表示させたいです。

[うまくいっていること]

[code]

    print $sql.";<br>".PHP_EOL;
    print_r($data);
    
[/code]

上記の結果は以下の通りブラウザに表示されます。（都道府県->東京、分類->保育園で指定した場合）

[code]

    SELECT * FROM zenkoku where 1AND prefecture = ? AND type = ? ;
    Array ( [0] => 東京都 [1] => 保育園 )
    
[/code]

[うまくいかないこと]  
上記の[うまくいっていること]の場合でもそのほかの場合でも下記のようなエラーが出ます。

[code]

    Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'prefecture = '東京都' AND type = '保育園'' at line 1
    
[/code]

[教えて欲しいこと]  
エラーがなぜ出ているかと、その原因をご教示いただけますか？

[環境]  
ローカル開発環境、MacOSX,mysql

index.html

[code]

    <!DOCTYPE html>
    <html lang="ja">
    <head>
    <meta charset="UTF-8">
    <tittle>入力フォーム</title>
    </head>
    <body>
    <form method="post" action="SEARCH_Show.php"><br>
    名称<br>
    <input type="text" name="name" size="60" maxlength="30" value=""><br>
    電話番号<br>
    <input type="tel" name="tel" size="30" maxlength="12" value=""><br>
    担当者名<br>
    <input type="text" name="person_name" size="30" maxlength="20" 
    value=""><br>
    都道府県<br>
    <select name="prefecture"><br>
    <option value="全て">全て</option>
    <option value="東京都">東京都</option>
    <option value="神奈川県">神奈川県</option>
    <option value="千葉県">千葉県</option>
    <option value="埼玉県">埼玉県</option>
    <option value="北海道">北海道</option>
    <option value="宮城県">宮城県</option>
    <option value="愛知県">愛知県</option>
    <option value="大阪府">大阪府</option>
    <option value="福岡県">福岡県</option>
    </select><br>
    市区町村<br>
    <input type="text" name="city" size="30" maxlength="30" value=""><br>
    分類<br>
    <select name="type"><br>
    <option value="全て">全て</option>
    <option value="保育園">保育園</option>
    <option value="幼稚園">幼稚園</option>
    <option value="サークル">サークル</option>
    <option value="その他">その他</option>
    </select><br>
    <button type="submit" class="">検索</button>
    </form>
    </body>
    </html>
    
[/code]

index.php

[code]

                <?php
                require 'Manager.php';
                require 'Escape.php';
                ini_set('display_errors',1);
                ?>
                <!DOCTYPE html>
                <html lang = "ja">
                <head>
                <meta charset ="UTF-8">
                <tittle>登録ページ</tittle>
                </head>
                <body>
                <table border='1' class="TableStyle1" width="1000">
                <tr>
                <th>名称</th>
                <th>都道府県</th>
                <th>市区町村</th>
                <th>番地</th>
                <th>区分</th>
                <th>電話番号</th>
                <th>担当者名</th>
                <th>部数</th>
                <th>設置/配布</th>
                <th>消去</th>
                </tr>
                <?php
                try{
                    $db = connect();
                     $name=filter_input(INPUT_POST,'name');
                     $tel=filter_input(INPUT_POST,'tel');
                     $person_name=filter_input(INPUT_POST,'person_name');
                     $prefecture=filter_input(INPUT_POST,'prefecture');
                     $city=filter_input(INPUT_POST,'city');
                     $type=filter_input(INPUT_POST,'type');
    
    
                     if(!is_null($name)){
                     $sql = "SELECT * FROM zenkoku where 1";
                     $data=[];
                     }
                     if($name!==""){
                     $sql.="AND name = ?" ;
                     $data[]=$name;  
                     }
                     if($tel!==""){ 
                     $sql.= "AND tel = ? "; 
                     $data[]=$tel;
                     }
                     if($person_name!==""){
                     $sql.= "AND person_name = ? ";
                     $data[]=$person_name;
                     }
                     if($prefecture!=="全て"){
                      $sql.= "AND prefecture = ? ";
                      $data[]=$prefecture;
                      }
                     if($city!==""){
                      $sql.= "AND city = ? ";
                      $data[]=$city;
                      }
                     if($type!==""){
                     $sql.= "AND type = ? ";
                     $data[]=$type;
                     }
                     print $sql.";<br>".PHP_EOL;
                     print_r($data);
                     $stmt = $db->prepare($sql);
                     $stmt->execute($data);
                while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
                ?>
                 <tr>
                       <td><?php es($row['name']);?></td>
                       <td><?php es($row['prefecture']);?></td>
                       <td><?php es($row['city']);?></td>
                       <td><?php es($row['address']);?></td>
                       <td><?php es($row['type']);?></td>
                       <td><?php es($row['tel']);?></td>
                       <td><?php es($row['person_name']);?></td>
                       <td><?php es($row['copies']);?></td>
                       <td><?php es($row['set_type']);?></td>
                   </tr>
                <?php
                }
                }catch(PDOException $e){
                  echo $e->getMessage();
                  exit;
                }
                ?>
                </table>
                </body>
                </html>
    
[/code]


CC BY-SA 3.0
2017-11-26T14:28:43.190
39863
2017-11-27T02:45:59.360
2017-11-26T20:26:17.183
3068
26337
question
php mysql sql
phpで検索ページを作りDBから条件通りのレコードを抽出したい


吐き出されているSQLを確認すると `1AND`と 本来 `1 AND` とスペースで区切られる部分が区切られていないようです。

PHPのSQLの成形部分で全てに前後に空白を加えると正しいSQLが発行できると思います。

[code]

    $sql = "SELECT * FROM zenkoku where 1 ";
    
[/code]


CC BY-SA 3.0
2017-11-27T02:45:59.360
39873
2017-11-27T02:45:59.360
22665
39863
answer