PHP5上級試験/準上級試験の上級合格に挑戦(18) プログラミングPHP第3版 10章~11章

# 10章 PDF

FPDFライブラリ＝PDFを扱うためのPHPコードをまとめたライブラリ
TCPDFライブラリ＝HTMLやUTF-8などの多言語出力に優れている
MBFPDFライブラリ＝日本語の出力ができる
cell オプション　’L’， ’R’，’LR’はそれぞれ左だけに線を、右だけに線を、両方に線を引くことになる

# 10.3.5 表とデータ

buildTable(header,data)
header は表の項目をarray配列で入れたもの
data は表のデータをarray配列で入れたもの

```index.php

require("../fpdf/mbfpdf.php");

class TablePDF extends mbfpdf
{
   function buildTable($header, $data)
   {
     //各種設定
     $this->setFillColor(255,0,0); //塗りつぶしの色
     $this->setTextColor(255); //テキストの色
     $this->setDrawColor(128,0,0); //直線の色
     $this->setLineWidth(0.3);　//直線の幅
     $this->setFont('', 'B'); //フォント書式　標準・太字

     //ヘッダ
     //列幅定義をする配列を作成
     $widths = array(85,40,15);
     //ヘッダをPDFドキュメントに送信
     for($i = 0; $i < count($header); $i++) {
       $this->cell($widths[$i], 7, $header[$i], 1, 0, 'C', 1);
     }
     $this->ln();

     //色とフォントをもとに戻す
     //各種設定
     $this->setFillColor(175);
     $this->setTextColor(0);
     $this->setFont('');

     //$dataからデータ取り出し
     $fill = 0; //１行おきに背景色を切り替えるために使用
     $url = "http://www.oreilly.co.jp";

     foreach($data as $row)
     {
       $this->cell($widths[0], 6, $row[0], 'LR', 0, 'L', $fill);

       //URL形式のリンク用の色を設定
       $this->setTextColor(0,0,255);
       $this->setFont('','U');
       $this->cell($widths[1], 6, $row[1], 'LR', 0, 'L', $fill, $url);


       //色とフォントをもとに戻す
       //各種設定
       $this->setTextColor(0);
       $this->setFont('');
       $this->cell($widths[2], 6, $row[2], 'LR', 0, 'C', $fill);

       $this->ln();
       $fill = ($fill) ? 0 : 1;
      }
      $this->cell(array_sum($widths), 0, '', 'T');
   }
}

//DBに接続
$connection = mysql_connect("Localhost", "user", "password");
$db = "Library";
mysql_select_db($db, $connection) or die("データベース{$db}　をオープンできませんでした");
$sql = "SELECT * FROM books ORDER BY title";
$result = mysql_query($sql,$connection) or die("SQL{$sql} の実行に失敗しました");

//DBのレコードの内容を配列へ
 while ($row = mysql_fetch_array($result)) {
   $data[] = array($row['title'], $row['ISBN'], $row['pub_year']);
 }

//PDFドキュメント作成開始
 $pdf = new TablePDF();
 $pdf->AddMBFont(GOTHIC, 'SJIS'); //マルチバイト用フォント登録

 //列のタイトル
 $header = array("署名", "ISBN", "発行年");
 //フォント設定
 $pdf->setFont(GOTHIC, '', 14);
 //新規作成
 $pdf->addPage();
 //表を作成
 $pdf->buildTable($header, $data);
 //出力
 $pdf->output();
```

# 11章　XML

リモートプロシージャコールやDBとのやり取り、商品発注などで使われている

※リモートプロシージャコール・・・プログラムの一部の処理を、ネットワーク上の別のコンピューターに受け渡し、その処理結果を元のコンピューターに戻すしくみ。複数のコンピューターで処理を分担する分散処理システムを構築する際によく使われる。

使うタグや属性、エンティティ、入れ子にする際の規則などを記録する時下記を使う
（１）文書型定義（DTD) 外部エンティティとして定義する方法もある
<!DOCTYPE rss PUBLIC 'My DTD Identifier' 'http://www.example.com/my.did'>など

## 11.2 XMLの作成
header関数でMIMEタイプをtext/xmlにする
phpタグと判定されないように下記のように記述
echo '<?xml version="1.0" encording="ISO-8859-1" ?>';

（２）スキーマ
DTDに代わる新しいスキーマ言語

```index.xml
<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="hello" type="xsd:string"/>
</xsd:schema>

```

## 11.3 XMLの解析

XMLパーサは３つある
・　C言語のexpatライブラリを利用したイベントドリブン
・　DOMパーサ
・　SimpleXML

## 11.3.4 エンティティハンドラ

標準のエンティティ（\&amp;（&）、\&gt;(<)、\&lt;（>）、\&quot;（ダブルクォート）、\&apos;(シングルクォート))以外の独自のエンティティを定義できるもの。

外部エンティティ・・・置換後の内容を直接XMLに記述するのではなく、内容が記述されたファイルのファイル名やURLを指定する形式のエンティティ。

xml_set_external_entity_ref_handler(parser,handler); でセット
参照ハンドラは下記
externalEntityHandler(parser,entity,base,system,public);
パーサー名、エンティティ名、エンティティIDのための元URI（常に空）、システムID（ファイル名など）、エンティティの公開ID（エンティティの宣言時に指定）が引数
エラーの場合XML_ERROR_EXTERNAL_ENTITY_HANDLINGが発生（trueはそのまま）

```index.php
function externalEntityReference($parser, $names, $base, $systemID, $publicID)
{
  if ($systemID) {
    if (!list ($parser, $fp) = createParser($systemID)) {
      echo "外部エンティティ {$systemID} をオープンできません<br>";
    }
    return parse($parser, $fp);
  }
  return false;
}
```

解析対象外エンティティ・・・記法宣言が基本。文字データハンドラが呼び出される前に削除される
記法宣言は下記

```index.php

<!DOCTYPE doc [
  <!NOTATION jpeg SYSTEM "image/jpeg">
  <!ENTITY logo SYSTEM "php-tiny.jpg" NDATA jpeg>
]>


```

記法宣言ハンドラを登録する関数はxml_set_notation_decl_handler()
xml_set_notation_decl_handler(parser, handler)
ハンドラ
notationHandler(parser, notation, base, system, public);

baseは記法IDを解決するための基底URL（常に空）
systemとpublicは記法IDで、どちらかが使用。
解析対象外エンティティ宣言を登録する関数は
xml_set_unpaserd_entity_decl_handler(parser, handler)
ハンドラ
unparsedEntityHandler(parser, entity, base, system, public, notation)
notationはこの解析対象外エンティティに関連付けられている記法宣言のID

## 11.3.5 デフォルトのハンドラ
その他のイベント、XML宣言やXMLの文書型宣言に達した場合、デフォルトのハンドラが呼び出される
設定は　ｘｍｌ_set_default_handler(parser, handler)
ハンドラ
defaultHandler(parser, text);
textの値はイベントの種類によって異なる


## 11.3.9 メソッドのハンドラとしての使用法

・現在どこを処理中かと言うのを変数に入れてそれらをもとに処理をするハンドラを作成
　→これらの関数や変数をクラスにまとめると楽
・XMLパーサーにオブジェクトを登録する関数　`xml_set_object()` 

## 11. 5 SimpleXMLによるXMLの解析

・ファイルの読み込み=>`simplexml_load_file(filename, class_name, options, ns, is_prefix)`
・DOMDocumentで作成したデータの読み込み=>`simplexml_import_dom(node, class_name)`
・Xpathの探索=> `xpath(path)`
・指定したノードの子ノード処理=> `children()`
・そのノードのすべての属性を順番に処理=> `attributes()`
・ドキュメントのXMLをXML形式で取得 => `asXML()`
 ドキュメントの内容を書き換えてディスクに書き戻すというようなことができる

```index.php
$document = simplexml_load_file("books.xml");
foreach ( $document->children() as $book) {
  $book->title = "新しいタイトル";
}
file_put_contents("books.xml", $document->asXml());

```

## 11.6 XSLTによるXMLの変換

・C言語のlibxsltライブラリでXSLTに対応
・XMLで作成し、それをXSLTによって各種形式で変換するのが一番簡単