[PHP-users 34811] OracleのDBに対するSELECT文の書き方について

View: New views
11 Messages — Rating Filter:   Alert me  

[PHP-users 34811] OracleのDBに対するSELECT文の書き方について

by uto-s :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

こんにちは。konaと申します。

最近、PHPとOracleの勉強し始めたものです。

下記の通り、PHPからOracleのデータベースをSELECT文で参照しようと
試みておりますが、属性がVARCHAR2の数値が納められたフィールドで、
WHERE句の条件を数値で検索しようとすると、
期待した値が取得できず困っています。
($row['NAME'] や $row['MAIL']は何も表示されません)

<?php
$uid = '0123456';
$con = OCILogon("id","password","dbserver:1521/inst");
$stmt = OCIParse($con, "SELECT * FROM TABLENAME WHERE UID = '$uid'");
 OCIExecute($stmt);

 while ($row = oci_fetch_array($stmt, OCI_ASSOC)) {
  echo $row['NAME'];
  echo $row['MAIL'];
 }
?>


但し、別なフィールド(属性がVARCHAR2のメールアドレスが納められた
フィールド)では、WHERE句をメールアドレスで検索すると、
問題なく値が取得できます。
($row['NAME'] には氏名、 $row['MAIL']にはメールアドレスが表示されます)

<?php
$mail = 'aaaa@...';
$con = OCILogon("id","password","dbserver:1521/inst");
$stmt = OCIParse($con, "SELECT * FROM TABLENAME WHERE MAIL = '$mail'");
 OCIExecute($stmt);

 while ($row = oci_fetch_array($stmt, OCI_ASSOC)) {
  echo $row['NAME'];
  echo $row['MAIL'];
 }
?>

SELECT文のWHERE句で数値の条件を設定する際の注意点がありましたら
解決方法も合わせてアドバイス頂けますと幸いです。

よろしくお願い致します。


_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34812] Re: OracleのDBに対するSELECT文の書き方について

by Mori Yojiro :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Sun, 25 Oct 2009 00:04:17 +0900
"kona" <uto-s@...> wrote:

> 下記の通り、PHPからOracleのデータベースをSELECT文で参照しようと
> 試みておりますが、属性がVARCHAR2の数値が納められたフィールドで、
> WHERE句の条件を数値で検索しようとすると、
> 期待した値が取得できず困っています。
> ($row['NAME'] や $row['MAIL']は何も表示されません)
単純に一致するUIDが無いだけでは?確実に存在する値で検索してみて下さい。

/* 森 洋二郎(Mori Yojiro)      */
/* Booby Trap Systems          */
/* yojiro-m@...    */
/* http://www.boobytrap.ne.jp/ */

_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34813] Re: OracleのDBに対するSELECT文の書き方について

by KUBO Tetsuro :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

久保です。

Oracleは使ったことはありませんが、他のRDBを使った経験から。

<?php
$uid = '0123456';
$con = OCILogon("id","password","dbserver:1521/inst");
$sql = "SELECT * FROM TABLENAME WHERE UID = '$uid'";
echo $sql;
?>

まずは"id"と"password"でOracleにログインできますでしょうか。ログインでき
た場合、表示されたsql文をターミナルで実行した場合はどんな結果になります
か?

その結果によってある程度問題が切り分けられると思います。



_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34814] Re: OracleのDBに対するSELECT文の書き方について

by Yoshiaki Yanagimoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

柳本です。

uidの文字列が0から始まっているので
oracleが8進数と解釈して暗黙キャストしてしまったのでは?

kona さんは書きました:

> こんにちは。konaと申します。
>
> 最近、PHPとOracleの勉強し始めたものです。
>
> 下記の通り、PHPからOracleのデータベースをSELECT文で参照しようと
> 試みておりますが、属性がVARCHAR2の数値が納められたフィールドで、
> WHERE句の条件を数値で検索しようとすると、
> 期待した値が取得できず困っています。
> ($row['NAME'] や $row['MAIL']は何も表示されません)
>
> <?php
> $uid = '0123456';
> $con = OCILogon("id","password","dbserver:1521/inst");
> $stmt = OCIParse($con, "SELECT * FROM TABLENAME WHERE UID = '$uid'");
> OCIExecute($stmt);
>
> while ($row = oci_fetch_array($stmt, OCI_ASSOC)) {
>  echo $row['NAME'];
>  echo $row['MAIL'];
> }
> ?>
>
>
> 但し、別なフィールド(属性がVARCHAR2のメールアドレスが納められた
> フィールド)では、WHERE句をメールアドレスで検索すると、
> 問題なく値が取得できます。
> ($row['NAME'] には氏名、 $row['MAIL']にはメールアドレスが表示されます)
>
> <?php
> $mail = 'aaaa@...';
> $con = OCILogon("id","password","dbserver:1521/inst");
> $stmt = OCIParse($con, "SELECT * FROM TABLENAME WHERE MAIL = '$mail'");
> OCIExecute($stmt);
>
> while ($row = oci_fetch_array($stmt, OCI_ASSOC)) {
>  echo $row['NAME'];
>  echo $row['MAIL'];
> }
> ?>
>
> SELECT文のWHERE句で数値の条件を設定する際の注意点がありましたら
> 解決方法も合わせてアドバイス頂けますと幸いです。
>
> よろしくお願い致します。
>
> _______________________________________________
> PHP-users mailing list  PHP-users@...
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3
>

_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34815] Re: OracleのDBに対するSELECT文の書き方について

by kazu yamamoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

山本@ジェネシスです。

On Sun, 25 Oct 2009 00:04:17 +0900
"kona" <uto-s@...> さん wrote:

> $stmt = OCIParse($con, "SELECT * FROM TABLENAME WHERE UID = '$uid'");

 '$uid' のシングルコーテーションを取ったらどうなりますか?
UID = $uid

 oracleって結構、数値・文字でも、
シングルコーテーションの有り・無しがアバウトで、
数値に '' を付けてもパースエラーはでないのですが、
結果、'0123456' を探して、マッチしてないのではないかと思いますが。

postgreSQLは、数値にシングルコーテーションを付けるとエラー?ってなってた気が。


--
kazu yamamoto <kazu@...>
http://team.genesis.ne.jp/
Freude am Fahren
_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34816] Re: OracleのDBに対するSELECT文の書き方について

by uto-s :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

森さん,柳本さん,山本さん,久保さん

konaです。皆さんご回答ありがとうございました。

森さんがメール下さった
> 単純に一致するUIDが無いだけでは?確実に存在する値で検索してみて下さい。
につきましては、確実に存在するIDで検索してみたのですが、
うまく検索にヒットしてくれません。

$sql をecho出力した結果は下記の通りです。

$uid = '0123456';
$con = OCILogon("id","password","dbserver:1521/inst");
$sql = "SELECT * FROM TABLENAME WHERE UID = '$uid'";
echo $sql;

上記の結果、$sql は、
SELECT * FROM TABLENAME WHERE UID = '0123456'
と表示されています。

柳本さんが述べられた通り、
$uid が 0で始まらない数字の場合 "123456" でも
うまく検索にヒットしてくれません。
SELECT * FROM TABLENAME WHERE UID = '123456'

また山本さんのメールの通り '$uid' のシングルコーテーションを
取っても変化なしでした。
SELECT * FROM TABLENAME WHERE UID = $uid

SELECT * FROM TABLENAME WHERE UID = 123456

久保さんのご回答の件ですが、WHERE句の検索条件をメールアドレス
等に変えて別なフィールドを検索すると、問題なく検索できますので
"id"と"password"が間違っているという事はないと思います。

ちなみに、OracleDBの UID フィールドは VARCHAR2 ですが
$uidのデータ型は文字列です。

メールアドレスでは検索できるのに、数字の文字列で検索できないのか
不思議です。


----- Original Message -----
From: "kona" <uto-s@...>
To: <php-users@...>
Sent: Sunday, October 25, 2009 12:04 AM
Subject: OracleのDBに対するSELECT文の書き方について


> こんにちは。konaと申します。
>
> 最近、PHPとOracleの勉強し始めたものです。
>
> 下記の通り、PHPからOracleのデータベースをSELECT文で参照しようと
> 試みておりますが、属性がVARCHAR2の数値が納められたフィールドで、
> WHERE句の条件を数値で検索しようとすると、
> 期待した値が取得できず困っています。
> ($row['NAME'] や $row['MAIL']は何も表示されません)
>
> <?php
> $uid = '0123456';
> $con = OCILogon("id","password","dbserver:1521/inst");
> $stmt = OCIParse($con, "SELECT * FROM TABLENAME WHERE UID = '$uid'");
> OCIExecute($stmt);
>
> while ($row = oci_fetch_array($stmt, OCI_ASSOC)) {
>  echo $row['NAME'];
>  echo $row['MAIL'];
> }
> ?>
>
>
> 但し、別なフィールド(属性がVARCHAR2のメールアドレスが納められた
> フィールド)では、WHERE句をメールアドレスで検索すると、
> 問題なく値が取得できます。
> ($row['NAME'] には氏名、 $row['MAIL']にはメールアドレスが表示されます)
>
> <?php
> $mail = 'aaaa@...';
> $con = OCILogon("id","password","dbserver:1521/inst");
> $stmt = OCIParse($con, "SELECT * FROM TABLENAME WHERE MAIL = '$mail'");
> OCIExecute($stmt);
>
> while ($row = oci_fetch_array($stmt, OCI_ASSOC)) {
>  echo $row['NAME'];
>  echo $row['MAIL'];
> }
> ?>
>
> SELECT文のWHERE句で数値の条件を設定する際の注意点がありましたら
> 解決方法も合わせてアドバイス頂けますと幸いです。
>
> よろしくお願い致します。


_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34817] Re: OracleのDBに対するSELECT文の書き方について

by Mori Yojiro :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Mon, 26 Oct 2009 22:07:15 +0900
"kona" <uto-s@...> wrote:

> SELECT * FROM TABLENAME WHERE UID = '0123456'
そのSQLをSQL*Plusで実行するとどうなりますか?

/* 森 洋二郎(Mori Yojiro)      */
/* Booby Trap Systems          */
/* yojiro-m@...    */
/* http://www.boobytrap.ne.jp/ */

_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34818] Re: OracleのDBに対するSELECT文の書き方について

by 山本 正浩 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

yamamoto です。


昔よく Oracle を使用していました。


> ちなみに、OracleDBの UID フィールドは VARCHAR2 ですが
> $uidのデータ型は文字列です。
>
> メールアドレスでは検索できるのに、数字の文字列で検索できないのか
> 不思議です。

手元に確認環境がないので記憶で回答しますが、
Oracle の CHAR 型のフィールドは固定長なので、UID が CHAR(8) などだった場合、

'0123456' というデータは、'0123456 ' という形で格納されていたような気がします。
UID のデータサイズはいくつでしょうか。

> ----- Original Message ----- From: "kona" <uto-s@...>
> To: <php-users@...>
> Sent: Sunday, October 25, 2009 12:04 AM
> Subject: OracleのDBに対するSELECT文の書き方について
>
>
>> こんにちは。konaと申します。
>>
>> 最近、PHPとOracleの勉強し始めたものです。
>>
>> 下記の通り、PHPからOracleのデータベースをSELECT文で参照しようと
>> 試みておりますが、属性がVARCHAR2の数値が納められたフィールドで、
>> WHERE句の条件を数値で検索しようとすると、
>> 期待した値が取得できず困っています。
>> ($row['NAME'] や $row['MAIL']は何も表示されません)
>>
>> <?php
>> $uid = '0123456';
>> $con = OCILogon("id","password","dbserver:1521/inst");
>> $stmt = OCIParse($con, "SELECT * FROM TABLENAME WHERE UID = '$uid'");
>> OCIExecute($stmt);
>>
>> while ($row = oci_fetch_array($stmt, OCI_ASSOC)) {
>>  echo $row['NAME'];
>>  echo $row['MAIL'];
>> }
>> ?>
>>
>>
>> 但し、別なフィールド(属性がVARCHAR2のメールアドレスが納められた
>> フィールド)では、WHERE句をメールアドレスで検索すると、
>> 問題なく値が取得できます。
>> ($row['NAME'] には氏名、 $row['MAIL']にはメールアドレスが表示されます)
>>
>> <?php
>> $mail = 'aaaa@...';
>> $con = OCILogon("id","password","dbserver:1521/inst");
>> $stmt = OCIParse($con, "SELECT * FROM TABLENAME WHERE MAIL = '$mail'");
>> OCIExecute($stmt);
>>
>> while ($row = oci_fetch_array($stmt, OCI_ASSOC)) {
>>  echo $row['NAME'];
>>  echo $row['MAIL'];
>> }
>> ?>
>>
>> SELECT文のWHERE句で数値の条件を設定する際の注意点がありましたら
>> 解決方法も合わせてアドバイス頂けますと幸いです。
>>
>> よろしくお願い致します。
>
>
> _______________________________________________
> PHP-users mailing list  PHP-users@...
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3
>



--
-<Thinkmeta>------------------------------------------
<?xml version="1.0" encoding="ISO-2022-JP" ?>
<signature>
    <name>山本 正浩[Masahiro Yamamoto]</name>
    <mail>yamamoto@...</mail>
    <web>http://www.thinkmeta.jp/</web>
</signature>
_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34819] Re: OracleのDBに対するSELECT文の書き方について

by KAMIJO.Yasuyoshi :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

上條@自宅と申します。

 konaさん、お世話になります。

> $uid = '0123456';
> $con = OCILogon("id","password","dbserver:1521/inst");
> $sql = "SELECT * FROM TABLENAME WHERE UID = '$uid'";
> echo $sql;
> ちなみに、OracleDBの UID フィールドは VARCHAR2 ですが
> $uidのデータ型は文字列です。

 TABLENAMEテーブルのCREATE TABLEのsql文を公開して下さい。


 以上、よろしくお願いいたします。


 ● 作成者:上條 靖芳 e-mail:yasuyoshi_kamijo@...  ●
                         blog:http://blogs.dion.ne.jp/yasuyoshi/
 on DELL Vostro 1520 Genuine Intel(R) CPU 2.00GHz WinXP SP3
 Becky! 2.50.07_ja + VB2008 EE + IE8.0 + Oracle11gR1(11.1.0.7)
_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34820] Re: OracleのDBに対するSELECT文の書き方について

by Takamitsu Yamane :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

こんばんは。はじめまして。

他の方が返信されていますがまずOracleでの問題なのかPHPでの問題なのか切り
分ける必要があると思います。

あと数値のUIDをOracle上のVARCHAR2フィールドに格納する際"TO_CHAR"関数を使
われていたら先頭に符号の1byteが付加されて'0123456'ではなく' 0123456'で格
納されている可能性はないでしょうか。

On Sun, 25 Oct 2009 00:04:17 +0900
"kona" <uto-s@...> wrote:

-------------------------
山根貴光 Yamane, Takamitsu
draftline.jp@...
-------------------------

_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

[PHP-users 34821] Re: OracleのDBに対するSELECT文の書き方について

by 聖歩美 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

聖と申します。
kona さんはじめまして、夜分にすみません。

Yamane さんの指摘される内容と同じですが、
数字以外の空白などの値がトリムされずに格納されているのでは?と感じました。

$stmt = OCIParse($con, "SELECT * FROM TABLENAME WHERE UID LIKE '%$uid%'");
などであいまいに検索してみてはいかがでしょうか。

> あと数値のUIDをOracle上のVARCHAR2フィールドに格納する際"TO_CHAR"関数を使
> われていたら先頭に符号の1byteが付加されて'0123456'ではなく' 0123456'で格
> 納されている可能性はないでしょうか。


_______________________________________________
PHP-users mailing list  PHP-users@...
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3