PHPで値がセットされているか確かめる方法

このエントリーをはてなブックマークに追加
はてなブックマーク - PHPで値がセットされているか確かめる方法
Share on Facebook

似たようなエントリは無数にありますが、自分用のまとめとして。

PHPで「値がセットされているか」をチェックするには、下記のように何通りか書き方があります。

if (isset($var)) {...}
if (!empty($var)) {...}
if ($var) {...}

それぞれの違いがあいまいだと痛い目を見るので、違いをハッキリさせておきます。

テストコード

結果

*** NULL ***
isset(NULL): false
!empty(NULL): false
(NULL): false

*** true ***
isset(true): true
!empty(true): true
(true): true

*** false ***
isset(false): true
!empty(false): false
(false): false

*** 'false' ***
isset('false'): true
!empty('false'): true
('false'): true

*** '' ***
isset(''): true
!empty(''): false
(''): false

*** 0 ***
isset(0): true
!empty(0): false
(0): false

*** '0' ***
isset('0'): true
!empty('0'): false
('0'): false

*** 'aaaaa' ***
isset('aaaaa'): true
!empty('aaaaa'): true
('aaaaa'): true

*** 12345 ***
isset(12345): true
!empty(12345): true
(12345): true

*** array () ***
isset(array ()): true
!empty(array ()): false
(array ()): false

以上より、「値がセットされているか」が真になるのは、下記の表のようになります。

- isset($var) !empty($var) ($var)
NULL false false false
true true true true
false true false false
‘false’ true true true
true false false
0 true false false
’0′ true false false
‘aaaaa’ true true true
12345 true true true
array() true false false

まとめ

  • issetはNULL以外がセットされていればtrue
  • 「!empty($var)」と「($var)」は同義
  • empty()は大変クセが強いので、公式マニュアルを熟読しましょう。

varが空でないか、0でない値であれば FALSE を返します。

次のような値は空であるとみなされます。

  • “” (空文字列)
  • 0 (整数 の 0)
  • 0.0 (浮動小数点数の 0)
  • “0″ (文字列 の 0)
  • NULL
  • FALSE
  • array() (空の配列)
  • var $var; (変数が宣言されているが、クラスの中で値が設定されていない)

参考

PHPの公式マニュアルを見て確かめましょう。

最新のパッケージをyumでインストールする

このエントリーをはてなブックマークに追加
はてなブックマーク - 最新のパッケージをyumでインストールする
Share on Facebook

yum公式リポジトリ内の古いApacheやphpではなく、最新版をrpmで入れる方法です。

下記に記す非公式リポジトリを参照することで、最新のパッケージをyumでインストールできます。

もちろん公式のリポジトリより信頼性は劣るようなので、注意が必要です。

手順

Remiリポジトリ追加

RemiリポジトリはEPELリポジトリに依存しているため、両方追加する必要があります。

最新のダウンロード先は下記から確認してください。

# wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
# wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
# rpm -ivh epel-release-5-4.noarch.rpm remi-release-5.rpm

※前のバージョンのrpmが入っている場合、「rpm -Uvh {パッケージ名}」を指定します。

これでyumのリポジトリにRemiとEPELを参照できるようになりました。

$ ls /etc/yum.repos.d/
CentOS-Base.repo       CentOS-Media.repo  epel-testing.repo  remi.repo
CentOS-Debuginfo.repo  CentOS-Vault.repo  epel.repo

Utterリポジトリ追加

/etc/yum.repos.d/utter.repo を開き、下記のように編集します。

[utter]
name=Jason's Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=0
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

以上で、phpやhttpdの最新版がyumでインストールできるようになりました。

最新パッケージのインストール

yumコマンドに「–enablerepo={リポジトリ名}」オプションを付けることで、それぞれのリポジトリを参照できます。

PHPの場合

# yum --enablerepo=remi install php
...
===================================================================================================================
 Package                  Arch                 Version                                 Repository             Size
===================================================================================================================
Installing:
 php                      x86_64               5.3.9-1.el5.remi                        remi                  2.8 M
Installing for dependencies:
 httpd                    x86_64               2.2.3-53.el5.centos.3                   updates               1.2 M
 libedit                  x86_64               2.11-2.20080712cvs.el5                  epel                   80 k
 php-cli                  x86_64               5.3.9-1.el5.remi                        remi                  2.6 M
 php-common               x86_64               5.3.9-1.el5.remi                        remi                  997 k

Transaction Summary
===================================================================================================================
Install       5 Package(s)
Upgrade       0 Package(s)

Total download size: 7.7 M
Is this ok [y/N]: 

Apache2(httpd)の場合

# yum --enablerepo=utter install httpd
...
===================================================================================================================
 Package                       Arch                   Version                          Repository             Size
===================================================================================================================
Installing:
 httpd                         x86_64                 2.2.21-jason.1                   utter                 3.2 M
Installing for dependencies:
 apr-util-ldap                 x86_64                 1.3.12-1.jason.1                 utter                  20 k
Updating for dependencies:
 apr-util                      x86_64                 1.3.12-1.jason.1                 utter                 201 k

Transaction Summary
===================================================================================================================
Install       2 Package(s)
Upgrade       1 Package(s)

Total download size: 3.4 M
Is this ok [y/N]: 

参考

pacoでソースからインストールしたアプリを管理する

このエントリーをはてなブックマークに追加
はてなブックマーク - pacoでソースからインストールしたアプリを管理する
Share on Facebook

pacoは、自分でソースからインストールしたアプリでもrpmのようにパッケージ管理できるようになるツールです。

インストール手順

最新のソースは paco – a source code pacKAGE oRGANIZER for Unix/Linux で確認してください。

# wget http://sourceforge.net/projects/paco/files/paco/2.0.9/paco-2.0.9.tar.bz2/download
# tar xvf paco-2.0.9.tar.bz2 
# cd paco-2.0.9
# ./configure --disable-gpaco
# make
# make install
# make logme

今回はGUIを使わないので、configureオプションに「–disable-gpaco」を付けています。 これを付けないと「No package ‘gtkmm-2.4′ found」というエラーが出ます。

最後の「make logme」でpaco自身のインストール内容を記録しています。

使い方

インストールを記録する

今後、何らかのアプリをmake installする際には、「paco -D」を付けることでpacoに記録できます。

# cd {インストールしたいパッケージ}
# paco -D make install

インストール済みパッケージを確認する

「-a」オプションを使います。

# paco -a
paco-2.0.9

パッケージでインストールされたファイルを確認する

「-f」オプションを使います。

$ paco -f paco-2.0.9
paco-2.0.9:
/usr/local/share/paco/README
/usr/local/lib/libpaco-log.a
/usr/local/lib/libpaco-log.la
/usr/local/lib/libpaco-log.so
/usr/local/lib/libpaco-log.so.0
/usr/local/lib/libpaco-log.so.0.0.0
/usr/local/bin/paco
/usr/local/etc/pacorc
/usr/local/lib/pkgconfig/paco.pc
/usr/local/share/man/man5/pacorc.5
/usr/local/share/man/man8/paco.8
/usr/local/share/man/man8/pacoball.8
/usr/local/share/man/man8/rpm2paco.8
/usr/local/share/man/man8/superpaco.8
/usr/local/share/paco/faq.txt
/usr/local/share/paco/pacorc
/usr/local/bin/ocap
/usr/local/bin/pacoball
/usr/local/bin/rpm2paco
/usr/local/bin/superpaco

パッケージをアンインストールする

「-r」オプションです。

# paco -r {アンインストールしたいパッケージ名}

参考

CentOSでbzip2が解凍できないエラー

このエントリーをはてなブックマークに追加
はてなブックマーク - CentOSでbzip2が解凍できないエラー
Share on Facebook

bzip2ファイルを解凍しようと思ったら、見慣れないエラーが出ました。

# tar xvf paco-2.0.9.tar.bz2 
tar: bzip2: exec 不能: そのようなファイルやディレクトリはありません
tar: エラーを回復できません: 直ちに終了します
tar: Child returned status 2
tar: 処理中にエラーが起きましたが、最後まで処理してからエラー終了させました

ただ単にbzip2がインストールされていなかったのが原因でした。yumで入れて即解決です。

# yum -y install bzip2
...
Installed:
  bzip2.x86_64 0:1.0.3-6.el5_5                                                                                     

Complete!

CloudCore VPSでこのエラーに遭遇しました。 CentOSの最小構成でインストールされているようで、ごく普通のコマンドが使えないことが多いです。 パッケージが不足していないか注意が必要ですね。

参考

CloudCore VPS初期設定

このエントリーをはてなブックマークに追加
はてなブックマーク - CloudCore VPS初期設定
Share on Facebook

高スペック&安価&国産で話題のCloudCore VPSをレンタルしてみました。 このスペックで月980円はたしかにお得です。

# cat /etc/redhat-release 
CentOS release 5.6 (Final)

# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/vda1              97G  5.0G   87G   6% /
tmpfs                1003M     0 1003M   0% /dev/shm

# cat /proc/cpuinfo
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 16
model           : 2
model name      : AMD Phenom(tm) 9550 Quad-Core Processor
stepping        : 3
cpu MHz         : 2199.998
cache size      : 512 KB
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb lm up pni cx16 popcnt lahf_lm cmp_legacy svm cr8_legacy altmovcr8 abm sse4a misalignsse
bogomips        : 4399.99
TLB size        : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

# cat /proc/meminfo 
MemTotal:      2053764 kB
MemFree:       1859380 kB

まずは初期設定メモを残しておきます。

よく使うパッケージのインストール

CentOS最小構成でインストールされているらしく、よく使うパッケージが全然入っていません。入れておきましょう。

# yum -y install sudo vim-enhanced iptables vsftpd bzip2 gcc gcc-c++ make automake mlocate

導入しているパッケージの説明は下記の通り。

パッケージ名 説明
sudo sudoコマンド
vim-enhanced 標準で入っているviの高機能版
iptables ファイアーウォール
vsftpd FTPデーモン
bzip2 bzip2圧縮・解凍
gcc, gcc-c++ コンパイル時に必要
make, automake ソースからインストールする時必要
mlocate locate & updatedbコマンド
vixie-cron crontabコマンド & cronデーモン

crondは起動し、自動起動をオンにしておきます。

# /etc/rc.d/init.d/crond start
# chkconfig crond on

また、インストール済みのパッケージを更新しましょう。 私の場合100パッケージ(129MB)ありました。

# yum update

作業用ユーザー追加

rootでの作業はリスク上よろしくないので、作業用ユーザーを追加します。 wheelグループに追加することで、su権限が得られます。

# useradd mojamoja
# usermod -G wheel mojamoja

wheelグループのユーザーがsudoを実行できるよう設定します。

# visudo

----
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
↑この行のコメントアウトを外す。

sshポートの変更

sshポートデフォルトの22番ではポートスキャンの標的になりやすいので、変更します。

#vim /etc/ssh/sshd_config

以下の行を変更。

#port 22
port 10022

sshデーモンを再起動して変更を反映します。 これで22番ポートではsshログインできなくなっています。

# /etc/init.d/sshd restart

不要なデーモンの停止

初期状態では4つのデーモンしか自動起動設定になっておらず、特に停止するようなデーモンはありません。

参考: スペック|CloudCore VPS|KDDIウェブコミュニケーションズ

ファイアーウォールの構築

ssh(10022), FTP, HTTPで接続できるようポートを開放してやります。 下記シェルファイルを作成し、実行してください。

※コンソールから1行ずつ打つと、「/sbin/iptables -P INPUT DROP」設定直後にコンソールが操作不能になります。 その場合、コントロールパネルから再起動することで再度ログイン可能になります。

#!/bin/sh
 
/sbin/iptables -F
/sbin/iptables -X
 
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD DROP
 
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT
 
/sbin/iptables -A INPUT -s 10.0.0.0/8 -j DROP
/sbin/iptables -A INPUT -s 172.16.0.0/12 -j DROP
/sbin/iptables -A INPUT -s 192.168.0.0/16 -j DROP
 
/sbin/iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
 
/sbin/iptables -A INPUT -p tcp --dport 10022 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
 
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
/etc/rc.d/init.d/iptables save
 
/sbin/service iptables restart

設定が終わったら実行します。

# chmod +x set_iptables.sh 
# ./set_iptables.sh 
ファイアウォールのルールを /etc/sysconfig/iptables に保存中[  OK  ]
ファイアウォールルールを適用中:                            [  OK  ]
チェインポリシーを ACCEPT に設定中filter                   [  OK  ]
iptables モジュールを取り外し中                            [  OK  ]
iptables ファイアウォールルールを適用中:                   [  OK  ]

無事設定できたら、サーバー起動時にサービスが開始するよう設定します。設定が間違ったままこれをonにすると、コントロールパネルから再起動してもログイン不能になるので注意してください。

# chkconfig iptables on

FTPを接続可能にする

/etc/vsftpd/vsftpd.conf を以下のように設定します。

以下の既存の行を修正する。

# 匿名ユーザーのログインを禁止
anonymous_enable=NO

# asciiモードでファイルを転送可能にする
ascii_upload_enable=YES
ascii_download_enable=YES

以下の行を追加。

# ファイル所有者を数字ではなくユーザー名で表示する
text_userdb_names=YES

# ファイルの上書き時間が日本時間になる
use_localtime=YES

設定が終わったら起動し、自動起動もオンにしましょう。

# /etc/rc.d/init.d/vsftpd start
vsftpd 用の vsftpd を起動中:                               [  OK  ]
# chkconfig vsftpd on

FTPクライアントで10022番ポートにSFTP接続可能になっていることを確認してください。

参考

Windows7にAndroid開発環境構築

このエントリーをはてなブックマークに追加
はてなブックマーク - Windows7にAndroid開発環境構築
Share on Facebook

「Androidは簡単に開発が可能」と言われてる割に導入が面倒だったので、メモしておきます。

手順

1. 必要ファイルのダウンロード

Windows 7 64bitの場合、下記アプリをダウンロードしました。

2. Java 6 JDKの設定

インストールしたファイルを実行して、画面に従うだけ。

3. Android SDKの設定

  1. ダウンロードしたファイルを解凍orインストーラー実行
  2. Android SDKのインストールが完了後、Managerが起動するので、使いたいAPIにチェックして[Install * Packages]
    • 2.1を選べば97%のAndroidユーザーをカバーできるらしいので、チェック
    • 必要に応じて別のバージョンもインストールする

4. Eclipseの設定

Android Developer Tools (ADT)のインストール

  1. ダウンロードしたファイルを解凍し、eclipse.exeを実行
  2. Eclipseを起動し、[Help] – [Install software]
  3. [Work with:]の隣にある[Add]をクリック。完了したら[OK]
    • Name: Android Plugin
    • Location: http://dl-ssl.google.com/android/eclipse/
    • 「https」を指定すると途中でエラーが出て止まる
  4. [Work with:]に今入力した項目を選択。数十秒「Pending…」が表示された後、[Developer Tools]が出てきたらチェックを付けて[Next]
  5. インストールされるパッケージ一覧が出るので、[Finish]
  6. 途中「Security Warning」が出るが、[OK]
  7. 長時間インストール完了を待ち、完了したら[Restart Now]
  8. Eclipse再起動後、「Welcome to Android Development」が表示されるので、[Use existing SDKs]にチェック
  9. SDKのインストール先を指定して[Next]
    • デフォルトなら “C:\Program Files (x86)\Android\android-sdk”
  10. 統計データをGoogleに送るかどうか選択して[Finish]

AVDの作成

  1. [Window] – [AVD Manager]
  2. [New]
  3. 下記項目を入力して[Create AVD]
    • [Name]: 機器名。好きな名前でOK
    • [Target]: Androidのバージョン
    • [SD Card]: エミュレータが使用するSDカード容量。32MBもあれば十分
    • [Skin]: 画面解像度
    • [Hardware]: エミュレータのハード。GPSなど、開発しようとするアプリに合わせて選択
  4. [Start]をクリックして、エミュレータが起動したらOK
    • 日本語化したい場合
    • 起動後にホーム画面でメニューボタンクリック
    • [Settings] > [Language & keyboard]
    • [Select locale]から日本語を選択

設定は以上で完了です。

5. サンプルアプリのビルド

ここまででビルド可能になっているので、試してみましょう。

  1. [File] – [New] – [Other...]
  2. Android Project を選択して[Next]
  3. 以下のように設定して[Next]
    • Project Name: SampleApp
    • “Create projects from existing source”にチェック
    • Location: “C:\Program Files (x86)\Android\android-sdk\samples\android-7\SkeletonApp”
  4. Build Targetは”Android 2.1″にチェックして[Next]
  5. Minumum SDKを”7″にして[Finish]
  6. [Run] – [Run Configurations...]
  7. [New launch configuration]アイコンをクリック
  8. [Project:]に”SampleApp”を指定して[Run]
  9. エミュレーター上に”Hello there, you Activity!”と表示されれば成功

なお、ビルドされたアプリはbinディレクトリの下に「SampleApp.apk」という名前で入っています。これをAndroidに転送すれば実機で実行できます。 (ただし「提供元不明のアプリ」を使用可能にしておくこと)

参考

CentOS 5.5にyumでgitをインストールする

このエントリーをはてなブックマークに追加
はてなブックマーク - CentOS 5.5にyumでgitをインストールする
Share on Facebook

さくらVPS(CentOS 5.5が標準OS)を試用中です。早速gitを使おうと思いましたが、デフォルトでは未インストール。yumで入れようと思いましたが、標準のリポジトリではインストールできません。

というわけで、リポジトリを追加します。

インストール手順

1. 参照リポジトリを追加する

/etc/yum.repos.d/rpmforge.repo を作成し、下記のように追記します。

[rpmforge]
name = Red Hat Enterprise $releasever - RPMforge.net - dag
mirrorlist = http://apt.sw.be/redhat/el5/en/mirrors-rpmforge
enabled = 0
gpgcheck = 0

2. yumでインストールする

# yum install git --enablerepo=rpmforge
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.nara.wide.ad.jp
 * extras: ftp.nara.wide.ad.jp
 * rpmforge: ftp-stud.fht-esslingen.de
 * updates: ftp.nara.wide.ad.jp

...

 ====================================================================================================================
 Package                  Arch                   Version                             Repository                Size
====================================================================================================================
Installing:
 git                      x86_64                 1.7.6.4-1.el5.rf                    rpmforge                 6.6 M
Installing for dependencies:
 perl-DBI                 x86_64                 1.52-2.el5                          base                     600 k
 perl-Git                 x86_64                 1.7.6.4-1.el5.rf                    rpmforge                  24 k

Transaction Summary
====================================================================================================================
Install       3 Package(s)
Upgrade       0 Package(s)

Total download size: 7.2 M
Is this ok [y/N]: y
...
Complete!
  1. 確認
# git --version
git version 1.7.6.4

完了です。

参考

HTTP_Request2でhttps接続できない場合の対策

このエントリーをはてなブックマークに追加
はてなブックマーク - HTTP_Request2でhttps接続できない場合の対策
Share on Facebook

HTTP_Request2::send()でhttpsサイトに接続しようとしたら、下記のようなエラーが返ってきました。

Malformed response:
Unable to connect to ssl://www.google.com:443.
stream_socket_client(): unable to connect to ssl://www.google.com:443 (Unknown error)

Unknown errorというのが一番タチが悪い。エラーが追えません。

検証のためcurlコマンドで同じURLに接続を試みると、ちゃんとレスポンスが返ってきます。何か設定をし忘れているに違いない。

原因

どうやらHTTP_Request::setConfig()で正しい接続設定を行えていない場合、”Malformed response”というエラーが出るようです。 私の場合、オレオレ証明書の許可と社内プロキシの設定を行っていなかったためにはまってしまったようです。

対応

オレオレ証明書を持ったサイトを許可するために、setConfig()でssl_verify_peerssl_verify_hostをfalseに設定してやります。 また、プロキシの設定も行います。

<?php
require_once('HTTP/Request2.php');
$req = new HTTP_Request2();

$req->setConfig(array(
    'ssl_verify_host' => false,
    'ssl_verify_peer' => false,
    'proxy_host' => 'uso.proxy.jp',
    'proxy_port' => '8080',
));

$response = $req->setUrl("https://www.google.com/")->send();
print_r($response);     // HTTPレスポンスが出力される

ほかにも設定項目はあるので、マニュアルを参考に設定を疑ってみてはどうでしょうか。

参考

pear installできないのがpear clear-cacheで解決

このエントリーをはてなブックマークに追加
はてなブックマーク - pear installできないのがpear clear-cacheで解決
Share on Facebook

pear installでパッケージをインストールしようと思いましたが、身に覚えのないエラーが出て困りました。

$ pear install HTTP_Request2
PHP_PEAR_PHP_BIN is not set correctly.
Please fix it using your environment variable or modify
the default value in pear.bat
The current value is:
.\php.exe

$ pear install Net_URL2-2.0.0
SECURITY ERROR: Will not write to C:\DOCUME~1\keijiro\LOCALS~1\Temp\pear\cache\ee3f372dc6f69cdae3c6b0c2a0d1098erest.cacheid as it is symlinked to C:\DOCUME~1\keijiro\LOCALS~1\Temp\pear\cache\ee3f372dc6f69cdae3c6b0c2a0d1098erest.cacheid - Possible symlink attack
install failed

「PHP_PEAR_PHP_BINが間違ってる」「一時ファイルが書き込めない」など言われていますが、どちらも正常に設定できています。

はてどうしたことか。 と思いましたが、pear clear-cacheを実行したらコマンドが通るようになりました。

$ pear clear-cache
reading directory C:\DOCUME~1\keijiro\LOCALS~1\Temp\pear\cache
1024 cache entries cleared

$ pear install Net_URL2-2.0.0

Notice: fwrite(): send of 189 bytes failed with errno=10054 既存の接続はリモート ホストに強制的に切断されました。
 in PEAR\Downloader.php on line 1664
downloading Net_URL2-2.0.0.tgz ...
Starting to download Net_URL2-2.0.0.tgz (11,325 bytes)
.....done: 11,325 bytes
install ok: channel://pear.php.net/Net_URL2-2.0.0

$ pear install HTTP_Request2-2.0.0

Notice: fwrite(): send of 189 bytes failed with errno=10054 既存の接続はリモート ホストに強制的に切断されました。
 in PEAR\Downloader.php on line 1664
pear/HTTP_Request2 can optionally use PHP extension "curl"
pear/HTTP_Request2 can optionally use PHP extension "fileinfo"
downloading HTTP_Request2-2.0.0.tgz ...
Starting to download HTTP_Request2-2.0.0.tgz (97,476 bytes)
......................done: 97,476 bytes
install ok: channel://pear.php.net/HTTP_Request2-2.0.0

Noticeが出ていますが、問題無く使えました。

参考

SQLiteのインメモリDBを異なるPDOオブジェクトから参照するには

このエントリーをはてなブックマークに追加
はてなブックマーク - SQLiteのインメモリDBを異なるPDOオブジェクトから参照するには
Share on Facebook

どうにもSQLiteのインメモリDBの値が取得できなかったので、実験してみました。 いきなり結論を書くと、「あるPDOオブジェクトからは、別のPDOオブジェクトが作成したインメモリDBには接続できない」ようです。

テストコード

<?php
/**
 * SQLiteのオンメモリDBにテストデータを作成し、PDOからアクセスできることを確かめる
 */
try {
    $pdo1 = new PDO('sqlite::memory:', null, null);
    $pdo1->exec('CREATE TABLE uso(id INTEGER PRIMARY KEY, name STRING)');
    $pdo1->exec('INSERT INTO uso VALUES (1, "uhouho");');
    $pdo1->exec('INSERT INTO uso VALUES (2, "mojamoja");');

    // 接続済みのPDOオブジェクトからデータを取得できるか試してみる
    $stmt = $pdo1->query('SELECT * FROM uso');
    if (!$stmt) {
        echo 'Cannot fetch data via $pdo1.';
    } else {
        print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
    }

    // 新たにPDOオブジェクトを作成し、データを取得できるか試してみる
    $pdo2 = new PDO('sqlite::memory:');
    $stmt = $pdo2->query('SELECT * FROM uso');
    if (!$stmt) {
        echo 'Cannot fetch data via $pdo2.';
    } else {
        print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
    }
} catch (Exception $e) {
    exit($e->getMessage());
}

結果

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => uhouho
        )

    [1] => Array
        (
            [id] => 2
            [name] => mojamoja
        )

)
Cannot fetch data via $pdo2.

$pdo1で作成したインメモリDBに、$pdo2からは接続できていません。 どちらも同じ「sqlite::memory:」ですが、見ている領域は異なるようです。

考察

インメモリDB内に作ったテーブルに、複数のPDOオブジェクトからアクセスすることはできませんでした。 アクセスしたければ、テーブルを作ったPDOオブジェクトを使い回すしかなさそうです。