記事:
<?php declare(strict_types=1);
<Directory /usr/share/self-service-password> Require all granted DirectoryIndex index.php AddDefaultCharset UTF-8 </Directory>
<FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch>
vim /etc/php.ini ---- error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED ---- service httpd restart
<?php function get_content($url) { $urldata = false; $user_agent='Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)'; if ( ini_get("allow_url_fopen") ) { // enable allow_url_fopen if( version_compare(PHP_VERSION, '5.0', '>=') ){ $option = array( 'http' => array( 'timeout' => 5, 'method' => 'GET', 'header' => 'Referer: ' . $url . "\r\n" . 'User-Agent: ' . $user_agent . "\r\n" . 'Connection: close' . "\r\n" ) ); $context = stream_context_create($option); $urldata = @file_get_contents($url, 0, $context); }else{ $urldata = @file_get_contents($url); } }else{ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_ENCODING, "gzip"); curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); ob_start(); curl_exec ($ch); curl_close ($ch); $urldata = ob_get_contents(); ob_end_clean(); } return $urldata; } $content = get_content("http://www.php.net"); var_export($content);
CLIでも使えるPHP_OS, php_uname が便利
<?php echo PHP_OS . "\n"; // AIX, Darwin, MacOS, Linux, SunOS, WIN32, WINNT echo php_uname() . "\n"; // Linux hostname 2.6.18-308.1.1.el5 #1 SMP Wed Mar 7 04:16:51 EST 2012 x86_64
php -r 'echo Date("Y-m-d H:i:s", strtotime($argv[1]));' "2012-07-24T22:13:08.000-05:00" 2012-07-25 12:13:08
ls /tmp | php -R 'echo strtoupper($argn),"\n";'
cat >> utf8tosjis.sh <<'EOD' #!/usr/bin/php -F <?php echo mb_convert_encoding($argn, "UTF-8", "SJIS-win"), "\n"; EOD chmod 755 utf8tosjis.sh ./utf8tosjis.sh < utf8.txt > sjis.txt
ls -l /tmp | php -B '$sum=0;' -R '$vals=preg_split("/\s+/",$argn);$sum+=$vals[4];' -E 'echo "Total size of files: ", $sum, "\n";'
mb_convert_variables( 'SJIS-win', 'UTF-8', $row);
wikipediaやamazon.co.jpのページURLに日本語が含まれており、うまくリンクできない場合もある。
urlencodeすれば動作する場合もある。
<?php mb_internal_encoding('utf-8'); mb_http_input('pass'); mb_http_output('pass'); echo url_normalize("http://ja.wikipedia.org/wiki/Wikipedia:コミュニティ・ポータル#hoge") . "\n"; //result: http://ja.wikipedia.org/wiki/Wikipedia%3A%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%83%BB%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%AB#hoge echo url_normalize("http://www.amazon.co.jp/三洋電機-KBC-L54D-SANYO-USB出力付きリチウムイオンバッテリー-高容量リチウムイオン3-7V5400mAh電池使用/dp/B005DUMNSE/ref=sr_1_1?ie=UTF8&qid=1323766118&sr=8-1"); //result: http://www.amazon.co.jp/%E4%B8%89%E6%B4%8B%E9%9B%BB%E6%A9%9F-KBC-L54D-SANYO-USB%E5%87%BA%E5%8A%9B%E4%BB%98%E3%81%8D%E3%83%AA%E3%83%81%E3%82%A6%E3%83%A0%E3%82%A4%E3%82%AA%E3%83%B3%E3%83%90%E3%83%83%E3%83%86%E3%83%AA%E3%83%BC-%E9%AB%98%E5%AE%B9%E9%87%8F%E3%83%AA%E3%83%81%E3%82%A6%E3%83%A0%E3%82%A4%E3%82%AA%E3%83%B33-7V5400mAh%E9%9B%BB%E6%B1%A0%E4%BD%BF%E7%94%A8/dp/B005DUMNSE/ref=sr_1_1?ie=UTF8&qid=1323766118&sr=8-1 /** * URL正規化。日本語が含まれたURLをurlencodeして返す * * @param string $url URL * @return string 正規化したURL */ function url_normalize($url, $options=array()) { $tmp = parse_url($url); $paths = explode("/",$tmp["path"]); $pattern = "/^[-_.!~*'()a-zA-Z0-9;\/\?:@&=+$,%#]+$/"; foreach($paths as $key => $val){ if( !preg_match($pattern, $val, $matches) ){ $paths[$key] = urlencode($val); } } return sprintf("%s://%s%s%s%s%s", $tmp['scheme'] , isset($tmp['user']) ? $tmp['user'] . ':' . $tmp['pass'] . '@' : '' , $tmp['host'] , implode("/", $paths) , isset($tmp['query']) ? '?' . $tmp['query'] : '' , isset($tmp['fragment']) ? '#' . $tmp['fragment'] : '' ); }
/// プロキシ経由でも実際のクライアントIPを取得 function getRealIP() { if (!empty($_SERVER["HTTP_CLIENT_IP"])){ $ip = $_SERVER["HTTP_CLIENT_IP"]; }elseif (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])){ $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; }else{ $ip = $_SERVER["REMOTE_ADDR"]; } return $ip; }
sudo yum install php-pecl-zendopcache php-pecl-apcu sudo service httpd restart # モジュールとして読み込まれているか確認 php -m # 他に php55-, php56-, php70-, php71- 等にバージョン毎に別パッケージがある
php5.3.6でdate.timezoneが設定されていないとエラーが出る
date.timezone = "Asia/Tokyo"
小さい画像をたくさん使用しているなど、別コネクションへの速度が遅い場合に有効
wget -O elfinder-1.1.zip "http://downloads.sourceforge.net/project/elfinder/elfinder-1.1.zip?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Felfinder%2Ffiles%2F&ts=1283849097&use_mirror=jaist" unzip elfinder-1.1.zip mv elfinder-1.1 elfinder cd elfinder/
sudo pecl install json sudo sh -c "cat >> /etc/php.d/json.ini << 'EOS' extension=json.so EOS" sudo /sbin/service httpd graceful php -m | grep json
wget http://svn.coderepos.org/share/lang/php/Jsphon/release/Jsphon-1.0.1.tgz tar xvfz Jsphon-1.0.1.tgz mv Jsphon-1.0.1/Jsphon . vi connectors/php/elFinder.class.php ---- // <?の次行あたりに追加 if( !function_exists('json_encode') ){ require_once(dirname(dirname(dirname(__FILE__))) . '/' . 'Jsphon/Encoder.php'); function json_encode($str){ $jsphon = new Jsphon_Encoder(); return $jsphon->encode($str); } } ----
<?php if (function_exists('date_default_timezone_set')) { date_default_timezone_set('Asia/Tokyo'); } ... $opts = array( 'root' => '../../../', // path to root directory 'URL' => 'http://localhost/path/to/', // root directory URL 'rootAlias' => 'Home', // display this instead of root directory name );
pecl install imagick
vernum="50106" ... --vernum) echo $vernum;;
mv /usr/lib/php/modules/imagick.so /usr/lib64/php/modules/
wget -q -O - http://www.atomicorp.com/installers/atomic.sh | sh yum upgrade
プログラミングができなくても作れるTwitter botの作り方で phaさんが配布している改造版 Services_Twitter でenableJsonConvert()を有効にするパッチ。
同梱されているJsphon.phpを直接使うように変更しています。
patch -p1 < Twitter.php.patch
<?php require_once("Services/Twitter.php"); $user = 'Your_Username'; $pass = 'Your_Password'; $st =& new Services_Twitter($user, $pass); $st->enableJsonConvert(); $result = $st->setUpdate("つぶやき"); var_export($result);
# "https"が含まれていない場合は、PHP本体のコンパイル時にSSLを有効にしていない場合もある php -i | grep "Registered PHP Streams" Registered PHP Streams => https, ftps, compress.zlib, compress.bzip2, php, file, glob, data, http, ftp, phar, zip # mod_ssl, opensslが必要 rpm -qa | grep ssl mod_ssl-2.2.3-65.el5.centos openssl-0.9.8e-22.el5_8.4
<?php $request = new HTTP_Request2(); // SSL証明書の検証(default:true) $request->setConfig('ssl_verify_peer', false); // SSL自己証明書の許可(default:true) HTTP_Request2::setConfig('ssl_verify_host', false);
<?php // 半角英数、全角文字を1文字としてカウントする $str = 'カウント対象文字列'; if( preg_match_all('/./u', $str, $matches) ){ printf("count:%d\n", count($matches[0])); }
複数の画像で、大きな1毎画像を構成するように見せる事。
chmod 700 phpStylist.sh ./phpStylist.sh INPUT-DIR OUTPUT-DIR
#!php <?php echo file_get_contents("http://example.com/path/to/post1.php");
#!php <?php header('HTTP/1.0 201 Created'); header('Content-Type: application/json; charset=utf-8'); header('Location: http://example.com/path/to/post2.php'); echo <<<EOD { "startIndex" : 1 } EOD;
#!php <?php echo 'post2.php';
<?php $url = 'http://www.php.net/search.php'; $data = array( 'pattern' => 'htmlspe', 'show' => 'quickref', ); $headers = array( 'User-Agent: My User Agent 1.0', //ユーザエージェントの指定 'Authorization: Basic '.base64_encode('user:pass'),//ベーシック認証 ); $options = array('http' => array( 'method' => 'POST', 'content' => http_build_query($data), 'header' => implode("\r\n", $headers), )); $contents = file_get_contents($url, false, stream_context_create($options));
<?php file_get_contents("http://example.com"); var_export($http_response_header);
ini_set('track_errors', 1); //直近のエラーメッセージを $php_errormsg に代入
// PHP5のbasename(), pathinfo()で日本語ファイル名が扱えないため function mybasename($file, $suffix = '', $ds = '/') { // PHP :: Bug #37738 :: basename does not work with Japanese // http://bugs.php.net/bug.php?id=37738 $str = substr(strrchr($ds."$file",$ds),1); if($suffix != '') $str = substr($str, 0, strrpos($str, $suffix)); return $str; }
$quote_text = preg_quote("ほげ"); if(!preg_match_all("/<.*?({$quote_text})[^\?>]*?>/i", $data, $matches, PREG_SET_ORDER)){ var_export($matches); }
mktimeは存在しない日付の時に、正しい値に正規化してくれる。
date('Y-m-d', mktime(0,0,0, 2+1, 0, 2008));
pear install --alldeps phpdocumentor
phpdoc -t doc/ -d trunk/ -o HTML:Smarty:PHP
defined('AK_PHP5') ? null : define('AK_PHP5', version_compare(PHP_VERSION, '5', '>=') == 1 ? true : false);
if (!defined('STDERR')) { define('STDERR', fopen('php://stderr', 'w')); } fwrite(STDERR, "Can't open file. [$xml_file]\n");
header("Cache-Control: public"); header("Pragma: public");
string mb_strimwidth ( string str, int start, int width [, string trimmarker [, string encoding]] )
<?php mb_http_output('pass'); $str = "abc123-_ほげ"; echo "str : " . $str . "\n"; echo "urlencode : " . urlencode($str) . "\n"; echo "base64_encode : " . base64_encode($str) . "\n"; echo "rawurlencode : " . rawurlencode($str) . "\n";
str : abc123-_ほげ urlencode : abc123-_%82%D9%82%B0 base64_encode : YWJjMTIzLV+C2YKw rawurlencode : abc123-_%82%D9%82%B0
<?php $date_const_list = array( 'DATE_ATOM', 'DATE_COOKIE', 'DATE_ISO8601', 'DATE_RFC822', 'DATE_RFC850', 'DATE_RFC1036', 'DATE_RFC1123', 'DATE_RFC2822', 'DATE_RFC3339', 'DATE_RSS', 'DATE_W3C', ); foreach ($date_const_list as $date_const) { echo sprintf("%16s: %-16s\t%s\n", $date_const, constant($date_const), date(constant($date_const))); } /** 結果 * DATE_ATOM: Y-m-d\TH:i:sP 2007-09-03T17:02:31+09:00 * DATE_COOKIE: l, d-M-y H:i:s T Monday, 03-Sep-07 17:02:31 JST * DATE_ISO8601: Y-m-d\TH:i:sO 2007-09-03T17:02:31+0900 * DATE_RFC822: D, d M y H:i:s O Mon, 03 Sep 07 17:02:31 +0900 * DATE_RFC850: l, d-M-y H:i:s T Monday, 03-Sep-07 17:02:31 JST * DATE_RFC1036: D, d M y H:i:s O Mon, 03 Sep 07 17:02:31 +0900 * DATE_RFC1123: D, d M Y H:i:s O Mon, 03 Sep 2007 17:02:31 +0900 * DATE_RFC2822: D, d M Y H:i:s O Mon, 03 Sep 2007 17:02:31 +0900 * DATE_RFC3339: Y-m-d\TH:i:sP 2007-09-03T17:02:31+09:00 * DATE_RSS: D, d M Y H:i:s O Mon, 03 Sep 2007 17:02:31 +0900 * DATE_W3C: Y-m-d\TH:i:sP 2007-09-03T17:02:31+09:00 */ ?>
QRコードに文字や絵を埋め込んだもの。
QRコードのエラー訂正率の高さを利用していると想像される。
1. 漢字をひらがなに読み上げる kakasi -JH 2. すべての JISx0208 で定義された文字をおきかえる。 kakasi -Hk -Kk -Jk -Ea 3. すべての文字を JISx0208 の文字におきかえる。 kakasi -aE -jE -gE -kK 4. ローマ字変換 kakasi -Ha -Ka -Ja -Ea -ka 5. かたかなとひらがなを交換 kakasi -HK -KH
$_SERVER['PHP_AUTH_USER'] $_SERVER['PHP_AUTH_PW']
[luna @ xxxxx public_html]$ php --version PHP 5.1.6 (cli) (built: Nov 17 2006 08:52:42) [luna @ xxxxx public_html]$ pear list HTTP_Client 1.1.0 stable HTTP_Request 1.4.0 stable Net_Socket 1.0.6 stable Net_URL 1.0.14 stable [luna @ xxxxx public_html]$ cat httpclient.php <?php require_once 'HTTP/Client.php'; $url = "https://xxxxx.xxx.xxxx/~xxxxx/xxxxx/"; $param = array( 'user' => 'xxxxx', 'pass' => 'xxxxxxxx' ); $req = new HTTP_Client($param); $req->get($url); $response = $req->currentResponse(); var_dump($response);
<? $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://www.example.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt(CURLOPT_USERPWD, '[username]:[password]') $data = curl_exec(); curl_close($ch); ?>
<?php function ini_get_size($sName) { $sSize = ini_get($sName); $sUnit = substr($sSize, -1); $iSize = (int) substr($sSize, 0, -1); switch (strtoupper($sUnit)) { case 'Y' : $iSize *= 1024; // Yotta case 'Z' : $iSize *= 1024; // Zetta case 'E' : $iSize *= 1024; // Exa case 'P' : $iSize *= 1024; // Peta case 'T' : $iSize *= 1024; // Tera case 'G' : $iSize *= 1024; // Giga case 'M' : $iSize *= 1024; // Mega case 'K' : $iSize *= 1024; // kilo }; return $iSize; } // example echo ini_get_size('post_max_size'); // e.g. 8388608 instead of 8M ?>
/** * 全角文字対応trim * * @param string $str 入力文字列 * @param string $charlist 削除する文字を指定(省略可。入力する場合は'EUC-JP'の文字のみ) * @param string $encoding 文字コード(省略可。utf-8の場合必須) * * @note * - 文字列の先頭および末尾にあるホワイトスペースを取り除く * - " ", 通常の半角空白。 * - " ", 全角空白。 * - "\t", タブ。 * - "\n", リターン。 * - \r", 改行。 * - "\0", NULバイト * - "\x0B", 垂直タブ */ function mb_trim($str, $charlist = '', $encoding = '') { $pattern = "/^[ {$charlist}]*(.*?)[ {$charlist}]*$/"; if( strcasecmp($encoding, 'UTF-8') == 0 ){ $pattern .= 'u'; // UTF-8処理オプション付加 $pattern = mb_convert_encoding($pattern, 'UTF-8', 'EUC-JP'); } $str = preg_replace($pattern, '$1', $str); $str = trim($str); return $str; }
PHPソースの文字コードがUTF-8で、データベースの文字コードがEUC-JPだった場合、 いちいちmb_convert_encodingで変換しなくとも、pg_set_client_encodingで自動変換してくれます。
pg_set_client_encoding(mb_internal_encoding());
require_once("XML/Unserializer.php"); require_once("Jsphon/Jsphon.php"); function xmlToJson($url, $callback = "") { $req =& new HTTP_Request($url); if (PEAR::isError($req->sendRequest())) { die($req->getMessage()); } $xml = $req->getResponseBody(); $xml = mb_convert_encoding($xml, "UTF-8", "auto"); $unserializer =& new XML_Unserializer(); $unserializer->setOption('parseAttributes', TRUE); $status = $unserializer->unserialize($xml); if (PEAR::isError($status)) { die($status->getMessage()); } $json = Jsphon::encode($unserializer->getUnserializedData(), false); if ($callback != "") { $json = $callback . '(' . $json . ')'; } header("Content-Type: text/javascript; charset=utf-8"); echo $json; }
uniqid(rand(100,999))
Ajaxでは、フォームの自動encode/decodeはしてくれないので、自分で行う必要がある。
以下の例では期待通りの動作をしない。phpの場合、continueにループのレベル階層数を指定する事で、switch文の中でも、指定のループの先頭へ戻る事ができる
for($i=0;$i<5;$i++){ switch($i){ case 1; continue; } echo "$i,"; }
0,1,2,3,4,
0,2,3,4,
system('zip -q test.zip 001.jpg file2.jpg');
system('unzip -q test.zip -d ./test/');
system('lha aq test.lzh 001.jpg file2.jpg');
system('lha eqw=./test/ test.zip');
<?php function getmicrotime(){ list($usec, $sec) = explode(" ",microtime()); return ((float)$sec + (float)$usec); } $st = getmicrotime(); // 長い処理 sleep(1); $ed = getmicrotime(); printf("time : %0.4fs\n", $ed - $st);
<? ini_set("session.use_cookies", 0); session_start(); $_SESSION["date"] = date("Ymd"); ?> <a href="1.php?<? echo SID; ?>">1.php</a>
<a href="1.php?PHPSESSID=4dd9dab841e4433471120f80508af2a3">1.php</a>
http://hoge.php?a.b=c... -> var_export($_GET) array( "a_b" => "c..." )
重要なことを記述しておくと、このため、外部変数に含まれるドットを PHP は自動的にアンダースコアに変換します。
Warning: Call-time pass-by-reference has been deprecated
php.iniの「allow_call_time_pass_reference = Off」の時、引数にリファレンスを用いると発生する。
<? function foo($str) { return $str; } $str = "foo"; echo foo(&$str); ?>
<? function foo(&$str) { return $str; } $str = "foo"; echo foo($str); ?>
Notice: Only variable references should be returned by reference in ...参照返ししてるのに値で代入したり、値返ししてるのに参照代入すると注意されるようになった。
//error_reporting(E_ALL); error_reporting(E_ALL & ~E_NOTICE);
error_reporting(E_ALL); function foo() { return "foo"; } $bar =& foo();
error_reporting(E_ALL); function &foo() { return "foo"; } $bar = foo();
バイナリデータをPOSTで受信したい場合等に使用。
$HTTP_RAW_POST_DATA
$stdin = fopen("php://input", "rb"); while (!feof($stdin)) { $buf .= fread($stdin, 8192); } fclose($stdin);
イメージに書かれたグニャ〜と歪んだ文字をテキストボックスに入力してください
というのがあります。
:CAPTCHA(キャプチャ)((completely autattachref(array_speed.php);
require_once(omated public Turing test to tell computers and humans apart))|コンピュータと人間を区別する完全に自動化された公開チューリングテスト
array_map()に指定するコールバック関数で、クラスのメンバ関数を指定する方法です。
ダメな例:
array_map('Sample::array_convert_encoding'), $ary); // エラー array_map('$this->array_convert_encoding'), $ary); // エラー
成功例:
<? $oSample = new Sample; $oSample->main(); exit; class Sample { function main() { $ary = array("hoge", "hogehoge"); var_export( array_map(array(&$this, 'array_convert_encoding'), $ary) );// PHP4のみ。PHP5の場合は参照('&')は必要ない。 } function array_convert_encoding($str) { return mb_convert_encoding($str, "SJIS", mb_internal_encoding()); } }
array_map()等コールバック関数を必要とする場合で、簡単な処理ならばcreate_function()を使う事で1行記述もできるようです。
わかりにくくなるので、注意が必要です。
素直な例:
<? $a = range( 1, 9 ); $a = array_map( 'hoge', $a ); print_r($a); function hoge( $n ){ return sprintf( "%02d", $n ); } ?>
小細工で短く:
<? $a = range( 1, 9 ); $a = array_map( create_function( '$n', 'return sprintf( "%02d", $n );' ), $a ); print_r($a); ?>
include_once("udp.inc.php"); ///< UDP $data = pack("C*", 0x00, 0x01, 0x02); ///< データ $oUDP = new UDP; if(!$oUDP->open("", 10000)){ return false; } $oUDP->send($data);
phpCodeBeautifier(Windowsのみ)がある。
phpファイルを読み込んで、整形してくれる。
デフォルトのままでは、マルチバイト文字が文字化けするが、保存は正常にできる模様。
include(), include_once(), require(), require_once()等、動的includeする場合は、NULLバイトアタックに注意する。
// NULLバイト等不適切な部分を削除する関数 function sanitize( $arr ) { if ( is_array( $arr ) ) { return array_map( 'sanitize', $arr ); } return str_replace( "\0", "", $arr ); } $_GET = sanitize( $_GET ); $_POST = sanitize( $_POST ); $_COOKIE = sanitize( $_COOKIE );
通常、echoやprint等で出力すると、自動的にphp.iniで指定された、mbstring.http_outputの文字コードに変換されます。
しかし、UTF-8のXMLを出力させる時は、文字化けしてしまいます。
これを抑制して素のデータを出力するには、以下のようにします。
// 無変換で出力させる mb_http_output("pass"); // ヘッダ header("Content-type: text/xml; charset=UTF-8"); // 出力 echo mb_convert_encoding("ほげ", "UTF-8");
apacheのhttpd.conf や .htaccessに記述する事により、ディレクトリ毎に文字コードを指定できる。
output_handler = mb_output_handler mbstring.language = Japanese mbstring.internal_encoding = UTF-8 mbstring.http_input = pass mbstring.http_output = pass mbstring.encoding_translation = Off mbstring.detect_order = UTF-8,SJIS-win,eucJP-win,JIS,ASCII mbstring.substitute_character = none mbstring.func_overload = 0
Options -Indexes php_value output_handler "mb_output_handler" php_value mbstring.language "Japanese" php_value mbstring.internal_encoding "utf-8" php_value mbstring.http_input "pass" php_value mbstring.http_output "pass" php_flag mbstring.encoding_translation "Off" php_value mbstring.detect_order "UTF-8,SJIS-win,eucJP-win,JIS,ASCII" php_value mbstring.substitute_character "none" php_value mbstring.func_overload "0"
例:/var/www/html/phpPgAdmin以下の内部エンコードをUTF-8にする。
/etc/httpd/conf/httpd.conf
<Directory "/var/www/html/phpPgAdmin"> php_value mbstring.internal_encoding UTF-8 </Directory>
サービスの再起動
# service httpd restart
デフォルトでは、httpヘッダにPHPの作成元やバージョンが出力されます。
セキュリティ上脆弱性のあるバージョンを知られてしまう上、余計な情報なので、
出力しない場合は、php.iniを変更します。
/etc/php.ini
expose_php = Off
その後、httpdの再起動
# service httpd restart
HexDec("ff"); // -> 255
例えば、'¥'を'/'に置換する場合、’¥’が3つ必要。
× preg_replace('/\\/', '/', $str); ○ preg_replace('/\\\/', '/', $str);
以下のようにタグの名前に"[]"を付けてやることで、phpに配列だと知らせる事ができる。
<select name="var[]" multiple>
JavaScriptでは上記"[]"でエラーが出る事があるので、以下のようにelements経由でアクセスする。
var variable = documents.フォーム名.elements['var[]']; var count=0; for(var i=0; i < variable.options.length; i++){ if(variable.options[i].selected) count++; } alert("selected:" + count);
PHPマニュアル>"select multiple"タグで選択された全ての結果を取得するにはどうす ればよいですか?
ob_end_flush()でエラーとなる場合がある。
以下のように"ob_gzhandler"を使うとエラーとなるようである。
対応モジュールが入っていない場合は、コメントアウトすると良いだろう。
ob_start("ob_gzhandler");
通常では30秒でセッション切れを起こし、PHPは致命的エラーを返します。
そこで、set_time_limit()でセッションの時間を延長します。
出力バッファを無効にすると、すぐにダウンロードダイアログが出るようになります。
// HTTPヘッダ出力前 set_time_limit(0); // 制限時間なし // ob_start("ob_gzhandler"); // 出力バッファをgzip圧縮する(モジュールがある場合) // HTTPヘッダ出力後 while (@ob_end_flush()); // バッファを無効に // 以後、巨大なファイル出力
number_format()関数がある。
デフォルトでカンマで区切ってくれる。
$a = number_format(1234); // 1,234
<? $a = preg_split('//', "abcde", -1, PREG_SPLIT_NO_EMPTY); var_export($a); ?>
クライアントが Win 版 MSIE 5.5 のときに、
解決策は、セッション開始前に、キャッシュ設定をしてやるといいようです。
session_cache_limiter('public'); session_start();
PHPでファイルアップロード後に、ファイルが壊れる(ファイルサイズが増える)場合があります。
これは、Apacheの設定が原因のようです。
具体的には以下の行を、コメントアウトすると壊れなくなりました。
/etc/httpd/conf/httpd.conf
#AddType application/x-httpd-php .php #AddType application/x-httpd-php-source .phps
AddTypeの設定は、PHPが、DSOモジュールでインストールされている場合は必要ないようです。
「/etc/httpd/conf.d/php.conf」がヘッダの設定をしているようです。
var_export()やvar_dump()を使います。
var_export()は値だけ、var_dump()は型も表示します。
オブジェクトもその中身を表示してくれるので便利です。
PHPの参照宣言は、C++言語の参照とは違い、
関数宣言時と変数への代入時両方に&を付けないと予想通りには動かない。
付け忘れて、値が変更されない場合があるので、参照を使う際には注意が必要。
参考URL:http://php.s3.to/man/language.references.return.html
<?php class base{ var $x = "none"; } class ext extends base{ function printVar(){ echo "printVar() : " . $this->x . "<br>\n"; } function &getThis(){ return $this; } } $obj = new ext(); $r = $obj->getThis(); // &なし $r2 = &$obj->getThis(); // &あり $r->x = "hoge"; // 値は変更されない $r2->x = "moke"; // 値は変更される echo '$r->x : ' . $r->x . "<br>\n"; echo '$r2->x : ' . $r2->x . "<br>\n"; $obj->printVar(); ?>
実行結果
$r->x : hoge $r2->x : moke printVar() : moke