忍者ブログ

カウンター

プロモーション

カレンダー

04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

AntinomyMy の実験室

   私のWEBアプリ実験室です!

ブログ内検索

楽天でお買い物

twitter

最新トラックバック

最新コメント

忍者アナライズ

ウェザーニュース

バーコード

本を買う

アクセス解析

Google+

[PR]

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


No Image

function 内 global 変数を fopen の第一引数にするとき、バグが発生する謎の現象;x;

PHP の調べ物

何度やっても起こるのでメモしました・・・・

PHP Version 5.3.3-7 で確認しました。

function 内 global 変数を fopen の第一引数にするとき
バグが起こります。

--------------- インクルードするファイル ---------------
A.php として以下
<?php

$dir_img = 'images/';

);

?>

上は、OKな例、NGな例、全てに使っています。


-------------------------------------------------------------------------------------------------------------------------------
---------------- ①OKな例 ----------------
B.php として以下
<?php

include 'a.php';
test();

imageName ='image';
function test(){

//~~~ 略 ~~~

$imageRP = fopen ( strval( $dir_img . $imageName ), "w" );
fwrite ( $imageRP, 'testtest' );
fclose ( $imageRP );

}

?>
---------------- ②OKな例 ----------------
B.php として以下
<?php

include 'a.php';
test();

imageName ='image';
function test(){

//~~~ 略 ~~~

$imageRP = fopen ( strval( $dir_img ) . $imageName, "w" );
fwrite ( $imageRP, 'testtest' );
fclose ( $imageRP );

}
---------------- ③NGな例 ----------------
B.php として以下
<?php

include 'a.php';
test();

function test(){

//~~~ 略 ~~~

$imageRP = fopen ( $dir_img . $imageName, "w" );
fwrite ( $imageRP, 'testtest' );
fclose ( $imageRP );

}

?>
---------------- ④NGな例 ----------------
B.php として以下
<?php

include 'a.php';
test();

function test(){

//~~~ 略 ~~~

$imageRP = fopen ( strval( $dir_img ) . strval( $imageName ), "w" );
fwrite ( $imageRP, 'testtest' );
fclose ( $imageRP );

}

?>
-------------------------------------------------------------------------------------------------------------------------------


この4つの種類で動くのは①と②だけだと・・・・・思うのですが、
意味が分からなくて仕方ないのでした・・・・



多分、fopen の第一引数のバグなのかな?
ありえない・・・・・
見落とし?

本当に意味不明で、型を指定すると、特にLinux 環境で
動くことを度々経験しているので、Linux には何かあると思っています。


困ったから、動いている関数は、動いている状況からあまり
手を加えたくない・・・・・w



困ったなw


同様な経験をお持ちで、バージョンアップでバグが取れた以外の手で
直した経験がある方がいらっしゃいましたら、是非お教え下さい<_ _>


メモでした。


追伸:
そういえば、前は三角関数の関係に、値を受け渡す時に、
型を変換しないとLinux ではうまくいかなかった事もあった覚えが(謎。

拍手[0回]

PR

No Image

PHP mkdir でパラメータのmode って文字列扱いな数値???

PHP の調べ物

PHP のmkdir の引数、mode で属性を設定する部分でハマったメモ

PHP のmkdir の引数を公式マニュアルmkdir で見ると、
文字列の扱いであれば「'0755'」にしていると思うが、
そうでなく「0775」とかで表現されている。

これを文字列の扱いじゃないから、755 の数値でいいのかなとか、
何か錯覚を起こして「755」で設定すると、属性が「341」で設定されてしまう。

とても気味が悪い引数の扱い。

他の自作ラッパー関数にxxx(xxxx,xxxx,0755)とかやって、
その関数の内部にmkdir があるので、受け渡しが大丈夫なのかとか
考えてしまっておかしな事をして時間を費やした。

関数にて受け渡しても、動いたので良かった。

型が何型で判断されて受け渡されたのかは確認していないが、
確認した所で再び内部で何らかの数値と加減算されている気配があるので、
型を確認する意味があまり感じられないので確認していない(ただ面倒だったのですw)。


今日のメモは短め。以上。


お粗末<_ _>

拍手[0回]


No Image

mb_convert_encoding もmb_decode_mimeheader も、UTF-8 のソースと内部エンコードでは、euc-jp からUTF-8 へ変換が超苦手みたいだ

PHP の調べ物

忙しいけど、毎回忘れるので、やっぱり今日もメモのブログ

--- --- --- 文字コードの変換と種類、癖について --- --- ---

mb_decode_mimeheaderを正しく使う
ISO-2022-JP をUTF-8 にうまく変換できない、確かにそうだった

頭の中がまとまってないけど、出所だけまずメモ
EUC-JPからUTF8への変換の際にCP51932を使う
↑は興味深かったが、CP51932 へ変換であって、UTF-8 へのダイレクトな変換でなかった、
しかしCP~ とか言う文字コードがどういうものか知れた。

PHPで「EUC-JP」から「UTF-8」への文字コード変換
↑はおみごと!です、結果的にこの方法で回避しました。「abc①Ⅰ㈱あかさたな髙﨑」は
今後の文字化けチェックでずっと使う言葉になりそう。

文字コード(UTF-8,Shift_JIS,EUC-JP,ISO-2022-JP)についての俺的まとめ
↑は文字コードの解釈でとても分かりやすいので残しました。

cp932,cp51932,cp5022x の簡易テスト
↑はCP関係で残しました。


--- --- --- メール送受信時の文字変換のサンプル付きの説明 --- --- ---

mb_encode_mimeheader()の使い方
↑はメール送信前のエンコードの仕方とコードの特徴、癖

PEARで分解したメールの件名が携帯で文字化け
↑はまとめ役が居ないので、この手は微妙だけど、なんとなく載せてみた

mb_decode_mimeheaderの挙動
↑は結構だれもが考えて通る道だと思った、私は最終的に内部エンコードを
何度も変えるのには疑問を覚えたので、mb_decode_mimeheader を使うのを辞めたが
どうしてもとか、苦肉の策とかならこういった発想になると思う、
どちらにしてもメール処理はゴリゴリ書くか、苦肉の策になりそうだけど。

mb_decode_mimeheader()
↑は、そのまた↑と良く似た発想をしている。


--- --- --- 優良なメールデコードサンプル(でも使わなかったorz) --- --- ---

【PHP】mb_decode_mimeheader の代わりになるものを作る(機種依存文字対策)
↑はかなり良さそうで神経質な処理をしている、自信のソースのエンコードが何かや、
内部エンコードがUTF-8 のときに試したかなどがなかった、
実際やってみたけど多分ここまでしない方法もある気がした。
ゴリゴリ書くなら、この辺を基本にして考えてみるのが良いと思えた。

mb_decode_mimeheaderと機種依存文字
↑ISO-2022-JP-MS というものを知った、かなり考えている様であるが、
こちらの環境では梯段の「髙」を変換できなかったので、たぶんニアピンなのかと思って
採用しなかった。

PHP による日本語の文字コード判定スクリプト
↑文字コードの判定についての処理が書かれているが、
でもこれを使わなければいけない程の短い文字列での極度に困った状態に
あったことがないので、今後使うかどうかの参考にしている。

--- --- --- 実際に使ったメール受信でのデコードとパーツを分解して取得する処理 --- --- ---

メール本文を取得して本文を変更する
↑実際にこのサイトの内容の処理を元に改良し、
内部処理そして保存ソースコードもUTF-8 で
内部処理コードをソース上で変換するmb_internal_encoding も使わず変換し、
「abc①Ⅰ㈱あかさたな髙﨑」を文字化けせずに使える関数を作った。

ただし、今回はPEARのMail で処理する部分に
mimeDecode.php(内部のインクルードでPEAR.php と、PEAR5.php)を
使っている。

これら3つのファイルを同一のフォルダに入れて使えば済むので、
そうやってサーバー上に設置してみた。(実際に適当なディレクトリ「pear_Mail」を作っていれてある)



では実際に作ったソース(途中端折ったりしてますし、定数も書いていません、適当に直してね!)
以下↓↓↓ ↓↓↓ ↓↓↓
------------------------------------------------------------------------------------------------------------------------
// このファイルの文字コードはUTF-8用に作られています、サーバーのメールデーモンがメールをトリガにこのファイルを処理するのを想定しています
mb_internal_encoding("UTF-8");
//echo mb_language();
mb_language('japanese');
//mb_language("uni");
ini_set('mbstring.script_encoding','UTF-8');
//PEAR メールヘッダ解析 メールをメールデーモンからパイプ処理するので、~~~~~~~~~ はフルパスで
require_once(~~~~~~~~~~~'pear_Mail/mimeDecode.php');
//メールソースを標準入力から読み込み
if (php_sapi_name()=="cli") { // ぶっちゃけここは動いていない環境があると思う、適当・・・
while(!feof(STDIN)) {
$source .= file_get_contents(STDIN);
}
} elseif (php_sapi_name()=="cgi") { // ぶっちゃけここは動いていない環境があると思う、適当・・・
$source = file_get_contents('php://stdin');
}else{
$source = file_get_contents('php://stdin');
}
if ($source) {
//解析
$decoder = new Mail_mimeDecode($source);
$params['include_bodies'] = true; //ボディを解析する
$params['decode_bodies']= true; //ボディをコード変換する
$params['decode_headers'] = true; //ヘッダをコード変換する
$structure = $decoder->decode($params);
//送信者のメアドだけ先に欲しかったので、書いているが、必要なければカットして!
if( preg_match( '/<([^>]+)>$/', $headerAndBody['from'], $getFrom )){ $getFrom=$getFrom[1]; }else{$getFrom=$headerAndBody['from'];}
//チェックルーチンだけど、メモで残しているだけ。
// ob_start();
// echo "\n".'$$headerAndBodyのvar_dump'."\n";
// var_dump($headerAndBody);
// echo "\n".'$getFromのvar_dump'."\n";
// var_dump(getFrom);
// $out1 = ob_get_contents();
// ob_end_clean();
//
//// $mailCheckFlag=
// sendMailRapper( //テスト用のmb_send_mail のラッパーを呼び出して実験したりする為に書いたもの
// 'xxxxx@xxxx.xxxxx',
// '【^v^っ】'.$getFrom.'から',
// $out1,
// SYSTEM_MAIL
// );
// if(!$mailCheckFlag){ //メール処理は、失敗したかどうか分からないので、失敗するとファイルが出来て、失敗の文字が増える様にしている
// $fp = fopen(INCLUDE_FUNCTION_DIRECTORY.'_____no_mail_false.txt', 'a+');
// fwrite($fp, print_r('失敗',true));
// fclose($fp);
// }
// $fp = fopen(INCLUDE_FUNCTION_DIRECTORY.'_____headerAndBod.txt', 'a+');
// fwrite($fp, print_r($out1,true));
// fclose($fp);
exit;
function getHeaderAndBody($structure) {
//文字コード検出順番
// $detectEncodingList=array('ASCII','iso-2022-jp-ms','ISO-2022-JP','eucJP-win','UTF-8','SJIS-win','SJIS','EUC-JP','JIS'); //インプットの内容判別、かなり重要な並び
// $headerDetectEncodingList=array('iso-2022-jp' => 'iso-2022-jp-ms', 'shift_jis' => 'sjis-win', 'euc-jp' => 'eucjp-win', 'utf-8' => 'utf-8');
$headerDetectEncodingList=array('iso-2022-jp-ms', 'sjis-win', 'eucjp-win', 'utf-8');
// CP51932 はEUC-JP の仲間らしいが、なぜかたまに失敗して止まるので、やはりeucjp-win を使うのが良いみたいだ
// mb_detect_order($detectEncodingList);
$headerAndBodyArray = array();
//メールヘッダ情報の取得
$headerAndBodyArray['date'] = date("Y-m-d H:i:s", strtotime($structure->headers['date']));
$headerAndBodyArray['from'] = mb_convert_encoding(mb_convert_encoding(mb_convert_encoding($structure->headers['from'], 'eucjp-win', $headerDetectEncodingList), 'sjis-win', 'eucjp-win'), mb_internal_encoding(), 'sjis-win');
$headerAndBodyArray['subject'] = mb_convert_encoding(mb_convert_encoding(mb_convert_encoding($structure->headers['subject'], 'eucjp-win', $headerDetectEncodingList), 'sjis-win', 'eucjp-win'), mb_internal_encoding(), 'sjis-win');
if (strtolower($structure->ctype_primary) == "multipart") {
//複数本文があるメール(本文を1件づつ処理する)
foreach ($structure->parts as $partOneKey => $partOneValue) {
//タイプ
if ($partOneValue->disposition=="attachment") {
//添付ファイル
$headerAndBodyArray[$partOneKey]['attachment'] = array(
'type' => strtolower($partOneValue->ctype_primary)."/".strtolower($partOneValue->ctype_secondary),
'name' => $partOneValue->ctype_parameters['name'],
'binary' => $partOneValue->body
);
} else {
switch (strtolower($partOneValue->ctype_primary)) {
case "image": //HTML本文中の画像
$headerAndBodyArray[$partOneKey]['image'] = array(
'type' => strtolower($partOneValue->ctype_primary)."/".strtolower($partOneValue->ctype_secondary),
'name' => $partOneValue->ctype_parameters['name'],
'cid' => trim($partOneValue->headers['content-id'], "<>"),
'binary' => $partOneValue->body
);
break;
case "text": //テキスト本文の抽出
if ($partOneValue->ctype_secondary=="plain") {
$headerAndBodyArray[$partOneKey]['body'] = trim(mb_convert_encoding(mb_convert_encoding(mb_convert_encoding($partOneValue->body, 'eucjp-win', $headerDetectEncodingList), 'sjis-win', 'eucjp-win'), mb_internal_encoding(), 'sjis-win'));
} else { //HTML本文
$headerAndBodyArray[$partOneKey][$partOneValue->ctype_secondary] = trim(mb_convert_encoding(mb_convert_encoding(mb_convert_encoding($partOneValue->body, 'eucjp-win', $headerDetectEncodingList), 'sjis-win', 'eucjp-win'), mb_internal_encoding(), 'sjis-win'));
}
break;
case "multipart": //マルチパートの中にマルチパートがある場合(MS-OutlookExpressからHTML形式で送信した場合)
$headerAndBodyArray[$partOneKey]['multipart']=getHeaderAndBody($partOneValue);
break;
}
}
}
} elseif (strtolower($structure->ctype_primary) == "text") {
//テキスト本文のみのメール
$headerAndBodyArray['body'] = trim(mb_convert_encoding(mb_convert_encoding(mb_convert_encoding($structure->body, 'eucjp-win', $headerDetectEncodingList), 'sjis-win', 'eucjp-win'), mb_internal_encoding(), 'sjis-win'));
}
return $headerAndBodyArray;
}



------------------------------------------------------------------------------------------------------------------------

さて、忙しいので、メモ書きはこれで終わります。

お粗末でした<_ _>



追伸:

shift-JIS 、SJIS は変換できても、JIS は変換がうまくいってない事が分かった^^;

また、
mb_convert_encoding 関数の ISO-2022-JP と JIS の違い
↑上記で分かったこともあった

 ISO-2022-JP → UTF-8 の変換をする際には、 JIS → UTF-8 の処理を使いまわしているようです。

ということでした。

とりあえず、JISは別の変換を・・・・作らなければ。


拍手[1回]


No Image

PHP の正規表現(preg_replace)で改行の注意点メモ "/\r\n|\r|\n/"は、'/\\\r\\\n|\\\r|\\\n/' でなければいけなかった!?

PHP の調べ物

メモでっすぅ!

いつもの様に無駄長いので
面倒な方は
結果を言えば
から読んでね^x^;
ではどうぞ!

PHPでは"" と'' の違いは、"" だと変数などが中に書かれていると展開されるという扱い。

なのだけど、"/r/n"としたときと、'/r/n'とした時では挙動が違う

前者の"/r/n"は、文字コードで、確か「\r」はchr(13), 「\n」 => chr(10)
になってしまうんじゃないかな。

なので正規表現の中で"" を使っていて、しかも中でPHPが置き換える可能性のある文字は、
置き換えられてから関数で処理されてしまうから注意が必要

またこれはmysql やmyslqiの関数で、real_escape_string を使って
文字列を収納すると、「"」の方の"/r/n"、つまりchr(13)+chr(10)が、
普通の文字列の「'」の方の、'/r/n'になって保存されてしまう

文字列が二重引用符 (") で括られた場合の話は公式の文字列 に話はある。

また、もしも上記のreal_escape_string(mysqli ならmysqli:: real_ escape_string
 を使っちゃったら、nl2br 関数を使って処理すればいいや!なんて思っていても、
nl2br は文字コードのchr(13)+chr(10)、つまり"" の方の"/r/n" を
文字列の'<br>' もしくは’<br />' に置き換える関数で、ただの文字列となってしまっている
'/r/n' は置き換えられない。


置き換えられないならば、ereg_replace か、preg_replace で置き換えようと
想像がついたので置き換えようとした訳で、このブログを書いている。

まず、置き換えようとする時、"/r" や"/n" や"/r/n" は上記の様に
制御コードとなってしまうしので" でなくて ' にするのは良いとしても
エスケープシーケンス という方法を使わなければいけなくなる。

理由は/ という記号自身が文字や文字列である理由から逸脱(エスケープ)して、
しまう為、これを回避する方法が公式ページ(そのエスケープシーケンス )には

注意:

シングルクォートあるいはダブルクォートで囲まれた PHP の 文字列 の中では、バックスラッシュは特別な意味を表します。 そのため、正規表現 \\ を使用して \ とマッチさせたい場合は PHP のコード内では "\\\\" あるいは '\\\\' と記述する必要があります。

と書いてある。

なので、よくサイトなどで、簡単な説明で
ereg_replace("\n|\r|\r\n","<br>",$string);
とかで動くんじゃ?と思ったけれど、これ動かなかった。

勿論正規表現をやめて
str_replace(array("\r\n","\n","\r"),$br,$string);
とすれば動いた、けれどせっかくなので
preg_replace で動かそうと思った。

よく考えても何処にも答えがニアピンで載ってなくてよく分からなかったのだけれど、
/ ではエスケープシーケンス動作なので、これを消すには// かなと思ったけど、
そうすると多分、エスケープシーケンスを消すので、それは無かった事とされてしまう??w

あ、偶数でないと困るのかな・・・・、前後に // と正規表現をするから・・・
確かに上記の□枠の解釈だと/// と3つつけることになり、意味はあってそう

なんか、意味が具体的に書いてないからなんとも・・・・・・

本当によくわかってないけど・・・・まぁ・・・・ なんかをキャンセルしてると理解しようorz

ここ重要かもしれないけど、エスケープシーケンスをエスケープするのは'//'を前にくっつける??
これ、公式マニュアルに書いてない!!!???

なので'/n' は'//'と'/n' をくっつけた'///n' でやっと文字列の「/n」を選んだ事になるみたい・・・
うーん、なんだか意味がわからないけど、これは公式の説明に載せて欲しいな・・・・

話は長くなったけれど、
結果を言えば
PHP の正規表現(preg_replace)で、改行を置き換えたい時は、
"/\r\n|\r|\n/"では動かないので、'/\\\r\\\n|\\\r|\\\n/' 
にしなければいけない。


纏めると

改行を表すコードは
"/r" chr(13) これは'/r' ではない!
"/n" chr(10) これは'/n' ではない!
"/r/n" chr(13)+chr(10) これは'/r/n' ではない!
※chr(10) とかchr(13) は確か・・・ そうだったと思う、このブログを書いている最中は
 確かめてません・w・;

また正規表現で
文字列の「/r」つまり'/r' を置き換えたい場合には、
エスケープシーケンスのエスケープをして
'///r' とする / は頭に2つ付けて // 合計3つで ///r となる。

同様に
/n => ///n
/r/n => ///r///n
となる。

これでOKみたい。


作った関数

//*********************************************************************************************************************************************************************************************************
// PHP の関数であるnl2br は文字コードの変換で、コードでなく文字に置き換えられた「\r(/r)」「\n(/n)」「\r\n(/r/n)」には使えないので、この関数で<br> もしくは、XHTML 準拠の <br /> に置き換える
function nl_string_2br($string,$is_xhtml=false){
if($is_xhtml==false){$br='<br />';}else{$br='<br>';}
// return str_replace(array("\\r\\n","\\n","\\r"),$br,$string);
return preg_replace('/\\\r\\\n|\\\r|\\\n/', $br, $string);



ネーミングセンスが微妙なので、使う場合には名前をつけなおそぅ(ぇ


あと、
// return str_replace(array("\\r\\n","\\n","\\r"),$br,$string);
return preg_replace('/\\\r\\\n|\\\r|\\\n/', $br, $string);

としてあるけど、str_replace が好みの人は
return str_replace(array("\\r\\n","\\n","\\r"),$br,$string);
// return preg_replace('/\\\r\\\n|\\\r|\\\n/', $br, $string);

としてね!

以上、長いメモでした<(_ _)>


追伸

公式マニュアルの定義済みの定数 に
PHP_EOL (string)このプラットフォームの行末文字。 PHP 4.3.10 および PHP 5.0.2 以降で利用可能。というのを見つけた。

プラットフォームによって変わるのかぁ・・・・・
うーん、フォームから入力、つまりブラウザから入力したって
プラットフォーム、つまりWebサーバーに依存するのかな

まぁいいや、どっちにしても/r と/n と/r/n 全てを処理した方が
無難そう。

コピペしたら多分、ブラウザからの入力に依存する気もする、
うん? やっぱブラウザの入力に依存するんじゃないか?v?

まぁ、いいや、多分そう使わないかな・・・・
サーバーの使う文字コードを調べるにしても、改行コードでは調べられないし。

一応追加のメモでしたぁ_(._.)_


追伸

先に書いた関数を使うより

// 文字コードでなく、文字として「\r(/r)」「\n(/n)」が存在する場合に、文字コードの改行に戻す
function br_string_2nl($string){
return str_replace(array('\r','\n'),array("\r","\n"),$string);
}

こちらの関数を良く使う様になった(というか、先に書いた関数は使わなくなった^^;)

拍手[1回]


No Image

PHP のMySQL(i) 関数fetch_array はLEFT JOIN やRIGHT JOIN の結合でコマンドラインと違う結果を出す事の対処方法

PHP の調べ物

何時もながらメモです。。。。。


非常に困った事があり、結合であれこれやっていた。

まず今回使う例としてのクエリー

SELECT * FROM group_state LEFT JOIN group_use ON group_state.group_number = group_use.group_number AND group_use.login_unique = 2;

これは2つのテーブル でつくられている。

片方のテーブルのカラムlogin_unique = 2 なのを探しているが、
今回そこは特に問題はない。

SELECT * FROM group_state LEFT JOIN group_use ON group_state.group_number = group_use.group_number;

だと思ってくれて良い(・・・・前途は忘れてw 斜線しときますw)

これを元に説明を残す。

1.MySQL をコマンドライン(やコンソール)で叩くと、2個のgroup_number があるがfetch_array では1つ


コマンドラインで覗いてみる。

ON group_state.group_number = group_use.group_number
とかで、両方group_number を指定しているから、両方出るんじゃないの?
+--------------+-----------------------------+--------------------+------------------+-----------+-----------+--------------+--------------+--------------+----------------+
| group_number | group_name                  | memo               | view_unavailable | view_lock | unique_id | login_unique | group_number | default_view | view_weighting |
+--------------+-----------------------------+--------------------+------------------+-----------+-----------+--------------+--------------+--------------+----------------+

上記はColumnだけを切り出した、2個あるgroup_number

だけれど・・・・

PHP のmysqli の関数(mysqli でなくmysql にも確かあった?)に
http://php.net/manual/ja/mysqli-result.fetch-array.php

にある関数を使うと(長いので3のArrayのみの例)
3 => 
    array
      'group_number' => string
 '4' (length=1)
      'group_name' => string
 'なんだろうテスト' (length=24)
      'memo' => string
 'なんだろう?' (length=18)
      'view_unavailable' => string
 '0' (length=1)
      'view_lock' => string
 '0' (length=1)
      'unique_id' => null
      'login_unique' => null
      'default_view' => null
      'view_weighting' => null
とか、group_number はひとつしか無いんだよね・・・・・

確かに配列は同じ名前で重なると困るけど、
これじゃ両方取り出せない!!!

ありえない・・・・・・・・・・・・

これがまず1つ気がついたこと。

2.その1つ、JOIN でくっつけると右か左のどちらかを元にして、結果を埋める。

http://dev.mysql.com/doc/refman/4.1/ja/left-join-optimisation.html
には
  • テーブル A は、LEFT JOIN 条件で使用されるすべてのテーブル(B を除く)に依存するように設定される。

とある。

いやだけど、検索はテーブルBでも、見つかったときにはテーブルAから値を
持ってくる設定くらいつけて欲しいな。。。。。

Aで検索しても検索したカラムについては、Bの値を使って!ということ。

なんか言ってる事間違っているのだろうか?v?;

3.MySQLのSELECT の構文で、*,Column は受け付けるけど、Column,* はダメ

とりあえず、もう片側(今回はLEFT で検索していたので、RIGHTの方)の
検索結果が欲しい。

色々書いてみた。

SELECT group_state.group_number,* FROM group_state LEFT JOIN group_use ON group_state.group_number = group_use.group_number AND group_use.login_unique = 2;

うごかなぁぁぁーい”

じゃこっちにしてみよう・・・・

SELECT *,group_state.group_number FROM group_state LEFT JOIN group_use ON group_state.group_number = group_use.group_number AND group_use.login_unique = 2;

なんだそれ・・・・動いた・・・^w^;

+--------------+-----------------------------+--------------------+------------------+-----------+-----------+--------------+--------------+--------------+----------------+--------------+
| group_number | group_name                  | memo               | view_unavailable | view_lock | unique_id | login_unique | group_number | default_view | view_weighting | group_number |
+--------------+-----------------------------+--------------------+------------------+-----------+-----------+--------------+--------------+--------------+----------------+--------------+

なんじゃこりゃwww
group_number が3つある・・・・・w


4.fetch_array は同一のカラムがあれば、最後のカラムの名前をキーにして配列を作る


その3つgroup_number がある状態で、fetch_array を実行すると、
なぜか最後(コマンドプロンプトで見て一番右側)のgroup_number を使って配列を作ってしまった!?

じゃこれ、最初からRIGHT JOIN を使えば解決したんじゃないの?とか思った・・・(未確認)
うん?でもここに
http://dev.mysql.com/doc/refman/4.1/ja/join.html
  • RIGHT JOIN は LEFT JOIN の類似機能。コードをデータベース間で移植可能にするには、RIGHT JOIN ではなく LEFT JOIN を使用するようにする。

とあって、他のSQL を考慮すると、RIGHT は使わない方が良さそう。

だけど、なんだろう、どっちにしても3.にもある様に、
SELECT の挙動も、*,カラムはOK で、カラム,* はNG だとある。

これもMySQL 特有だとすると、LEFT JOIN を使った所で、他のSQL には
正式なものでなかったり、動かないかもしれない・・・・・

なんだろう・・・・・なんだろう・・・・・なんだろう・・・・・・・・・・


うーん、とりあえずは、LEFT JOIN と、*,カラム のセットで動かしてみる。
RIGHT JOIN と * が好きな人は、そっち(未確認)でいいかも。

5.fetch_array は同一キー名となってしまうカラムはそのまま取り出せないんじゃないの?

まぁ、5.のタイトルのままです、手を加えてカラム名変えて表示するしかない?
ほぼ4.の言い方、見方を変えているだけですがw

うぅーん。。。。。。。。 うぅーーーーん。。。。。。。。

とりあえず、複数は取り出せないけれど、検索したカラムの値は、他のテーブルで
上書きして欲しくない事に関しては解決しました。

今日の所はこのくらいにしておいてやる;w;

      :
      :
      :
      :
      :

自分が忘れない為のメモでした<_ _>
そいでもってテヘペロ(๑´ڡ`๑)

拍手[0回]


[PR]