LAMP環境で動いているシステムでレコードロックが発生してしまった。
原因は、処理の途中でブラウザを閉じてしまったこと。
トランザクション制御はきちんとしていた「つもり」だったんだけど、
やっぱり抜けていたところがあったようだ。
所謂「ワークテーブル」がロックしていたので、
とりあえず、
truncate table tablename;
とやって強制的にトランザクションを終了させ、テーブルを空にした。
PHP + MySQL で開発を始めたころに、MySQLの接続が途中で「ブチッ」て切られたときの挙動を調べていたはずだったのだが、そのサイトをブックマークしておくのを忘れ、今日、慌てて探した。
MySQLのAUTOCOMMIT(オートコミット)覚え書き
http://open-groove.net/mysql/autocommit/
お世話になりました。
なんでも屋さんの自称SEさんが、知らなかったことをメモ代わりに書いてます。
たまに関係のないことも書きますが、良かったら参考にどうぞ。
2020/11
なんでも屋さんだったSEさんは、転職しました。今は社内SEさんとして、自社システム開発してます。でも、一人なんだよね・・・
2021/8 もう少し自分で考えてよって人が増えました...いい歳なんだからさー、指示待ちやめてよねー
2023/11 転職してから早3年、仲間が4名になりました!
2024/10 この一年で貯金がかなり減りました・・・
2012-05-30
2012-05-27
PHPで外部サーバーにあるファイルをincludeする
別サーバーにあるPHPソースをinclude()したときに調査した結果を書いておく。
話を簡単にしたいので、ソースはあくまでサンプルで。
呼び出し元
http://www.example.dom/test.php
別サーバー
http://lib.example.dom/
includeしたいファイル
http://lib.example.dom/hoge.php
呼び出し元のソース
で、結果はこうなる。
外部ファイルを拡張子「.php」のままincludeすると、外部ファイルでphpが「実行」されその「結果」が返される。
そのため、変数$o_personは別サーバー上にしか存在しえない。
PHPのソースとしてincludeしたいため、「結果」として「ソース」が返ってくればよい。
ということで、外部ファイルの拡張子を「.php」から「.inc」に変えたら、見事成功!
呼び出し元のソース
ただし、呼び出し先でさらにincludeしていると、期待した結果にならないので注意。
話を簡単にしたいので、ソースはあくまでサンプルで。
呼び出し元
http://www.example.dom/test.php
別サーバー
http://lib.example.dom/
includeしたいファイル
http://lib.example.dom/hoge.php
<? class person() { public $name; public $addr; public $age; function __construct() { $this->name = ""; $this->addr = ""; $this->age = ""; } } $o_person = new person(); $o_person->name = "hogehoge"; ?>
呼び出し元のソース
<? include 'http://lib.example.dom/hoge.php'; echo "o_person = "; var_export($o_person); ?>
で、結果はこうなる。
o_person = NULL
外部ファイルを拡張子「.php」のままincludeすると、外部ファイルでphpが「実行」されその「結果」が返される。
そのため、変数$o_personは別サーバー上にしか存在しえない。
PHPのソースとしてincludeしたいため、「結果」として「ソース」が返ってくればよい。
ということで、外部ファイルの拡張子を「.php」から「.inc」に変えたら、見事成功!
呼び出し元のソース
<? include 'http://lib.example.dom/hoge.inc'; // hoge.php を hoge.inc に変更。これで、呼び出し先の外部サーバーでPHPとして実行されなくなる。 echo "o_person = "; var_export($o_person); ?>
o_person = person::__set_state(array( 'name' => 'hogehoge', 'addr' => '', 'age' => '', ))
ただし、呼び出し先でさらにincludeしていると、期待した結果にならないので注意。
2012-05-18
照合順序が latin1_swedish_ci なら おれも latin1
PHPが記述されたファイルのエンコード:EUC-JP (CP51932)
MySQLのフィールドの照合順序:latin1_swedish_ci
<?
header("Content-Type: text/html; charset=EUC-JP");
$link = mysql_connect("localhost", "hoge", "hoge");
mysql_select_db("hoge", $link);
mysql_set_charset("latin1", $link);
mysql_query("INSERT INTO `tbl` (`value`) VALUES ('あ')", $link);
$query = mysql_query("SELECT `value` FROM `tbl`", $link);
$row = mysql_fetch_array($query, MYSQL_ASSOC);
echo $row["value"];
mysql_free_result($query);
mysql_close($link);
?>
クライアント側(PHP)が EUC-JP だからといって
mysql_set_charset("ujis", $link);
とすると、MySQLが ujis (EUC-JP) から latin1 へ変換するので文字化けする。
そりゃね、latin1の文字セットに日本語の「あ」なんてないさ。
だから、クライアント側(PHP)も「latin1だよー」って言ってあげると、MySQLは変換しないので文字化けしない。
ということで、このサンプルの出力(echo $row["value"])の結果は
あ
となる。
登録:
投稿 (Atom)
.htaccessで403を404で返す
久しぶりにリライトルールを書いたよ。 ドキュメントルートに.htaccessを置く場合の記述↓ # 403.html は実体がなくてよい。この設定をすることで、あっても使われなくなる。 ErrorDocument 403 /403.html # 独自の404ページをドキュメ...
-
本題に入る前に、まずは、sh/bash系のシェルで標準出力と標準エラー出力をリダイレクトする方法から。 現在使用中のシェルを確認するには、 # echo $SHELL とすれば確認できる。 その他、利用できるシェルを確認するには # cat /etc/shell...
-
Internet Explorer も、気がついてみたらFirefoxまでも、複数タブ・ウィンドウ間で同一セッションになってしまった。確か、Firefox 3.6のときは、ウィンドウが別だったらセッションも別になっていたと思ったのになぁ... で、同一セッションになって困るの...
-
mb_send_mail()を使ってメールを送信する場合は、第5引数に Return-Path を指定する。 さもなければ、Return-Path は apache@hoge.dom (コマンドラインから実行したときは、実行アカウント名@hoge.dom)になる。 第5引...