#知恵袋への回答が長くなってうまく投稿できないので(汗

 

下記の質問での「検索のSQL文をどう組み立てるか」の話です。

 

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14189454954

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12189472122

 

テストデータを用意します(phpスクリプトはutf-8)。

<?php
try {
    $dsn = 'mysql:host=localhost;dbname=test;charset=utf8';
    $user = 'root';
    $pass = '';
    $pdo = new PDO($dsn, $user, $pass, [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]);

    $pdo->query('DROP TABLE IF EXISTS table1');
    $pdo->query('CREATE TABLE table1 (
                number int(11) PRIMARY KEY NOT NULL,
                name varchar(12) CHARACTER SET utf8 NOT NULL,
                sex varchar(8) CHARACTER SET utf8 NOT NULL
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8;');
    echo "table make end<br>";
    $stmt = $pdo->prepare('insert into table1 (number, name, sex) values (?, ?, ?)');
    $stmt->execute([1, '山田 太郎', '男']);
    $stmt->execute([12, '田中 一郎', '男']);
    $stmt->execute([23, '鈴木 花子', '女']);
    $stmt->execute([37, '田中 洋子', '女']);
    echo "record insert end<br>";
} catch (PDOException $e) {
    die($e->getMessage());
}

で、検索のスクリプトはこんな感じ

<form action="" method="post">
<div>
氏名 <input type="text" name="name">
</div>
<div>
性別
<input type="checkbox" name="sex[]" value="男">男
<input type="checkbox" name="sex[]" value="女">女
</div>
<br>
<input type="submit" value="検索">
</form>
<?php
if (!$_POST) { exit; }
// POSTデータがあったら、以下の処理を行う
try {
    $dsn = 'mysql:host=localhost;dbname=test;charset=utf8';
    $user = 'root';
    $pass = '';
    $pdo = new PDO($dsn, $user, $pass, [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]);

    $where = []; // where condition
    $data = []; // executeで渡すデータ

    // 名前がPOSTされていたら
    if ((isset($_POST['name']))&&(is_string($_POST['name']))) {
        $name = trim($_POST['name']);
        if ($name !== '') {
            $where[] = '(name like ?)';
            $data[] = '%' . addcslashes($name, '¥_%') . '%';
            // https://qiita.com/mpyw/items/b00b72c5c95aac573b71
        }

    }
    
    // 性別がPOSTされていたら
    if ((isset($_POST['sex']))&&(is_array($_POST['sex']))) {
        $tmp = [];
        foreach ($_POST['sex'] as $val) {
            $tmp[] = '(sex = ?)';
            $data[] = $val;
        }
        // 性別は or 条件で追加
        $where[] = '(' . implode('or', $tmp) . ')';
    }

    // SQL文組み立て&実行
    if (count($where) === 0) {
        $stmt = $pdo->query('select * from table1 order by number');
    } else {
        $stmt = $pdo->prepare('select * from table1 where ' . implode('and', $where) . ' order by number');
        $stmt->execute($data);
    }

    // データ取得&表示
    while ($row = $stmt->fetch()) {
        printf('%d:%s:%s<br>', $row['number'], $row['name'], $row['sex']);
    }
    echo "<hr>";
} catch (PDOException $e) {
    die($e->getMessage());
}

エラー処理などは手抜きです(dieで停止させてる)のでキチンと書き替えないとダメですけど、検索でのSQL組み立てがメインなので(汗

関連する記事
コメント
コメントする