質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

Q&A

解決済

2回答

1695閲覧

phpで\マークが付いたファイル名を扱いたい

yukiko1025

総合スコア16

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

0グッド

1クリップ

投稿2020/01/11 08:19

編集2020/01/11 19:25

smartyのフレームワークを利用して、データベースから取得したデータを表示するプログラムを作っています。
データベースへのアクセス方法はDB2を用いており、アクセス先はAS/400です。

その中で、ファイル名に¥マークが入ったファイルを扱う必要があるのですが、
エラーが出てしまいレコードを取得できません。

ログを見たところ、データベースへのアクセスは成功しているのですが、
実際に指定したファイルを見つけるところでエラーとなっているようでした。

ファイル名とフィールド名は、すべて「AA¥BBBB」という形式で作られています。

また、ログに記録されたエラーは下記のようなものです。

トークン¥は正しくない。有効なトークンは+ -です。SQLCODE=-104 SQL::SELECT "AA¥FILE"."AA¥FIELD"

調べたところ、¥マークは特殊文字でありエスケープが必要だということはわかりました。
しかし、echoで書き出したりする際の¥¥では、ファイル名の指定が正常に行えませんでした。

アクセス先のファイル自体には、¥マークを抜いた状態に各名称を変更した後であれば、
正常にアクセスしレコードを持ってくることが出来ます。

データベースの管理上、¥マークを抜いた状態のファイル名に変更し運用するというのは難しいです。
以下のようにファイル名やフィールド名を指定する場合で、¥付きの文字列を扱う際にはどうすれば良いのでしょうか?

php

1try { 2 3   $dbmaster = new DBMASTER('AA¥FILE'); 4   $target['AA¥FIELD = ?'] = 'AA¥FIELD AS AA¥FIELD'; 5 6   $arr = $dbmaster->fetchAll(); 7 8}

皆様のお力添えをお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/01/11 08:41 編集

¥ ←全角に見えますが、本当に全角ですか? 全角ならエスケープ不要かと思いますが。。 あとコードが中途半端すぎる状態で提示されています。 なるべく全体の流れがわかるようなコードをご提示ください。
otn

2020/01/11 14:26

コードは変に書き換えたりせずに、コピペしてください。
yukiko1025

2020/01/11 19:27 編集

¥マークについては、ソース内では半角です。 半角で入力すると、環境によってはバックスラッシュで表示されていたため、 DB管理先のas/400での表示と合わせるために質問文中では全角で入力していました、修正します。 前後ソースについては、ファイル・およびフィールド名内で¥を使用できるのかという質問でしたので 不要かと思いtry文前後を割愛していました。 後日追記します。
m.ts10806

2020/01/12 05:02

AS400となると個人で気軽に試せるものではないのでアドバイスを得るのは難しい部分があると思います。 環境的な設定が合っているのか(本当にその名前で存在するのか) PHPからではなくDB2直にSQL実行してみてどうか、とか地道に確かめていくしかないのではと。
退会済みユーザー

退会済みユーザー

2020/01/13 06:58

ちなみに某言語での正規表現で \ を表す場合は \\\\ と4つ重ねないといけない場合も・・・・
guest

回答2

0

ベストアンサー

文章を見るに、円記号とバックスラッシュの取り違えが原因かもしれません。

多くの日本語フォントで半角円記号として表示される文字は2つあり、
あなたがタイトルに書いている

phpで\マークが付いたファイル名を扱いたい

このU+005C「\」が本来はバックスラッシュだが歴史的経緯で環境により円記号として表示される文字で、これは特殊文字なのでエスケープが必要です。
一方、あなたが本文中で一貫して使っている

ファイル名に¥マークが入ったファイルを

などのU+00A5「¥」が本来の円記号で、こちらはまったく普通の文字ですのでエスケープは不要です。

この辺を間違えて入力していないか、DBに実際に入っている文字はどちらなのか、今一度確認することをおすすめします。

投稿2020/01/13 04:50

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

DB2 は暑かったことないですけど、エスケープなら\を重ねるのでは?
特殊文字のエスケープ

投稿2020/01/11 23:03

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/11 23:04

なので、重ねたときの挙動が`正常に行えませんでした。`というのは別の理由ではないかと思います。 切り分けされてますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問