カテゴリー
PHP

PHP fputcsvで出力するとダブルクォーテーションで括られる

PHP のfputcsvは配列データをCSVファイルへ出力する際に自動でエスケープ処理もしてくれるので便利ですが、エンコーディングを UTF-8 から Shift-JIS へ変換して出力すると、文字列が予期せずダブルクォーテーションで括られる場合があります。

<?php
function convertEnc($arg) {
    if (is_array($arg)) {
        return array_map('convertEnc', $arg);
    } else {
        return mb_convert_encoding($arg, "SJIS-win", "UTF-8");
    }
}

$array = array(
              "あ"
             ," "
             ,"\r\n"
             ,"ソ"
             ,"十"
);
$fp = fopen("php://stdout", "w");

// UTF-8 のまま出力
fputcsv($fp, $array);

// Shift-JIS に変換して出力
//fputcsv($fp, convertEnc($array));

fclose($fp);
?>

// UTF-8 出力結果
UTF-8 のままで出力すると改行コードだけがダブルクォーテーションで囲まれます。

あ," ","
",ソ,十

// Shift-JIS 出力結果
Shift-JIS へ出力すると「ソ」、「十」もダブルクォーテーションで囲まれてしまいます。

あ," ","
","ソ","十"

「ソ」、「十」は Shift-JIS では、れぞれ「0x8F5C」、「0x835C」で 0x5C はバックスラッシュ、バックスラッシュはエスケープ文字扱いなのでダブルクォーテーションで囲まれるようです。

参考:
https://github.com/php/php-src/blob/master/ext/standard/file.c

		/* enclose a field that contains a delimiter, an enclosure character, or a newline */
		if (FPUTCSV_FLD_CHK(delimiter) ||
			FPUTCSV_FLD_CHK(enclosure) ||
			FPUTCSV_FLD_CHK(escape_char) ||
			FPUTCSV_FLD_CHK('\n') ||
			FPUTCSV_FLD_CHK('\r') ||
			FPUTCSV_FLD_CHK('\t') ||
			FPUTCSV_FLD_CHK(' ')
		) {
カテゴリー
PHP

PHP スクリプト実行PCのIPアドレス取得

PHP スクリプト実行PCのIPアドレス取得方法、再考しました。

<?php
echo GetIpAddr();

/*
  GetIpAddr
*/
function GetIpAddr()
{
    preg_match_all('/inet addr: ?([^ ]+)/', `ifconfig`, $ipaddr);
//  var_dump($ipaddr);
    return $ipaddr[1][0];
}
?>

出力結果:

192.168.1.3

CentOS 6.6 と Ubuntu14.04LTS で動作確認済み。
CentOS 7 は期待通り動作しません。

カテゴリー
jQuery PHP

Access-Control-Allow-Origin ヘッダーに見つかりません。

異なるドメインから利用される Webサービスは、アクセスを許可するドメインをAccess-Control-Allow-Origin ヘッダーで制限できます。

どのドメインからでもアクセスを許可するには

Access-Control-Allow-Origin: *

ドメインを https://www.northwind.mydns.jp に限定するには

Access-Control-Allow-Origin: https://www.northwind.mydns.jp

Access-Control-Allow-Origin の指定がない場合は同一ドメインのみアクセス可となります。つまり、他のドメインからアクセスした場合、「Access-Control-Allow-Origin ヘッダーに見つかりません。」となります。

PHPでヘッダを書き出すには

header("Access-Control-Allow-Origin: *");

と1行追加で対応できます。

カテゴリー
Database

MySql の ユーザー パスワードの変更

MySql のユーザーのパスワードを変更する方法意外にも面倒でした。

root でログインします。


$ mysql -u root -p
Enter password:

次に、使用するデータベースを mysql に変更

mysql> use mysql;

そして、ユーザーのパスワードを変更。
(例として、ユーザ名: username 新パスワード: username_password で行っています。)

mysql> set password for 'username@'localhost' = password('username_password');
Query OK, 0 rows affected (0.11 sec)

以上です。

カテゴリー
Javascript jQuery

jQuery UI DatePickerの選択イベント

jQuery UI Datepicker で日付を選択した時に何かをしたい。そんなときは select イベントを使います。

以下の例では、選択された日付を表示しています。

jQuery(document).ready(function() {
    $( "#datepicker" ).datepicker({
        inline: true,
        onSelect: function (date) {
            alert(date);
        }
    });
});

...

<div id="datepicker"></div>