2014年10月4日土曜日

SQLDataSource.InsertParameters メソッドでパラメータに数値を割り当てる


パラメータに数値を渡すには、InsertParameters.Add メソッドの第 2 引数で数値型(DbType.Int32)を指定し、実際の登録する数値は第 3 引数で文字列型として渡します。また、下記例では値に含まれる ¥ マークを取り除くため、String.Trim メソッドを利用しています。

SqlDataSource1.InsertParameters.Add
(
    // this.Cost.Text は "¥700" のような文字列の値を保持しています。
    "Cost", System.Data.DbType.Int32, this.Cost.Text.Trim('')
);

文字のトリムと削除
http://msdn.microsoft.com/ja-jp/library/kxbw3kwc%28v=vs.110%29.aspx

2014年9月27日土曜日

SQLite でテーブルに複数レコードを追加するクエリ

Values に追加するレコード情報をカンマ区切りで複数記述することで OK です。

INSERT INTO BuyList
(Category, ItemName, ShopName, Date, Cost)
VALUES
('Category1', 'Item1', 'Shop1', '2014-09-15', 1980),
('Category2', 'Item2', 'Shop2', '2014-09-28', 570)

参考ページ
Is it possible to insert multiple rows at a time in an SQLite database?
http://stackoverflow.com/questions/1609637/is-it-possible-to-insert-multiple-rows-at-a-time-in-an-sqlite-database

jQuery trigger メソッドの使い道

jQuery には trigger メソッドを利用することで、開発者がイベントを動的に発生させることができます。
この trigger メソッドは、主にユニットテストに利用することができます。


Testing User Actions
http://qunitjs.com/cookbook/#testing-user-actions

あくまでもテスト目的で利用されるものであり、開発者がビジネスロジックを実行するために常用するものではないようです。

2014年9月23日火曜日

localStorage への JSON データ保存と復元

cookie 以外でブラウザ側にデータを保存することの出来る localStorage があります。
ここでは簡単に localStorage へ JSON データを保存し、復元する例を紹介します。
JSON データは文字列データではないため、JSON.stringify() メソッドでシリアライズし、
JSON.parse() メソッドでデシリアライズしています。

// JSON データ
var friend = { ID : 1, Name : "Kai" };

// localStorage に JSON データを保存
// JSON.stringify を用いて JSON をシリアライズ(文字列化)
localStorage.setItem('kai', JSON.stringify(friend));

// 確認:変数 friend は JSON データ
console.log("json data : " + friend);

// 確認:localStorage には文字列として保存されている
console.log("localStorage data : " + localStorage.getItem("kai"));

// JSON.parse を用いてシリアライズされている JSON をデシリアライズ
var friendRetreived = JSON.parse(localStorage.getItem("kai"));

// JSON データが復元されている
console.log("deserialized data : " + friendRetreived);

2014年9月22日月曜日

JavaScript と jQuery で cookie を生成する

ブラウザの cookie を生成する方法です。

1.JavaScript の場合
document.cookie = "key1=value1";


jQuery ではより簡潔に cookie を操作することができるプラグインが用意されています。

2.jQuery cookie plug-in の場合
// 戻り値として cookie を取得することができます。
var cookies = $.cookie("name", "Tim");

詳しくは下記 GitHub をご覧ください。

carhartl/jquery-cookie
https://github.com/carhartl/jquery-cookie

2014年9月7日日曜日

SQLite 今月の全件データを取得する SQL 文

今月の合計を取得したくて調べました。

BuyList テーブルの Date 列データが今月のリストを表示する SQL 文です。

'今月の全件データを表示
select * from BuyList where Date between date ('now', 'start of month') and date ('now', 'start of month', '+1 month', '-1 day')

'今月の集計データは SUM 関数を組み合わせて取得
select SUM(Date) from BuyList where Date between date ('now', 'start of month') and date ('now', 'start of month', '+1 month', '-1 day')

参考ページ
the sqlite common sql statement
http://www.databaseskill.com/1046790/

2014年9月1日月曜日

JavaScript Date(日付) データを yyyy/MM/dd 形式にフォーマットする


JavaScript の Date 型データはデフォルトでは下記の形式生成されます。

Mon Sep 01 2014 21:42:03 GMT+0900

これを yyyy/MM/dd の形式にフォーマットする場合、下記のように実装することができます。JavaScript の月は 0 からスタートしますので、1 を追加します。

var date = new Date();
var formattedDate = 
    date.getFullYear() + '/' + (date.getMonth() + 1) + '/' + date.getDate();

追記:
コメント欄にてご指摘いただいているように、上の実装ではゼロ埋めがなされません。ゼロを補完して必要な下二桁のみを取るように変更します。

var date = new Date();
formattedDate = [
    date.getFullYear(),
    ('0' + (date.getMonth() + 1)).slice(-2),
    ('0' + date.getDate()).slice(-2)
].join('/');

console.log(formattedDate);

動作サンプルのダウンロードはこちらから
http://kai.raindrop.jp/javascript/format-date/

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";  
}