foreach で値を参照で受け取った場合は、配列を壊さないようにunset()するべき。

下記のように、foreach で参照で値を受け取って配列の値を加工する場合に、最後にunset()しないと、配列を破壊する場合があります。

//下記のunset($val)をしないと、$list[2] への参照が $val に残っていて$valに値を入れると、$list[2]の値が下記かわってしまう
unset($val);  

要注意ですね。
(変数の持ち回しがよくないとか、参照で処理するのはコストがかかるのでしないほうがいい、とかいう意見もありそうですが、もしやるならunset()も必須でという感じです。)

最初に現象が出た時には、なんなんだこの動きは?って思いましたが納得です。

カテゴリー: php

Windowsで印刷ジョブを全部消したい

SATOのタグプリンタのドライバをインストールする際に、「印刷ジョブが残っています。」というメッセ―ジが表示されてドライバのインストールが進みませんでした。

印刷待ちのドキュメントは無し。。。
手動でスプールに残っているファイルを削除することにしました。

  1. 管理者権限で、コマンドプロンプトを開いて、
  2. 下記のコマンドでスプーラのサービスを停止。
    net stop spooler
  3. C:\Windows\System32\spool\PRINTERS の *.shd と、*.splファイルを削除
  4. 下記のコマンドでスプーラのサービスを開始ン
    net stop spooler

無事、プリンタドライバのインストールダイアログが進みました。
(が、VMのせいかうまくプリントを認識しない。。。 )

js エラー 「識別子、文字列または数がありません」

ボタンをクリックされたら ajax を使用してデータを取得し、

php 側でテーブル等のタグを全部生成して返し

javascript では返ってきたデータを jquery の html メソッドで

表示する、というプログラムを作っていた。

 

掲題のエラーは jquery.js 内の

elem.innerHTML = value;

の箇所で発生していた。

 

調べた所、掲題のエラーは IE6 や IE7 で

var hoge = { arg1, arg2, };

のようにarg2 の後ろに余分なカンマが

ある場合に起きるエラー、とのことだった。

 

今回のエラーとの関連は余りなさそうだ。

 

PG を調べた所、php でテーブルタグを生成するのに

ヒアドキュメントを使用していた。

$data = <<<DATA

<table>

<tr><td></td></tr>

</table>

DATA;

のような感じ。

ループの中でタグにid を振るときに

ヒアドキュメントの中で

for($i = 0; $i < count($data); $i++){

$ret_data = <<<DATA

~~ 中略 ~~

<input type=”text” id=”hoge_{($i + 1)}”>

のように括弧を駆使していたが、

どうやらこれがエラーの素だったようだ。

ここの所を

<input type=”text” id=”hoge_%u”>

として

$data = sprintf($data, ($i + 1));

のようにsprintf() で置換するように修正することでエラーが発生しなくなった。

へぇ~。

 

phpMyAdminで、SQLのSELECTした内容をCSVなどでファイル出力する方法

MySQL実行したSQLをそのままCSVやtab区切りで出力したい場合がありますよね。
phpMyAdmin(コマンドラインでも同じですが)で実行するSQLのFROMの前に下記のようにINTO OUTFILE ~ を追加すると実行結果をファイル保存できます。

---------
例)

SELECT *
INTO OUTFILE “/var/www/html/test/data.csv”
FIELDS TERMINATED BY ‘,’
OPTIONALLY ENCLOSED BY ‘”‘
ESCAPED BY ‘”‘
LINES TERMINATED BY ‘\n’
FROM test2
---------

・INTO OUTFILE “/var/www/html/test/data.csv”
パスはサーバー上のパスです。書込み権限が必要です。
Windowsなら ”c:\\temp\\data.csv” のように指定します。

※ファイルが存在するとエラーになるので、ファイル名を変える等してください。

・ FIELDS TERMINATED BY ‘,’
値の区切り文字です。

・ OPTIONALLY ENCLOSED BY ‘”‘
文字型の値の場合に値を囲む文字です。

・ESCAPED BY ‘”‘
値中に上記「OPTIONALLY ENCLOSED BY」で指定した文字が含まれる場合は、「ESCAPED BY」で指定した値でエスケープしてくれるようなので、エクセルで利用するなら、「OPTIONALLY ENCLOSED BY」も「ESCAPED BY」も”(ダブルクォート)を指定すればいいはずです。

・LINES TERMINATED BY ‘\n’
1レコードの最後をあらわす記号です。

あとは、エクセルで利用するならエディタで開いて、Shift-JISで保存する等して文字コードを Shift-JISにすれば完了です。

phpMyAdminや、コンソールに表示された実行結果をエクセルにコピペして、エクセル上で綺麗な形に加工して。。。あっ、抽出方法間違えたってなって、また作業しなおし、、、とか、かなり手間で無駄な作業なので絶対にしたくありませんね!!(昔、結構やってました。。。)

以上です。

jQueryのdataTablesでチェックボックスの一括ON/OFF

下記のような通常のjQueryの処理方法では、dataTablesの内部データは変更されず、フィルタや改ページで非表示状態の行は処理されません。

$(‘#list input[type=”checkbox”]’).prop(‘checked’,false );

 

下記の方法ならdataTablesの内部データも変更され、非表示行もきちんと処理されます。

list = $(‘#list’).dataTable({・・・});

list.$(‘.chk_sel’).prop(‘checked’,false );

以上です。