MAMP
MAMP(Macintosh、Apache、MySQL、PHP)は、macOS上でウェブ開発をサポートするソフトウェアパッケージです。これにより、ウェブサイトやウェブアプリケーションの開発に必要なPHP、MySQL、Apache環境を手軽に構築できます。
PHPでレストラン検索サイトを作るポイント
入力して検索求める部分
探したい「店名」を <input>:要素で既定の"text" とフォームを送信するボタン "submit" を用いて送信方法を「 method="POST" 」に設定して「action="〇〇.php"」〇〇ファイルに送り込む。
<h3>レストラン店名検索</h3>
<form action="search_receive.php" method="POST">
<label for="name">??</label>
<input type="text" id="name" name="name" placeholder="店名を入力">
<input type="submit" value="検索する">
</form>
求められたデータを受け取って検索して返す部分
$_SERVER[ ];サーバー変数は連想配列で['キー名']という形で呼び出す、PHPで送信データ判別し取得するHTTPリクエストメソッドREQUEST_METHOD。
<?php
if($_SERVER['REQUEST_METHOD'] === 'POST'){
$name = $_POST['name']; //フォームの入力値代入
}
⌈データベースPDO接続と処理⌋
「プレースホルダ」という仕組みを使って、以下のように変動値を安全にSQL文に割り当てるわけですが、
この後「prepare( )」と「bindValue( )」と「execute( )」を使う。
$sql = "SELECT カラム名, price, name FROM テーブル名 WHERE name like :name";
バインド変数は、 データベースの場合は、変数名(ここでは「name」)の頭にコロン(:)を付けて(:name)と表記する。
$dsn = 'mysql:dbname=データベース名;host=localhost;charset=utf8';
$user = 'root';
$password = 'root';
$data = []; //配列として初期化arry()以外 短縮構文でも使える
try{
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//エラーが発生処理する
$sql = "SELECT カラム名, price, name FROM テーブル名 WHERE name like :name";
//構文 likeは「~を含む」曖昧検索する
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':name', '%'.$name.'%', PDO::PARAM_STR);
//変数を当てる %はワイルドカードと言う
$stmt->execute();
$count = $stmt->rowCount(); //対象の行数分のカウントを取得
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
//結果セットをオブジェクトとして取得してwhileする
$data[] = $row;
}
}catch (PDOException $e){
echo($e->getMessage());
die();
}
?>
行は連想配列で扱うな、クラスに定義する
⌈配列として項目(カラム名)を取り出し表示する処理 ⌋
⌈foreach($data as $row): ⌋ の部分について
Foreachは"一次元配列と、連想配列"の繰り返し処理できる
<h1>レストラン一覧 </h1>
<p> <?php echo $count;?>件見つかりました。 </p>
<table border=1>
<tr> <th>地区 </th> <th>店名 </th> <th>価格帯 </th> </tr>
<?php foreach($data as $row):
/*二次元配列になっているのでforeachで配列キーはカラム名を指定する*/?>
<tr>
<td> <?php echo $row['address'];?> </td>
<td> <?php echo $row['name'];?> </td>
<td> <?php echo $row['price'];?> </td>
</tr>
<?php endforeach; ?>
</table>