PHP + MySQL のデータ挿入

PHP + MySQL のデータ挿入
#03 データを挿入してみよう (1)
http://dotinstall.com/lessons/basic_php_advanced/6903
を参考に
プリペアステートメントを使ったDBへのデータ挿入を学習
SQL文をつくるとき
データをエスケープしなくてはならない場合
プリペアードステートメントを使うのが一般的
エスケープさせるのは
DB破壊されるのを防いだり
いろいろと悪意あるコードを使われるのを防ぐため
いままでは
query()をつかっていたけど
プリペアードステートメントを使う場合には
prepare() をつかってSQLを発行する
$stmt = $dbh->prepare(“insert into users(name,email,password) values(?,?,?)”);
values() の中身が
?,?,?
となっているけど、これはプレースホルダーといって
ここにはいる命令を次の文に埋め込むときに使われる
埋め込むには
execute() をつかい、配列で与える
今回なら
name = n
email = e
password = p
という単純なものにするので
$stmt->execute(array(“n”,”e”,”p”));
とする
最後にわかりやすくするため
echo “done”;
としてページを開くと
DBにデータがかきこまれている
確認するには
mysql -u root -p
でログインして
use blog_app;
select * from users;
で中身を確認すると
今回挿入した内容が反映されているのが確認できる
ちなみに、後から書き込むための
?,?,?
ではわかりにくい場合
別の書き方がある
この場合、?の代わりに :変数名
というようにする
今回なら
values (?,?,?)
の代わりに
values (:name,:email,:password)
というようにしている
この場合だと
execute() の中身も
execute(array(“n”,”e”,”p”))
から
連想配列のように
execute(array(“:name”=>”n2″,”:email”=>”e2″,”:password”=>”p2″)
というように
先にプレースホルダーで指定した
:変数名=>
が各値につくようになる
確認するには
mysql -u root -p
でログインして
use blog_app;
select * from users;
で中身を確認すると
今回挿入した内容が反映されているのが確認できる
どちらでも同じだけど
ソースコードのメンテなどの保守も考えると
わかりやすいほうを選ぶほうがよいと思う

PHP でDBのデータの表示

PHP でDBのデータの表示
#02 データを全件表示してみよう
http://dotinstall.com/lessons/basic_php_advanced/6902
を参考に
DBアクセスして、テーブル内のデータ全件表示方法を学習
そして、レコード件数の表示についても学習
今回は処理について
sql 文は、PHPの場合変数へ格納することができる
$sql =”select * from users”;
そして、この変数に格納したSQLを実行するには
query()
を使う
この query() で実行された結果も
PHPなら変数へ格納することが可能
$stmt =$dbh->query($sql);
ちなみに、$dbh は
接続するDB情報が格納されている変数で
$dbh = new PDO(‘mysql:host=localhost;dbname=blog_app’,’dbuser001′,’dbpwd0001′);
となっている
この変数に格納されたSQL実行結果の取りだしには
fetchAll() を使う
今回は
$stmt に格納されているので
$stmt->fetchAll(PDO::FETCH_ASSOC)
というようにする
これを foreach() でまわしながら取得する
foreach($stmt-?fetchAll(PDO::FETCH_ASSOC) as $user){
var_dump($user[‘name’]);
}
これは
$stmt->fetchAll(PDO::FETCH_ASSOC)
の中身を
$user に1つずつとりだして代入している
var_dump() のところの
$user は、いわばDBの内容になる
そして、
$user[‘name’]

name は
DB の users にある name の部分ということ
これを追記して
結果が
string(7) “taguchi” string(6) “tanaka” success!
というようになれば成功
おなじになっているのか確かめるには
mysql -u root -p
でログインして
use blog_app;
select * from users;
を実行して、この結果とおなじか確かめることができる
次に、件数の表示
これは
まずは、query() の中に件数を表示するSQLを記述
$dbh->query(“select count(*) from users”)
そして、この結果を
fetchColumn() で取得
これで件数がわかるので
echo で出力すればOK
あとは、わかりやすいように
PHP では . で javascript の + みたいに文字をつなげられるので
. “records found”
というように文字をつなげる
これらをソースにすると
echo $dbh->query(“select count(*) from users”)->fetchColumn() . “records found”;
というようになる
これで
2records found
と表示される

PDO で DB接続

#01 データベースに接続してみよう
http://dotinstall.com/lessons/basic_php_advanced/6901
を参考に、PODによるDBの接続
ただし、DBが必要なので
先に作成しておく
つかうDBは今回は mysql
vim setdata.sql
で sql ファイルを作成
create database blog_app;
grant all on blog_app.* to dbuser@localhost identified by ‘dbpw0001′;
use blog_app;
create table users (id int(11) not null auto_increment primary key,name varchar(50),email varchar(255),password varchar(16));
insert into users(id,name,email,password) values(10,’taguchi’,’taguchi@gmail.com’,1234);
insert into users(id,name,email,password) values(11,’tanaka’,’taguchi-tanaka@gmail.com’,1234555);
という内容で保存
mysql -u root -p < setdata.sql でDB作成 作業ディレクトリ作成ということで mkdir /var/www/myphp ここに index.php を作成して実行 PHPからDB接続するには try{ 接続処理 }catch(){ 例外処理 } というようにする PDO接続するには $変数名 = new PDO(); というように書く 今回なら $dbh = new PDO(); ちなみに、 dbh はdata base handler の略 実際にDB接続するときの構文は $変数名 = new PDO('mysql:host=ホスト名;dbname=DB名','DBのユーザ名',.'DBのパスワード'); となる 今回は DB=blog_app ホスト名=localhost DBユーザ名 = dbuser001 DBパスワード = dbpw0001 なので $dbh = new PDO('mysql:host=localhost;dbname=blog_app','dbuser001','dbpwd0001'); となる 次にエラー処理 これは catch() のところに書く catch(PODException $e){ var_dump($e->getMessage());
exit;
}
として終了する
もし、DB切断にしたいのなら
$dbh =null;
というように
$dbh のような変数に null をいれればOK
catch(PODException $e){
のところは java などでもよくみるので
経験あるとわかりやすいかも
ちなみに、exception は例外という意味
そして、DB接続成功なら
echo “success!”;
と表示するようにする
これで
success
と表示されているなら成功

str_replace関数 と INNER JOIN について

str_replace関数は
検索文字列に一致したすべての文字列を置換し、置き換えた後の文字列を返す関数
参考サイトは
str_replace-文字列関数
$str = “PHP入門”;
$str = str_replace(“PHP”, “PHP5”, $str);
echo $str;
なら、置き換えしたあとには
PHP 入門

PHP5入門になる
str_replace (“検索文字列”, “置換え文字列”, “対象文字列”);
ということなので、そういうこと
で、応用
str_replace(“article_”, “”, $aid);
なら、
$aid のところを
article を “” つまり空にするということになる
次に
INNER JOIN について
参考サイトは
INNER JOINを使って表を結合する
構文は
SELECT 列名1,列名2,~列名n ← どの列を表示させるか
FROM 表名1 INNER JOIN表名2 ON 表名1.フィールド名 = 表名2.フィールド名
WHERE 抽出条件
SELECT *
FROM 売上表 INNER JOIN 顧客表 ON 売上表.顧客CD=顧客表.顧客CD
という例がのっていた
これは
売上表 INNER JOIN 顧客表
で売上表を 顧客表とくっつける
そして
ON 売上表.顧客CD=顧客表.顧客CD
なので
そのうち
売上表の 顧客CD
のところと
顧客表 の顧客CD
をくっつけるということ
SQLはまだまだ覚えることがおおそう

preg_grep() について

preg_grep() が少しわからなかったので、
検索
grep とかいてあるので、linux の grep コマンドみたいに
検索するものを想像したけど、ほぼあってるみたいです
パターンにマッチする値のみを取り出して新しい配列を作るようです
今回の参考サイトは
http://www.yc.tcu.ac.jp/~yamada/doc/php/0411.html
このサンプルをみたところ
$arr_str = array ( “123”,”456xyz”, “abc”, “deFG”,”abc\n”);
 $arr_res = preg_grep( “/^[a-z]+$/i”, $arr_str );
この場合、
/^[a-z]
は最初にアルファベット a ~z で始まるもの
ということなので、
“abc”, “deFG”,”abc
が該当になります
つまり、preg_grep () は
preg_grep(検索条件,対象の配列)
というようになるようです

mysqlik関数

PHP + MySQL でプログラミングするときに使うのが
mysqli()
です
これは、データベースに接続するのに使います
中身の解説をすると
mysqli(“接続するサーバー”,”ユーザー”,”パスワード”,”接続先DB”);
となります
よくある例としては
mysqli(“localhost”,”root”,””,”testDB”);
というかんじです
練習のため、ほとんどの書籍では
root ユーザでログインして、パスワードなしという
設定が多いようです
また、練習ということもあり、ほぼXAMPPが多く
phpMyAdmin を使うことが多くあります
XAMPP で phpMyAdmin にアクセスするには
http://localhost/phpMyAdmin
でアクセスしますが
ファイア・ウォールのポート開放ができているなら、
http://サーバーIPアドレス/phpMyAdmin
でも可能です

ページング処理 その2

続いて、前ページと後ろページの表示です
ページが膨大な数になると大変になってくるので、
DBとPHPを合わせると簡単表示できるようになります
<ul class=”paging”>
<li><a href=”index.php?page=<?php print($page -1); ?>”>
前のページへ
</a></li>
<li><a href=”index.php?page=<?php print($page +1); ?>”>
次のページへ
</a></li>
</ul>
ちなみに、ulタグですが
箇条書き 【タグ】:HTML入門
http://kumacrow.blog111.fc2.com/blog-entry-247.html
にかかれているように
箇条書きするためのタグです
ul で囲ったところが、箇条書きスペースとなり
li のところがその箇条書きになります
ただし、このままだと、pageがマイナスになることがあり、エラーになります
回避するため
pageが0以下にならないようにたするため
max()を使います
こはの関数は
指定した2つの数値のうち大きい方を適用するというもの
なので
$page = max($page,1);
とすれば
マイナスにならないというようになります

require を使って共通プログラム作成

C言語や java のソースコード のように
PHPも複数のソースコードに分けることができ、
そしてそれを共有することもできます
例えばDB接続の
<?php
mysql_connect(‘localhost’,’root’,”) die (mysql_error());
mysql_select_db(‘mydb’);
mysql_query(‘SET NAMES UTF8’);
?>

dbconnect.php というファイルに記述し
index.php で呼び出すには
require(‘dbconnect.php’);
というように
require(‘ファイルパス’);
というように記述します
ソースを分割するメリットは多くありますが
セキュリティ関係の向上や、メンテナンスのしやすさなどがあります
また、マッシュアップなどにも応用ができますので、
ぜひ覚えておきたいものです
マッシュアップ関連の書籍としては
アフィリエイターのための Web APIプログラミング入門

がわかりやすくおすすめです

データの一覧画面を作る場合

今回は DBから データを取得し、
一覧画面にする方法です
最初に PHPで MySQL のDB接続を行います
mysql_connect(‘localhost’,’root’,”) or die(mysql_error());
mysql_select_db(‘mysql’);
mysql_query(‘SET NAMES UTF8’);
続いて テーブルからデータを取得し、結果を変数 $recordSet へ格納します
$recordSet = mysql_query(‘SELECT * FROM my_items ORDER BY id DESC‘);
DESC を指定すると小さい順に並び替えします
そして、while文を使い、このループ機能を使うことで
全データを書き出します
while($table = mysql_fetch_assoc($recordSet){
print(htmlspecialchars($table[‘id’]);
print(htmlspecialchars($table[‘maker_id’]);
print(htmlspecialchars($table[‘item_name’]);
print(htmlspecialchars($table[‘price’]);
}
これで、データを表示することができます
print()で表示する時に
htmlspecialchars() を使っているのは
html で特殊な文字として扱われる記号などを表示するためです
詳しくは
特殊文字をHTMLエンティティに変換する
に載っていましたが
&lt; と記述しないと HTMLでは < となりません
こういった文字を適切に変換するために
htmlspecialchars() を使っています
ちなみにこれだけだとわけのわからない出力になってしまうため
テーブルにまとめます
<table width=”100%”>
<tr>
<th scope=”col”>ID</th>
<th scope=”col”>メーカー</th>
<th scope=”col”>商品名</th>
<th scope=”col”>価格</th>
</tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>
ちなみに、 scope=”col” はCSSの設定です
次に、PHPの処理を組み込みます
PHPのコードは <?php?>
で囲むことで、HTMLの中に部分的に組み込むことができます
<table width=”100%”>
<tr>
<th scope=”col”>ID</th>
<th scope=”col”>メーカー</th>
<th scope=”col”>商品名</th>
<th scope=”col”>価格</th>
</tr>
<?php
while($table = mysql_fetch_assoc($recordSet)){
?>

<tr>
<td><?php print(htmlspecialchars($table[‘id’]));?></td>
<td><?php print(htmlspecialchars($table[‘maker_id’]));?></td>
<td><?php print(htmlspecialchars($table[‘item_name’]));?></td>
<td><?php print(htmlspecialchars($table[‘price’]));?></td>
</tr>
<?php
}
?>

</table>
赤字にしたのが PHPを組み込んだ部分です
参考にした書籍では
PHPだけでなく
HTMLのタグ、そしてCSSの知識が必要なため、ある程度の経験が必要になっています
ちなみに、
メーカーを番号ではなく人の名前にするには
mysql_query()

$recordSet = mysql_query(‘SELECT * FROM my_items ORDER BY id DESC’);
となっているのを
$recordSet = mysql_query(‘SELECT m.name, i.* FROM makers m, my_items i
WHERE m.id=i.maker_id
ORDER BY id DESC’);
へ変更し
<td><?php print(htmlspecialchars($table[‘maker_id’]));?></td>

<td><?php print(htmlspecialchars($table[‘name’]));?></td>
と変更し保存します

配列のキーはASを使用する

PHP + mysql で
mysql_query() で COUNT を使って件数を取得すると
キーがわかりにくくなります
$recordSet = mysql_query(‘SELECT COUNT(id) FROM my_items’);
$data = mysql_fetch_assoc($recordSet);
とすると
画面に出力するためには
echo ‘件数は’ .$data[‘COUNT(id)’].’件です’;
というようにしますがわかりにくいです
ちなみに . は PHPで文字をつなげる効果ですので、
COUNT(id) が1なら
件数は1件です
というように表示されます
しかし、これではわかりにくいので
このため、対策として AS を使います
というわけで AS でわかりやすさ重視にします
$recordSet = mysql_query(‘SELECT COUNT(id) AS record_count FROM my_items’);
$data = mysql_fetch_assoc($recordSet);
で画面に表示するには
echo ‘件数は’ .$data[‘record_count‘].’件です’;
というように、微妙にわかりやすくなります
まぁ実際には出力される結果は同じなのですが
見やすさ重視ということです
コードをかくときに、改行しなくても
C , java PHP などは書けますが
あとでメンテなどのときを考えると見やすいコードをかくことを心がけたいものです