2014年8月31日日曜日

PHP JSON_PRETTY_PRINT が使えない時は

json_encode() 関数を使って JSON データをフォーマットする際に、第2引数に JSON_PRETTY_PRINT を指定すると配備先サーバーで実行時エラーになっていまいた。
配備先サーバーの PHP バージョンは 5.3.15 で、調べてみると JSON_PRETTY_PRINT は 5.4 以降で利用できることが分かりました。JSON_PRETTY_PRINT の代わりに 128 を引数に指定することで解決しました。

//echo json_encode($ary, JSON_PRETTY_PRINT);
echo json_encode($ary, 128);
json_encode() expects parameter 2 to be long, string given in
http://stackoverflow.com/questions/22208831/json-encode-expects-parameter-2-to-be-long-string-given

2014年8月30日土曜日

SQLite オートインクリメント(自動採番)

SQLite では行 ID となる項目に対して値を設定しなければ、SQLite 側でオートインクリメントしてくれるようです。
例えば下記のようなテーブルがあるとします。


ID Category Item
1 カテゴリA アイテムA
2 カテゴリB アイテムB
3 カテゴリC アイテムC
4 カテゴリA アイテムD
5 カテゴリC アイテムE



次のように ID 列に対して値を設定しない INSERT 文を実行することでオートインクリメントが行われます。

$db = new SQLite3('myDB.db');
$db->exec('INSERT INTO BuyList (Category, Item) VALUES ("カテゴリA", "アイテムF")');

Autoincrement In SQLite
http://www.sqlite.org/autoinc.html

PHP クリックされたボタンに応じて処理を実行する


フォーム上のボタンに応じて処理を実行する簡易なコードです。ここでは登録ボタン(name="add")と削除ボタン(name="remove")を用意し、それぞれがクリックされた際に呼び出される処理を記述しています。

input.php
<?php
    if(isset($_POST['add'])) {
       echo "登録ボタンが押下されました";
    }
    else if(isset($_POST['remove'])) {
       echo "削除ボタンが押下されました";
    }   
?>
<form action="input.php" method="post">
    <input type="submit" name="add" value="登録" />
    <input type="submit" name="remove" value="削除" />
</form>

2014年8月29日金曜日

PHP で SQLite3 からデータを取得して JSON を出力する

サーバーサイドの PHP で SQLite からデータを取得して、クライアントサイドで JSON としてリターンする例です。

サーバーサイド
SQLite3 データベースからデータを取得して各レコードを配列に追加し、配列を JSON として出力しています。

try {
    $db = new SQLite3('myDB.db');

    // 取得(SELECT)
    $result = $db->query('SELECT ID, Category, ItemName FROM BuyList');
    // 配列を初期化
    $ary = array();
    // 配列にデータベースの各行を追加
    while ($rows = $result->fetchArray()) {
        array_push($ary, $rows);
    }
    // 配列を JSON データとして出力
    echo json_encode($ary, JSON_UNESCAPED_UNICODE);
    $db->close();
} catch (Exception $e) {
    print 'DB接続でエラーが発生';
    print $e->getTraceAsString();
}

クライアントサイド
jQuery で JSON 形式を扱えるようにするために、parseJSON と JSON.stringify を組み合わせました。
なぜこれらを組み合わせないと有効な JSON 形式にならないかはイマイチ謎で、要調査です・・。

$(function() {
    $.ajax({
        type: "POST",
        url: "test.php",
        dataType : "json",
        error: function(e)
        {
            //debugger;
        },
        success: function(data){
            var dt = $.parseJSON(JSON.stringify(data));
            // JSON データを使ったロジックが続く
        }
    });
});

PHP 配列の追加には array_push を使いました。
http://php.net/manual/ja/function.array-push.php

2014年8月23日土曜日

PHP JSON の日本語をユニコード表示しない方法

PHP で SQLite からデータを取得して JSON 表示しようとすると、どうしてもユニコード表示になってしまっていました。配列の1要素にアクセスしたらそんなことないんですが、JSON にしたら・・・。

で、しらべてみたところ、json_encode 関数の引数に JSON_UNESCAPED_UNICODE を指定すれば大丈夫ということが判明しまいた。

$data = json_encode($result->fetchArray(), JSON_UNESCAPED_UNICODE);

echo $data;

2014年8月9日土曜日

wp-dtree-30 のエラー回避

数年前に WordPress で wp-dtree を使ってカテゴリ別に記事をツリー表示していたことがあり、久しぶりにこのウィジットを使おうと思ってインストールしてみたところ、動かん・・・。他にもツリー表示をしてくれるウィジットは色々あったので試してみたんですが、どれもイマイチ・・・。
ツリー表示は諦めるか、そのうち自作するかと考えていたんですが、たまたま wp-dtree のスクリプトエラーを見てみたら意外と問題は単純そうでした。

※その後、ふとしたタイミングでもしかしたら「未分類」カテゴリーの記事が無いために発生しているのかと思って、試しに「未分類」カテゴリーの記事を追加したら、そもそも回避コードを使わずともエラーが無くなりました・・・。
  • 「未分類」カテゴリーの記事が無くて wp-dtree が表示されない場合に下記コードを検討してください。
  • 自分の試した環境では「未分類」カテゴリーの記事があっても wp-dtree の動作には問題なく、ツリーノードに「未分類」が表示されました。

ブラウザのコンソールに表示されるエラーメッセージ
SyntaxError: syntax error
 cat1.a(,0,'','','?p=123','','');
 ?cat=6 (307 行目, 7 列目)

ReferenceError: cat1 is not defined
 ...cript><script type='text/javascript'>cat1.openTo('-6', true); /*wp_query object ...
 ?cat=6 (309 行目)

SyntaxError のリンクを辿って行くと表示ページの 307 行目に移動。
var cat1 = new wpdTree('cat1', 'http://WordPressのURL','0');
cat1.config.useLines=1;
cat1.config.useIcons=0;
cat1.config.closeSameLevel=1;
cat1.config.folderLinks=0;
cat1.config.useSelection=0;
cat1.a(0,'root','','','','','');
cat1.a(-6,0,'カテゴリー1','','?cat=6','','');
cat1.a(-12,0,'カテゴリー2','','?cat=12','','');
cat1.a(-7,0,'カテゴリー3','','?cat=7','','');
cat1.a(,0,'','','?p=123','',''); //←ここで失敗
document.write(cat1);

wp-dtree のソースコードを調べてみると、この cat1 を生成しているのは wp-dtree-build.php ファイルの wpdt_build_tree 関数内で、WP-dTree 4.3.1 では 48 行目に記述があります。
$tree .= "{$t}.a({$nodedata['id']},{$nodedata['pid']},'{$nodedata['name']}','{$nodedata['title']}','{$nodedata['url']}','{$target}','{$rsspath}');\n";

おそらく id が null の時を判定して cat1 追加を行わないようにするのがいいような気がしますが、url に 'p' が含まれている場合でも判定条件に使えるので下記コードでエラーを回避しました。
// 元々のコード
// $tree .= "{$t}.a({$nodedata['id']},{$nodedata['pid']},'{$nodedata['name']}','{$nodedata['title']}','{$nodedata['url']}','{$target}','{$rsspath}');\n";  

// {$nodedata['id'] が空になり $nodedata['url'] に "p" が含まれているためか、cat1 変数の作成に失敗?
// 回避コード
if (strpos($nodedata['url'],'p') == false) {
    $tree .= "{$t}.a({$nodedata['id']},{$nodedata['pid']},'{$nodedata['name']}','{$nodedata['title']}','{$nodedata['url']}','{$target}','{$rsspath}');\n";  
}