//tips
//php理解
前回の続きを見ていく。whereで指定した条件に一致する行を取得したら、それらをprepareメソッドの引数にする。
prepareメソッドはsqlがセットされたPDOStatementインスタンスを返し、このsql文を実行するためにPDOStatementクラスのexecuteメソッドを使用し、?の中にある値を引数に設定してあげる。
今回の場合はテキスト入力したものを?に入れたいので$sql->execute([$_REQUEST[‘keyword’]]);としている。
前のページの入力内容を遷移先でも適応させたい場合はprepareを使用して、PDOStatementクラスのexecuteメソッドを使用できる形を整えてあげる必要があるよう。
これによりselect * from product where name=?がselect * from product where name=‘カシューナッツ’に変換できる。
<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){
…
}
?>
executeで実行した結果はPDOStatementクラスのfetchallメソッドで取得することができる。$sqlはPDOStatementを代入しているのでfetchallメソッドが使用できる。as以下は結果を代入する変数を置き、商品名を出力するときはecho ‘<td>’,$row[‘name’],’</td>’;とする。
今度は部分一致での条件検索をを確認する。
部分一致にする場合はselect * from product where name like ‘’%ナッツ%’;のようにsqlのselect文のwhereの条件式でlikeを使用すると文字列の比較を行うことができる。前後に%を付け加えることで部分一致とすることができる。
pdo=new PDO(‘mysql:host=localhost;dbname=shop;charset=utf8’,’staff’,’pasword’);
$sql=$pdo->prepare(‘select * from product where name like ?’);
$sql->execute(‘%’,[$_REQUEST[‘keyword’]],’%’);
=部分をlikeに変更し、executeの引数に%を追加すると部分一致に先のものを変更することができる。not likeにすれば指定した語句を含まないものを検索することができる。
商品名と価格を入力してデータベースに商品データを追加する機能を確認していく。
insert into product values(null,’バターナッツ’,200);
Insertは先日やったように指定したテーブルに対して新しい行を追加できるものでinsert into productでproductテーブルに新しい行を追加している。
設定する行の値はvalues以降に記述していく事になる。
簡単なページを作成すると、下記で商品名と価格の入力画面を作成できる。
<p>商品を追加します</p>
<form action=“insert-output.php” method=“post”>
商品名<input type=“text” name=“name”>
価格<input type=“text” name=“price”>
<input type=“submit” value=“追加”>
</form>
ここで記入したものをphp側で表示させるので、
<?php
$pdo=new PDO(‘mysql:host=localhost;dbname=shop;charset=utf8’,’staff’,’pasword’);
$sql=$pdo->prepare(‘insert into product values(null,?,?)’);
if($sql->execute([$_REQUEST[‘name’],$_REQUEST[‘price’]])){
echo ‘追加に成功しました’;
}else{
echo ‘追加に失敗しました’;
}
?>
Executeで?部分の配列を記述した商品名と価格で埋めて表示している。
入力フォームで値を設定したい部分は?にしておき、[$_REQUEST[‘name’],$_REQUEST[‘price’]]で取得したものを代入するようにしている。
入力した値が適切かを確認する場合は、if(empty($_REQUEST[‘name’]))やhtmlspecialchars($_REQUEST[‘name’])、!preg_match(‘/[0-9]+/’,$_REQUEST[‘price’])を使用する。
empty(値)は指定した値がからの時にtrueを返す。preg_matchは正規表現によるパターンマッチを行う関数。引数にパターンと入力文字列を取る。
特にユーザが入力した情報をsql文に含める際には注意が必要で単純に文字列結合をするのではなく、prepareとexecuteを使用して安全性を高めておく。
データベースの内容を更新する場合には、
update product set name=‘松の実’,price=900 where id=1;
このように書くことでid=1の一行目のデータが更新される。商品名、価格だけを変更させることもできる。
updateを使用することで指定したテーブルの指定した行で、指定した列の値を更新することができる。
Name列の値を更新する場合は、update product set nameと書くだけで変更できる。
update テーブル名 set 列名=値,...
商品更新ページ用のphpをかくと、
<?php
$pdo=new PDO(‘mysql:host=localhost;dbname=shop;charset=utf8’,’staff’,’pasword’);
foreach($pdo->query(‘select * from product’ as $row){
echo ‘<tr><form action=“update-output.php” method=“post”>’;
echo ‘<input type =“hidden” name=“id” value=“‘,$row[‘id’],’”>’;
echo ‘<td>’,$row[‘id’],’</td>’;
echo’<td>’;
echo’<input type=“text” name=“name” value=“‘,$row[‘price’],’”>’;
…
}
}
?>
ここではformタグとinputタグを使用して商品名と価格の入力画面を作成しており、その入力をechoの中身の$row[‘price’]などで出力している。
商品を更新する際には商品番号が必要なためinput type=“hidden”を使い、裏で商品番号を記載している。