PHP


【PHP】expects parameter 1 to be resource, boolean givenの意味

PHPにてmysql_fetch_assocを実行したところエラーが出た

エラー内容
-------------------------------------------------------
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /home/username/www/test.php on line 183
-------------------------------------------------------

日本語訳
-------------------------------------------------------
「mysql_fetch_assoc()」は、パラメータ1がリソース型(データベース操作をして取り出した値)であると期待したが、boolean値(falseのこと)が与えられた。test.phpの183行目において。
-------------------------------------------------------

ようは、queryの実行に失敗していて、データベースの値は取り出せず、falseになっているということ。

・リソース →ファイル接続、データベース接続 などを通して使用する PHP 外の情報資源。

・expect A to do ~ → Aが~するのを期待する。

【PHP】正規表現の後方参照の直後に数字が来る場合の記述

preg_replaceなどで使う後方参照について。
たとえば、後方参照「$1」の後に数字の「100」がくる場合、次のように記述すればいい。

----------------------------------
${1}100
----------------------------------

【PHP】file_get_contentsでユーザーエージェントを指定する

file_get_contentsでユーザーエージェントを指定する方法のおぼえ書き。
ユーザーエージェントで表示内容を振り分けるページに有効。

//この設定がなければ、UserAgentは「PHP/x.x.x」になる。
////////////////////////////////////////////////////////////////////////////
$context = stream_context_create(array('http' => array(
'method' => 'GET',
'header' => 'User-Agent: Mozilla/6.4 (compatible; MSIE 4.0; Windows 98; DigExt)',
)));
////////////////////////////////////////////////////////////////////////////

file_get_contents($url, false,$context);

参考ページ:こちら

2014年版 さくらでpearインストール(go-pear.phar使用)

さくらインターネットでpearをインストールしたときの覚書。
go-pearを使ったが、ファイルが古いのか利用中のさくらサーバーではインストールできず。(途中で止まる)。

2014年4月現在、下記の方法でpearがインストールできる。

1.ターミナルでサーバーにインストールして、go-pear.pharをダウンロード。

------------------------------------
curl http://pear.php.net/go-pear.phar > go-pear.phar
------------------------------------

このとき、ダウンロード先はここにした。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/home/ユーザー名
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

2.次のコマンドを実行してインストール開始。
------------------------------------
php go-pear.phar
------------------------------------

インストール先を「/home/ユーザー名/pear」にしたかったので、事前に「pear」フォルダを作っておいた。「/home/ユーザー名」にある「go-pear.phar」を実行すれば、希望のフォルダにインストールされた。

インストール途中でメッセージが出た。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Would you like to alter php.ini ? [Y/n] :
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
権限がなくて変更できないので「n」を選択。

以上でインストールは完了。

参考ページ: こちら

以下はおまけの覚書。

3.DB.phpが使いたかったので、コマンドを実行してインストール。

------------------------------------
pear install DB
------------------------------------

4.使いやすくするためにDB.phpのある場所にパスを通す。

php.iniに追記した内容
------------------------------------
/home/ユーザー名/pear/share/pear
------------------------------------

また、PHPファイルでデータベースを読み込んだときエラーが出たが、単にログインパスワードを間違えていただけだった・・・

ブラウザに出力されたエラー内容
------------------------------------
Warning: mysql_set_charset(): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /home/ユーザー名/libs/function.php on line 220

Warning: mysql_set_charset(): A link to the server could not be established in /home/ユーザー名/libs/function.php on line 220
ConnectError!DB Error: connect failed
------------------------------------

【MYSQL+PHP】トランザクション処理のサンプルコード

MYSQL + PHPでトランザクションを行うための記述例

トランザクションのサンプルコード
///////////////////////////////////////////////////////////////
//通常は、自動コミットが有効になっているのでクエリ入力後、すぐにコミット(データベースの更新処理)が行われる。
//トランザクション処理を行うため「SET AUTOCOMMIT=0」で自動コミットを無効する。

mysql_query("SET AUTOCOMMIT = 0"); //オートコミットを無効にする
mysql_query("begin"); //トランザクション開始

//----この間に複数の処理を記述----------------------------------

$sql1 = "UPDATE テーブル名1 WHERE ~; //処理1
mysql_query($up_sql1) OR die(mysql_error());

$sql2 = "DELETE FROM テーブル名2 WHERE ~" //処理2
mysql_query($up_sql2) OR die(mysql_error());

//----この間に複数の処理を記述 ここまで-------------------------


mysql_query("commit"); //ここで上記二つの処理が同時に実行される

///////////////////////////////////////////////////////////////

//commitがないので絶対にテーブルは更新されないサンプルコード
///////////////////////////////////////////////////////////////

mysql_query("SET AUTOCOMMIT = 0");
mysql_query("begin"); //トランザクション開始

$sql1 = "UPDATE テーブル名1 WHERE ~; //処理1
mysql_query($up_sql1) OR die(mysql_error());

$sql2 = "DELETE FROM テーブル名2 WHERE ~" //処理2
mysql_query($up_sql2) OR die(mysql_error());

mysql_query("rollback"); //ロールバックなので実行されない

///////////////////////////////////////////////////////////////

※仮にロールバックがなくても、コミットせずに接続を閉じても、MySQLはそのトランザクションをロールバックするよう。

コミットとロールバックを細かく振り分けるなら、次のような記述ができる。

コミットとロールバックを振り分けるサンプルコード
///////////////////////////////////////////////////////////////

$sql1 = "UPDATE テーブル名1 WHERE ~; //処理

$result = mysql_query($sql1);

if( $result === true ){

mysql_query("commit"); //確定
print "コミットしました";

}else{

mysql_query("rollback"); //巻き戻し
print "ロールバックしました";

}
///////////////////////////////////////////////////////////////

PHPで一秒ごとにカウントを出力する【進捗表示】

PHPで進行状況をその都度出力したかったので、テストコードを書いた。

毎秒カウントアップ表示するサンプルコード
------------------------------------------

<?php

for ($i = 0; $i < 10; $i++) { echo $i; sleep(1); } ?> ------------------------------------------ これで1秒ごとにカウントして経過時間が表示されるはず。 そう思ったがうまくいかない。 調べてみると、PHPは出力のバッファリングがオンになっていることが多く、先ほどのようなスクリプトを実行しても毎秒ごとに出力してくれないらしい。 その都度出力は行われず、 代わりに内部バッファに保存される。そして後でまとめて表示される。ループのたびに出力するには「ob_end_flush()」でバッファリングをオフにすればいい。 先ほどのコードを修正 ------------------------------------------ <?php echo str_pad('',4096)."\n"; //←空文字を送る ob_end_flush(); //バッファリングをオフ for ($i = 0; $i < 10; $i++) { echo $i; flush(); // ← フラッシュする sleep(1); } ?> ------------------------------------------ テスト表示のとき意外と重要なのが「str_pad('',4096)」の部分。 多くのブラウザは、ある程度の文字列をバッファしてから表示を開始するため、ob_flush() や flush() によって、出力バッファをフラッシュしても、ブラウザのバッファに蓄積されてしまい、表示されない。 そこで、空白文字列をあらかじめ送るで、この問題を回避している。 これでもうまくいかないときは、PHP以外の何かがバッファリングを行っている疑いがある。 打開策のひとつとして、.htaccessに次の記述をする ------------------------------------------ mod_gzip_on Off ------------------------------------------ レンタルサーバ等の設定によっては、HTTPの応答がmod_gzipにより圧縮されることがあるのでOFFにする。

PHPの正規表現を実行するとApacheが落ちる

windows7 64bitにインストールしたxamppのPHPにて。

特定のページを読み込もうとするとと読み込み途中で「ページが見つかりません」エラーが出る現象に遭遇。

xamppのコントロールパネルからapacheのエラーログを見る。

エラーメッセージ
----------------------------------------------
ri Feb 07 02:21:38.898457 2014] [mpm_winnt:notice] [pid 3540:tid 248] AH00428: Parent: child process 10068 exited with status 3221225725 -- Restarting.
----------------------------------------------

よくわからないが再起動している。

原因を探っていくとPHPのpreg_match_all()の実行時に問題が起こっているようで、この問題はApacheのスタックサイズが足りなくなるのが発端のよう。

スタックメモリーとは、
----------------------------------------------
そのタスクや関数内だけで使われる変数やアドレス情報なんかを置いておくためのメモリ領域だ。タスクを終了する、または関数から抜けると、スタックの内容も破棄される。
----------------------------------------------

らしい。こちらより

で、このスタックサイズを増やすには、editbinコマンドを実行すればよくて、ただ実行するにはVisual Studioに入っているeditbin.exe(Microsoft COFF Binary File Editor)が必要とのこと。

「Visual Studio Express 2012 for Windows Desktop」をダウンロード。こちら
(最新版はVisual Studio2013だったが、マイクロソフトのアカウントを作ってサインインしろと、面倒くさそうだったので手間のない前ののバージョンにした)

インストールして目的のツールを確認

editbin.exeがあるフォルダのパス
----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin
----------------------------------------------

まず、現状のメモリサイズを確認する。
xamppのapacheフォルダ内にあるhttpd.exeをeditbin.exeのあるフォルダにいれる。cdでその場所まで移動してコマンドを実行。

----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>dumpbin /headers httpd.exe
----------------------------------------------

エラーが出た。
----------------------------------------------
コンピューターにmspdb110.dllがないため、プログラムを開始できません
----------------------------------------------

環境変数を反映させればなくなるエラーらしく、同じフォルダにある「vcvars32.bat」を実行。

----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>vcvars32.bat
----------------------------------------------

その後先ほどのコマンドを再び実行。
----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>dumpbin /headers httpd.exe
----------------------------------------------

たくさん表示される情報の中、
「OPTIONAL HEADER VALUES」の見出し中に該当の項目を発見

「40000 size of stack reserve」

「40000」は16進法であり、10進数にすると262144 (256×1024) → 256k

根拠はないが、4倍に増やせば十分かと「1048576」と指定してeditbinを実行。
(式: 目的のメモリ数(単位はKbyte)×1024。今回は1024×1024。)

----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>editbin /stack:1048576 httpd.exe
----------------------------------------------

エラーがでる。
----------------------------------------------
LINK : fatal error LNK1104: ファイル 'httpd.exe' を開くことができません。
----------------------------------------------

どうも権限の都合でフォルダ内のファイルは変更できないらしい。
httpd.exeをデスクトップに移動させて再び実行する。
----------------------------------------------
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>editbin /stack:1048576 C:\Users\PC名\Desktop\httpd.exe
----------------------------------------------

エラーは出ず。「dumpbin」でサイズ変更されていることを確認。

----------------------------------------------
100000 size of stack reserve
----------------------------------------------

PHPでApacheが落ちる問題も解消された。

参考にしたページ
こちらこちら

WindowsにインストールしたxamppのphpをUTF-8化

WindowsにインストールしたxamppのphpをUTF-8化時のメモ。

2014年2月3日現在の最新版で行った。

1.「C:\xampp\php」にあるphp.iniを開く

下記の箇所を見つけて、コメントアウトをはずしていく。

----------------------------------------------
;mbstring.language = Japanese
;mbstring.internal_encoding = EUC-JP
;mbstring.http_input = auto
;mbstring.http_output = SJIS
;mbstring.encoding_translation = Off
;mbstring.detect_order = auto
;mbstring.substitute_character = none
;mbstring.func_overload = 0
----------------------------------------------

2.さらに、該当箇所は値を変更する

変更箇所と値
----------------------------------------------
mbstring.internal_encoding = UTF-8
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
----------------------------------------------

XAMPPでFFFTPを使う

XAMPPでFFFTPを使うには、FTPユーザーの登録が必要。
ユーザー登録は、FTPサーバーであるFileZillaをXAMPPのコントロールパネルから起動して行う。

設定したIDとPASSを利用して、FFFTPを設定すればいい。

また、FileZillaで作ったユーザーには、書き込み・読み込み等の権限を同時に与えておくこと。
設定をしないとアップロードすらできない。

【PHP】連続した改行を一つにまとめる正規表現

連続した改行を一つにまとめる正規表現のサンプルコード
------------------------------------------
preg_replace('/(\n)+/us','$1',$contents);
------------------------------------------

もっと確実なの
------------------------------------------
preg_replace('/(\n|\r|\r\n)+/us',"\n",$contents);
------------------------------------------

"\n" の部分を ''(シングルクォーテーション)で囲むと \n の部分がそのまま表示され改行にならないので注意。

3 / 512345