//tips
//php理解
昨日の続きでphpからデータベースに接続するPDOと呼ばれる機能について引き続く確認する。
$pdo=new PDO(‘mysql:host=localhost;dbname=shop;charset=utf8’,’staff’,’password’);
mysqlはMySQL接続を表し、
host=localhost;はMySQLのインストール先であるlocalhostを指定。
dbname=shop;はshopデータベースの利用を表す。
charset=utf8は文字列コードの指定。
第二引数は接続先のユーザ名をとり、’staff’。
第三引数はパスワードでユーザを作成する際に指定したpasswordを使用する。
データベースに接続できたので、商品一覧を取得して、ブラウザに表示していく。
<?php
$pdo=new PDO(‘mysql:host=localhost;dbname=shop;charset=utf8’,’staff’,’password’);
foreach($pdo->query(‘select * from product’)) as $row){
echo ‘<p>’;
echo$row[‘id’],’:’;
echo$row[‘name’],’:’;
echo$row[‘price’],’:’;
echo‘</p>’;
}
?>
これを実行すると
1:松の実:700
…
商品番号:商品名:価格というかたちで表示されていく。
$pdo->query(‘select * from product’))では、pdoクラスのqueryメソッドを呼び出し、queryは引数に指定したsql文をデータベースに対して実行するので、今回はselect文によりテーブルの全ての列を取得している。
メソッドを呼び出すには->を使用する点では他の言語の.と異なる。ラムダ式と勘違いしないこと。
PDOの変数->query(’SQL文’)
複数行のデータを順に処理するためにforeachを用いている。$pdo->query(‘select * from product’)が1セットのデータ群でそれに対して$rowで一行ずつ引き出している。
$row[‘id’]では取得した行からidの列を取り出し、列名を配列の[]内に指定する。
Echoの場合は,で連結できるので’:’とすれば表示先で連結させることができる。
<p>をつけてあげることでブラウザが改行しながら表示をできるようにしている。
先の例ではechoの繰り返しが多いので下記のように<p>タグの中に挿入することでまとめてあげることができる。
foreach($pdo->query(‘select * from product’)) as $row){
echo “<p>$row[id]:$row[name]:$row[price]</p>”;
}
ダブルクウォートを使用してあげることで文字列の中に、変数の値を組み込むことができるので、
$row[‘name’]の表示を”$row[name]”のようにできる。
今後はシングルクウォートとの使い分けを意識して行うようにする。
さらにwebページ上で表として表示したい場合にはhtmlの表作成タグを使用して記述していく。
<table>:テーブルの定義
この後に<tr>や<th>などが続く。
<tr>:テーブル内部の一行の定義
<table>の次に来るもので一行をくくるもの。この中に<th>または<td>が入る。
<th>行の内部にタイトルセルの追加
基本的には最初の<tr>の中に記載される。タイトル部分。
<td>行の内部にデータセルの追加
タイトルの順番に合わせて1列ずつ<td>で囲んでいく。
<table>
<tr><th>商品番号</th><th>商品名</th><th>価格</th></tr>
<?php
$pdo=new PDO(‘mysql:host=localhost;dbname=shop;charset=utf8’,’staff’,’password’);
foreach($pdo->query(‘select * from product’)) as $row){
echo ‘<tr>’;
echo ‘<td>’,$row[‘id’], ‘</td>’;
echo‘<td>’,$row[‘name’], ‘</td>’;
echo‘<td>’,$row[‘price’], ‘</td>’;
echo‘</tr>’;
echo “¥n”
}
?>
</table>
<th>部分はphpの記載内容とは関係ないので<?php?>の外に記述している。そのため’’などでわざわざ囲む必要がなくなっている。
echo “¥n”では¥nが文字列内で改行を表すものでこれは””で囲む必要がある。シングルで囲んでしまうとそのまま文字を出力してしまうので要注意。
データベースから取得したデータを出力する際にhtmlで特殊な働きを持つ文字が含まれてしまうとweb表示が想定したものと異なる場面が生じてしまうので、念の為、データベースから取得する文字はhtmlspecialcharsで特殊効果を無効にしておく。
echo ‘<td>’,htmlspecialchars($row[‘id’]), ‘</td>’;
echo‘<td>’,htmlspecialchars($row[‘name’]), ‘</td>’;
echo‘<td>’,htmlspecialchars($row[‘price’]), ‘</td>’;
phpは多数の定義ずみの関数があるが、自分で関数を作成することもできる。
その場合は、
function 関数名(引数,...){
処理;
…
return 返り値;
}
という見慣れた形となる。
今度はSQLで商品名を検索していく。
select * from product where name=‘カシューナッツ’;
Whereはselect文の中で検索の条件を指定する。name列が‘カシューナッツ’である行を検索している。
商品検索機能を実装すると、
商品名を入力してください。
<form action=“search-output.php” method=“post”>
<input type=“text” name=“keyword”>
<input type=“submit” value=“検索”>
</form>
このようになり、ここから遷移先のphpの方を記載していく。
<table>
<tr><th>商品番号</th><th>商品名</th><th>商品価格</th></tr>
<?php
$pdo=new PDO(‘mysql:host=localhost;dbname=shop;charset=utf8’,’staff’,’pasword’);
$sql=$pdo->prepare(‘select * from product where name=?’);
$sql->execute([$_REQUEST[‘keyword’]]);
foreach($sql->fetchAll() as $row){
…
}
?>
こうすると商品名を検索枠に入力し検索ボタンを押すと、商品番号、商品名、商品価格が表示される。
PDOクラスのprepareメソッドとPDOStatementクラスのexecuteメソッドを使用しており、prepareメソッドはsql文を実行する準備を行い、?の箇所には後から好きな値を設定することができる。
Selectで取得したテーブルの中からwhereの条件に一致する行を取得する。