PHPでDB操作(14)
さて、フォームからPOSTで渡される値はPHPでは$_POSTという変数に配列として格納されます。この$_POSTというのはスーパーグローバル変数といって、すべてのコードから参照できる変数となっています。この「変数」というのはプログラムの中では重要な要素を占めていて、それだけで相当量の説明が必要なものなのですがここでは割愛します。かんたんに言うと、どこからでも参照できるものと捉えて問題ないかと思います。
で、今回の場合、inputのname属性に与えられた"kensaku"というキーを元にして、先程の$_POSTの配列に格納されます。その値は$_POST["kensaku"]を参照することで得られます。これを踏まえて書いたコードがこちらです。
<?php
if(isset($_POST["kensaku"])){
$dsn ='mysql:dbname=DBNAME;host=localhost';
$user ='USERID';
$pass ='PASSWORD';
// DBへ接続
try{
$result="";
$dbh = new PDO($dsn, $user, $pass);
$toshi=" '%" . htmlspecialchars($_POST["kensaku"]). "%' ";
$sql="SELECT * FROM population WHERE shi like" . $toshi;
$stmt = $dbh->prepare($sql);
$stmt->execute();
$stmt_lst=$stmt->fetchALL(PDO::FETCH_ASSOC);
echo '<h2>検索結果</h2><hr><table><tr><th style="background-color:black;color:white;width:250px;height:50px;">都市名</th><th style="background-color:black;color:white;width:250px;height:50px;">男性人口</th><th style="background-color:black;color:white;width:250px;height:50px;">女性人口</th><th style="background-color:black;color:white;width:250px;height:50px;">合計</th><tr>';
foreach ($stmt_lst as $stmt) {
echo '<tr>';
echo '<td style="background-color:lightgrey;height:50px;">' . $stmt['shi'] . '</td>';
echo '<td style="background-color:lightgrey;height:50px;">' . $stmt['male'] . '</td>';
echo '<td style="background-color:lightgrey;height:50px;">' . $stmt['female'] . '</td>';
echo '<td style="background-color:lightgrey;height:50px;">' . $stmt['total'] . '</td></tr>';
}
echo '</table>';
}
catch(PDOException $e){
print("データベースの接続に失敗しました".$e->getMessage());
die();
}
}
// 接続を閉じる
$dbh = null;
?>
isset($_POST["kensaku"]) は$_POST["kensaku"]の値がセットされているかを見る関数です。if文でセットされていれば、if文内のコードが実行される仕組みです。この判定分をしておかないと、値があろうがなかろうがPHPのコードが実行されてしまうので、結果としてエラーとなるのを防ぐ目的があります。
その後DBへ接続し、$toshiという別の変数に$_POST["kensaku"]の値を代入するわけですが、このときに注意すべきこととしてクロスサイトスクリプティングというものがあります。詳しくは以下のwikipediaを参照していただくこととして、つまるところ安全性のためです。
この安全性をphpではhtmlspecialcharsという関数で処理することで担保しています。
次に、曖昧検索を可能にするためにワイルドカードを使用しています。
つまり、仙台でも仙台市でも”仙台市”の結果が得られるわけです。これはSQLでDBを操作する手前、SQLでのワイルドカードの使い方となっています。
それがこの一行です。
$toshi=" '%" . htmlspecialchars($_POST["kensaku"]) . "%' ";
これの説明はまた次回。