PHPでファイルをダウンロードする方法

PHPでファイルをダウンロードするサンプルコードです。
例として、mp3ファイルをダウンロードします

ケース1 サーバーにダウンロードする

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

<?php

// ダウンロード元のファイルパス(絶対パス、ファイル名まで含む)を指定する
$url = 'http://example.com/voice/voice.mp3';

$data = file_get_contents($url);

file_put_contents('./download/hozon.mp3',$data); //ファイルの保存先

?>

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

ケース2 PCにダウンロードする

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

<?php

// ダウンロード元のファイルパス(絶対パス、ファイル名まで含む)を指定する
$fullpath = 'http://example.com/voice/voice.mp3';

// 保存時のファイル名を設定
$filename = 'hozon.mp3';

// HTTPヘッダ送信。ローカルPCに保存するためのダイアログが出る。
header("Content-type: audio/mpeg"); //mp3の場合。ファイルの種類によって適宜変更
header("Content-Disposition: attachment; filename=$filename");
// ファイルを読み込んで出力します。
readfile($fullpath);
?>

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

wordpressの再インストールで表示されなくなったときにしたこと

wordpressで運用しているブログがスパムメールの踏み台にされていると発覚。さくらインターネットからもどうにかしろとメールをいただき、wordpressの再構築を行った。

その際につまずいたポイントを覚え書き。

別サーバーにwordpressをインストールして、エクスポートしておいたmysqlデータを新wordpressのデータベースにインポートした。「これで元通りになるだろう」ってところまで進みいざ、URLにアクセスするが表示されず。「500 Internal Server Error」や真っ白画面になった。

--------原因1--------
テーブル接頭辞「wp_」が一致していなかった。

wordpressインストール時に決めた、テーブル接頭辞が元のwordpressと違っていた。一致させるために、インポートしたmysqlデータをいじって新しいwordpressのテーブル接頭辞に合わせる。

変更箇所1
「wp_options」テーブルの「○○_user_roles」の○○の部分。

変更箇所2
「wp_usermeta」テーブルの「wp○○_~」の部分。4、5箇所。「meta_key」カラムをテーブル接頭辞で検索するといい。

--------原因2--------
URLの不一致。

最終的に元のURLに戻すのだが、一時的に新旧のwordpressを両立させることにした。その際、新wordpressのURLは仮の物であるが、設定は旧ブログのまま表示がうまくいかなかった。

解決方法は「wp_options」の「url」と「home」の値をデータベースにアクセスして直接変更。
念のため「wp_options」テーブルの「option_value」カラムに検索をかけて旧アドレスで残っているものはないかも確認する。

また、トップページは表示されるが、それ以外のページが表示されない現象が起こった。パーマリンクの設定が問題のようで、設定をデフォルトにしてから、再度設定したら解消した。

【UWSC】エクセルのワークシートの追加と名前の変更

エクセルのワークシートの追加とワークシート名を変更する記述のメモ

-------------------------------------------------
//対象のエクセル
EXCEL = GetActiveOleObj("Excel.Application", "ファイル名.xls")

//ワークシートの追加
EXCEL.activeworkbook.worksheets.add()

//追加したワークシートの名前の変更。
Excel.ActiveSheet.name = ワークシート名

もしくは、

//(1)は左から一番目のワークシート。
EXCEL.activeworkbook.worksheets(1).name = ワークシート名

※既存のワークシート名を指定すると、重複させられないのでCOMエラーになる
-------------------------------------------------

【mysql】正規表現でひらがなだけの文字列を取り出す

全部ひらがなで構成された文字列だけを抜き出そうと、下記のSQLを実行した。

SELECT field1 FROM table1 WHERE field1 REGEXP '^[ぁ-ん]+$'

しかし文字列の中にひらがなの「む」がはいってない文字列だけマッチしなかった。
文字コードの設定によって起こる現象らしい。

そこで次のように変更↓↓↓

SELECT field1 FROM table1 WHERE field1 REGEXP '^[ぁ-んむ]+$'

「む」を付け足して解決。

【UWSC】正規表現、マッチしているかどうかテスト

UWSCで正規表現を使ったマッチしているかどうかのテスト

-------------------------------------------------
re=CreateOleObj("VBScript.RegExp")
re.pattern = ";$" //正規表現のパターン。行末に「;」があればマッチ。
re.Global = True //文字列全体を検索。trueでする(規定)、falseでしない(マッチする文字列が見つかったらそこで終了)。
re.IgnoreCase = True //大文字・小文字を区別。trueでしない(規定)、falseでする。

str = "aaaaa;" //対象の文字列

IFB True = re.Test(str) THEN
PRINT "マッチしている"
ELSE
PRINT "マッチしてない"
ENDIF
-------------------------------------------------

【UWSC】正規表現を使ってマッチした文字列を取り出す

正規表現を使ってマッチした文字列を取り出したい。

UWSCでの正規表現はVBScriptを用いる。

-------------------------------------------------------------
moji = "1234567891000520005" //対象となる文字列

re=CreateOleObj("VBScript.RegExp")
re.pattern = "1.*5" //正規表現パターン。1と5の間の文字を取り出す。
re.Global = True //文字列全体を検索。trueでする(規定)、falseでしない(マッチしたらそこで終了)。
re.IgnoreCase = True //大文字・小文字を区別。trueでしない(規定)、falseでする。
match = re.Execute(moji)

//マッチしたものをすべて出力
for i = 0 To match.Count-1
print match.Item(i).Value
next
-------------------------------------------------------------

出力結果:1234510005

【mysql】特定の長さの文字列だけをselectで取り出す

フィールドの中の、特定の長さのレコードだけを取り出す場合の記述

SELECT * FROM table1 WHERE LENGTH(field1) > 60

【PHP】正規表現で置換できない。ereg_replaceとpreg_replaceの記述の違い。

マニュアルどおりやった(つもりだった)んだけどなぜか正規表現の置換がうまく行われない。

記述したのはこれ↓

--------------------------------------------------------------
<?php
$moji ="123456789";
$moji = ereg_replace("/^123/", "aaa",$moji);

echo $moji;
?>
--------------------------------------------------------------

$mojiから先頭の「123」を「aaa」に置き換えるというもの。
期待した結果は「aaa456789」なんだけど、実際の結果は「123456789」。変化無し。マッチしていない。

でいろいろ試行錯誤した結果、単純なミスに気付く。

PHPで正規表現を用いた置換を行う場合は、次の二つの関数がある。

・ereg_replace
・preg_replace

どちらも同じ仕事をするので記述にも違いがないと勝手に思っていたが、そうでないと判明。

正しい記述例
・ereg_replace("パターン", "置換文字",置換前の文字列);
・preg_replace("/パターン/", "置換文字",置換前の文字列);

つまりpreg_replaceの第一引数はパターンを//で囲む必要があるが、ereg_replaceは//で囲む必要がない。

なので最初の失敗は//を取り除くことで解決する

ereg_replace("^123", "aaa",$moji);

出力結果 aaa456789

ただしereg_replaceは将来的になくなる関数らしいので、今後はpreg_replaceを使っていく。

mysqlの正規表現で括弧()をマッチさせる

mysqlの正規表現で括弧()をマッチさせるには、エスケープシーケンスを連続して記述する。(\\)

下記は 行頭が (11) の文字列にマッチさせる場合。

REGEXP '^\\(11\\)'

エスケープシーケンス(\)が1つの場合はMySQLに対するエスケープとみなされる。
正規表現としてのエスケープするために、2つ並べている。

PHPファイルの中にsql文を記述する場合は、「\」が四つ並んだりする

$sql = "SELECT field FROM table WHERE field REGEXP '^\\\\(11\\\\)'";

mysqlで正規表現を使って置換する方法

mysqlは正規表現のREGEXP関数、置換のREPLACE関数があるが、同時に使えない。

なのでPHPを組み合わせて利用する方法を取る。

次のPHPスクリプトでは、field1 に入っている文字列が「;」で終わっていた場合に、その部分だけを削除している。

--------------------------------------------------------------------------
<?php
$pattern = ";$"; //正規表現のパターン

//mysqlの正規表現を使ってUPDATEの対象になるレコードを取り出す。
$sql = "SELECT field1 FROM table1 WHERE field1 REGEXP '" . $pattern . "'";
$result = mysql_query($sql) or die(mysql_error()); //sqlを実行

//全て展開
while ($item = mysql_fetch_array($result)) {
$in_data = $item['field1'];
$out_data = preg_replace( "/" . $pattern . "/", "", $in_data); //PHPで置換
$new_sql = "UPDATE table1 SET field1 = '".$out_data."' WHERE field1 = '".$in_data."'"; //置換した文字列をUPDATEするsql文
mysql_query($new_sql) or die(mysql_error()); //sqlを実行
}
?>
--------------------------------------------------------------------------

このファイルをサーバーにアップロードして、ブラウザでアクセスすればPHPおよび、mysqlが実行される。