水曜以外もどうでしょう

北海道発。食べ歩きの記録グルメ情報や北海道の見どころなどをメモ替わりに書いています。

| PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
応援宜しくお願いします。ポチ↓↓
fC2ブログランキング にほんブログ村 グルメブログ 北海道食べ歩きへ 人気ブログランキングへ


| スポンサー広告 | --:-- | comments(-)| trackbacks(-)| TOP↑

≫ EDIT

XserverでPEAR DBを使う

レンタルサーバのXserverで、PEAR DBを使う。

require_once 'DB.php';

DB.phpをインクルードするとエラーで、インクルードできない症状に出くわす。
phpは5.3.3を使用。

エラーメッセージ。
-----
Fatal error: require_once() [function.require]: Failed opening required 'DB.php' (include_path='.:/usr/share/php53/pear:/usr/share/php') in <ファイルパス>/test.php on line 3
-----

以前、違うサーバで、open_basedirをnoneにしないとインクルードできないことがあった。
しかし、今回はこの問題ではないようだ。


Xserverではデフォルトで、管理画面でphp.iniを制御(設定)する機能がONになっている。

gazo.jpg

この機能をOFFにすると、フォルダに置いてあるphp.iniが優先されるわけだが、
特にphp.iniを設置しているわけでもないし。
試しにOFFにしてみると、DB.phpがインクルードでき問題解消。

で、、、この状態で何が違うか、phpinfo()で見てみると、include_pathに違いが有り。

●管理画面でphp.iniをONの場合(インクルードNG)
include_path='.:/usr/share/php53/pear:/usr/share/php'

●管理画面でphp.iniをOFFの場合(インクルードOK)
include_path=.:/usr/share/pear53

これで解決策判明。

今回の自分の環境では、php.iniはXserverの管理画面で制御できた方が良いので、
機能をONにしたまま、Xserverで「php.ini直接編集」を使って下記のように設定。

include_path='.:/usr/share/php53/pear:/usr/share/php:/usr/share/pear53'

要は/usr/share/pear53をinclude_pathに追加

以上、今は問題なく使える。
デフォルトの状態で使えないのはちょっと焦りますね・・。
スポンサーサイト
応援宜しくお願いします。ポチ↓↓
fC2ブログランキング にほんブログ村 グルメブログ 北海道食べ歩きへ 人気ブログランキングへ


| php | 22:02 | comments:0| trackbacks:0| TOP↑

≫ EDIT

phpでプログラムのエラーを表示させたいときにどうするか

webアプリphpの記述ミスで、画面が真っ白になっちゃう時や、期待通りの表示がされないとき、エラーを表示させたいですよね。

サーバ環境によって、デフォルトでエラーが表示されたり/されなかったり、まちまちなもんで。

最近、普段と違うサーバを使っていて、display_errorsとerror_reportingの設定がうまく行かずはまった。
メモを記載しておく。



php.iniでの設定。

display_errors = On
error_reporting = E_ALL & ~E_NOTICE

普段はこれを使っていたのだが、今回のサーバはphp.iniを使えず。


で、ソースコード上で行うにはこんな感じ。

ini_set('display_errors', 'On');
ini_set('error_reporting', E_ALL & ~E_NOTICE);


うまく行かなかったときには、
E_ALL & ~E_NOTICE
をダブルクォートで囲んだりしてしまったのが敗因。
そりゃ、そうでしょうね。。
数値のdefineワードですもんね。


最後に.htaccessでの設定方法

php_flag display_errors On
php_value error_reporting 6135

こちらも、error_reportingの値の与え方にコツがあった。


.htaccessについては、下記のページが参考になりました。
http://blog.syuhari.jp/archives/162

解決。




応援宜しくお願いします。ポチ↓↓
fC2ブログランキング にほんブログ村 グルメブログ 北海道食べ歩きへ 人気ブログランキングへ


| php | 21:08 | comments:1| trackbacks:0| TOP↑

≫ EDIT

phpで自動的にリンクを生成する

文章の中に、http:// で始まるようなURL(URI)が存在する場合、それを自動的に<a></a>タグで囲ってリンクに変えたい。

情報をさがしてみると、発見。

こまちドーナツ - URLの自動リンクをする正規表現(PHP)
http://www.comachi.com/2005/12/urlphp.html


正規表現はこんな感じだ。

$target = ereg_replace("(https?|ftp)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)", "<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>" , $target);



情報ありがとうございます。
素晴らしい機能だと思います。

これはこれで良い。

しかし、次のステップで、
URLを直接記述されている場合と、<a>でのリンクが混在されている場合にうまく処理できないか?
という欲求がでてきた。

リンクされていたPHP-usersの様に。
http://ml.php.gr.jp/pipermail/php-users/2004-February/020834.html

このスレッドでは回答が途中で終わっていたが、内容は参考になり、

タグを使っている場合は https?|ftp の直前に普通「'|"」があるでしょうから,単に [^'\"] を追加して



とのことで、
「リンクではなく直接URLを書いている場合」と「リンクとしている場合」を区別出来れば良いわけで、https?|ftpの直前の1文字を見ることにする。
'か"か>の場合はリンクとみなして除外されるよう記述を追加。
さらに、変換後の文字列にその直前1文字も付加。

$target = ereg_replace("([^'\">])(https?|ftp)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)", "\\1<a href=\"\\2\\3\" target=\"_blank\">\\2\\3</a>" , $target);




下記のようなにリンク文字自体もURLになっている場合を想定して、>も追加した。
リンク <a href="http://www.google.co.jp">http://www.google.co.jp</a>


完璧ではない場合もあるかもしれないが、概ね良好。



※2015.11.19 コメントをいただいて追記。

http://が行頭の場合に動作しない問題をご指摘いただき、下記のように修正。
先頭に ^| を追加するのだ。

$target = ereg_replace("(^|[^'\">])(https?|ftp)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)", "\\1<a href=\"\\2\\3\" target=\"_blank\">\\2\\3</a>" , $target);



ご指摘ありがとうございました。
さらに、php 5.3から ereg_replaceは非推奨ですから、preg_replaceの方が良いですね。
応援宜しくお願いします。ポチ↓↓
fC2ブログランキング にほんブログ村 グルメブログ 北海道食べ歩きへ 人気ブログランキングへ


| php | 16:26 | comments:2| trackbacks:0| TOP↑

≫ EDIT

yumでのpearインストール

以前の記事で、

pear DB
のインストールについて書いた。

PEAR DB.phpのインストール
http://vmemo.blog36.fc2.com/blog-entry-255.html


今いじっているサーバには、pear自体が入っていなかった。
phpは実行可能。


linux Cent OS

で、pearからインストールすることにした。

とはいえ、yumを使って、

# yum -y install php-pear

ですんなり入ったみたい。

その後は前回同様、

# /usr/bin/pear install DB

でインストール。

インストール時に、以下の様なメッセージ。

WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update
downloading DB-1.7.13.tgz ...
Starting to download DB-1.7.13.tgz (132,246 bytes)
.............................done: 132,246 bytes
install ok: channel://pear.php.net/DB-1.7.13


指示にしたがって、channel-updateをしてみた。

# /usr/bin/pear channel-update pear.php.net

これで完了だと思う。


しかし、実際に使ってみたら、

/usr/share/pear/DB.php

に実体もあり、アクセス権も問題なさそうなのに、
require_onceでDB.phpを読もうとすると、
ファイルがみつかないと言われてしまう。


Fatal error: require_once() [function.require]: Failed opening required 'DB.php' (include_path='.:/usr/share/pear') in ファイル名

include_pathには/usr/share/pearがきちんと入っているのに。。

なぜだー。



★その後の追記★

どうやら、open_basedirの設定が問題のようだ。

open_basedirを空にしたら、require_onceで読めるようになった。これで解決かな?


pleskでphpの使用を開始すると、[virtualhostのルート]/conf/httpd.include (環境に寄るかも?)に以下のような設定がされてしまう。


php_admin_flag engine on
php_admin_flag safe_mode off
php_admin_value open_basedir "[virtualhostのルート]/httpdocs:/tmp"


これはこれで、セキュリティを高める行為なのかな。

ただ、不便なので、
バーチャルホスト側の設定ファイル、[virtualhostのルート]/conf/vhost.confで、open_basedirを空にすることとした。


php_admin_value open_basedir none


""ではなくて、noneとする。

その後、Apacheの再起動。


応援宜しくお願いします。ポチ↓↓
fC2ブログランキング にほんブログ村 グルメブログ 北海道食べ歩きへ 人気ブログランキングへ


| php | 23:50 | comments:0| trackbacks:0| TOP↑

≫ EDIT

phpでの文字列比較の落とし穴が・・form受け渡しでのトラブルも

いろんなところで論じられている、文字列比較での落とし穴。

復習を兼ねて(いや、実際にやってみて改めて理解した)、練習問題を。

以下、どんな結果が得られるか予想をしてみましょう。

  // (1)
$a = "abc";
if( $a == 0 ) {
  echo 'true' . "\n";
 }
 else {
   echo 'false' . "\n";
 }
// (2)
$a = "10";
if( $a == 0 ) {
  echo 'true' . "\n";
 }
 else {
   echo 'false' . "\n";
 }
// (3)
$a = "0";
if( $a == 0 ) {
  echo 'true' . "\n";
 }
 else {
   echo 'false' . "\n";
 }
// (4)
$a = "0";
if( $a === 0 ) {
  echo 'true' . "\n";
 }
 else {
   echo 'false' . "\n";
 }
// (5)
$a = 0;
if( $a == 0 ) {
  echo 'true' . "\n";
 }
 else {
   echo 'false' . "\n";
 }
// (6)
$a = 0;
if( $a === 0 ) {
  echo 'true' . "\n";
 }
 else {
   echo 'false' . "\n";
 }
// (7)
$a = 0;
if( $a == "0" ) {
  echo 'true' . "\n";
 }
 else {
   echo 'false' . "\n";
 }
// (8)
$a = 0;
if( $a === "0" ) {
  echo 'true' . "\n";
 }
 else {
   echo 'false' . "\n";
 }









実行結果は以下です。

true
false
true
false
true
true
true
false




基本ルールとして、
== での比較は、型比較を行わない
=== での比較は、型比較を行なう

ということを理解していても、php君がどう解釈するのかはやってみると一目瞭然。

私も。勘違いをしていました。

(1)
文字列"abc"と、数値0の変則比較。
「文字列の最初の部分が、有効な数値データで始まるもの以外は0となる」らしく、
true。

(2)
変則比較ながら、文字列"10"を数値の10に変換して比較するようだ。
よってfalse

(3)
(2)と同じ理由でtrue

(4)
そもそも型がちがうので、false

(5)~(8)は確認用の基本的なやつですね。



今回、この事案との組み合わせではまってしまったのは、formからのpostデータ。

以下のような選択肢で、未選択の場合のエラーチェックをしたとき。

<select name="fruit">
<option value="0">選択してください</option>
<option value="1">りんご</option>
<option value="2">みかん</option>
</select>




if( $_POST['fruit'] === 0 ) {
    echo '未選択です';
}




の様なエラーチェックにヒットしない。

つまり、select~optionのvalue値は、phpでは文字列として受け取ることがわかった。



やっぱり奥が深い。



応援宜しくお願いします。ポチ↓↓
fC2ブログランキング にほんブログ村 グルメブログ 北海道食べ歩きへ 人気ブログランキングへ


| php | 17:09 | comments:0| trackbacks:0| TOP↑

| PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。