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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

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

Q&A

解決済

2回答

1437閲覧

ディレクトリ内にあるファイル名を、PSQLのテーブルに保持した値によって書き換えたいです。

Ruse

総合スコア13

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

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

0グッド

0クリップ

投稿2018/01/04 05:42

編集2018/01/04 07:36

###前提・実現したいこと
特定のディレクトリに保存してあるファイル名が、
PostgresqLのレコードにある項目Aの値と一致した場合、ファイル名を項目Bの値で書き換えるといったことを実現したいと考えています。

※※※1/4 16:00 追記部分
テーブルには複数件のレコードが存在し、ディレクトリ上のファイルも複数件あります。
項目A・項目Bの値はユニークであり、項目Aの値が別レコードの項目Bと一緒になることもありません。

イメージ的には

ディレクトリ内 "ABC123.html"というファイルがあった場合、
Postgresqlのあるテーブルの項目Aが"ABC123.html"、項目Bが"DEF456.html"だった場合、
項目BのDEF456.html にファイル名を変更したいのです。

###補足情報(言語/FW/ツール等のバージョンなど)
php7.1.9 Postgresql 9.6.5

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

↓ここから追記

###該当のソースコード

***テーブル側の項目を取得 //SELECT文で該当テーブルの項目を取得 $sql = "SELECT ~~~~ ******"; $stmt = $dbh->query($sql); ****ディレクトリ側 //特定のディレクトリ $path = './data2'; $res_dir = opendir( $path ); $fname = array(); //変数$fnameにファイル名を格納 while( $file_name = readdir( $res_dir ) ){ array_push($fname, $file_name); }

このような形でディレクトリ・ファイル名を一律で取得出来ないかとは考えていました
ただ、ここからどのように検索するかが分からず、質問させていただきました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

カレントディレクトリより実行される事を想定して作ってみました。ご参考まで

php

1<?php 2$conn = pg_connect("host=127.0.0.1 port=5432 dbname=hoge user=hoge password=hoge") 3 or die(pg_last_error()); 4 5//***テーブル側の項目を取得 6//SELECT文で該当テーブルの項目を取得 7$sql = "SELECT 項目a, 項目b FROM table_a"; 8$result = pg_query($conn, $sql); 9if (!$result) { 10 echo "An error occurred.\n"; 11 exit; 12} 13//****ディレクトリ側 14//カレントのディレクトリ 15$path = './data2'; 16while ($row = pg_fetch_assoc($result)) { 17 $filename=$path. "/". $row['項目a']; 18 if (file_exists($filename)) { 19 rename($filename, $path. "/". $row['項目b']); 20 } 21} 22pg_close($conn);

投稿2018/01/04 09:14

A.Ichi

総合スコア4070

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

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

Ruse

2018/01/05 09:26

丁寧にありがとうございます、頂いたphpを一部書き換えた上で実行した所、現状以下のエラーで変換出来ていない状態です。 PHP Warning: rename(ファイル名1,ファイル名2): �A�N�Z�X�����ۂ���܂����B (code: 5) in ~~ echoで道中のファイル名等を確認した所、取得できていて最終的なファイル名も .data2/ファイル名~ となっている事も確認できています。 ただ、 質問文の例では両方とも英数字でしたが、実際ファイル名2に日本語名が入るケースがあります。 この場合だと、mb_convert_encodingが必要になるのではないかと思って追加したりしたのですが、同様のエラーが発生しています。
Ruse

2018/01/05 09:32

日本語名が入るケースがあることは正しく明記しておくべきでした、申し訳ありません。
A.Ichi

2018/01/05 11:02

なるほど日本語ファイル名が入っているのですね、 私の環境では、postgresの内部文字、Linuxの文字設定がUTF8で、php.iniのmbstringもUTF8に設定しているからかもしれませんが、日本語ファイル名でもrenameできております。
Ruse

2018/01/09 09:03

postgresのDBの文字コードもUTF-8、mbstringもオンにしていますが、mbstring.internal_encodingはphp7では非推奨なのでコメントアウトしています。 IIS環境で実施していたのですが、もしかしたらLinuxとWindowsではまだ設定する所があるのかもしれません。再度色々調べてみます。
Ruse

2018/01/11 08:31

当該data2フォルダに対するアクセス権が適正な値になっていなかったのが原因でした。 大変助かりました、ありがとうございます。
guest

0

ディレクトリ内

というのは当該ディレクトリ直下ということでよろしいでしょうか?
であれば、DBから受け取った項目Aの値をループでまわし(もしくはピンポイントでもOK)
file_exists()で項目Aが存在し項目Bが存在しないことを検証した上で
rename()すればいよいでしょう。
項目Bの検証がない場合上書きされるので注意が必要です

投稿2018/01/04 06:07

yambejp

総合スコア114779

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

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

Ruse

2018/01/04 08:22

すいません、質問の不足部分を修正させて頂きました。 項目Aが複数あるので、実際は1レコード(1ファイル)ずつ照らし合わせる事になります となると、項目A・Bを配列格納→ファイル名を配列格納→ファイル名の配列を項目A配列から1つ取り出し検索→合致したらファイル名を項目Bに置き換え、Aを次の値にして繰り返しといった形になるのでしょうか。
yambejp

2018/01/04 08:49

> 項目A・Bを配列格納→ファイル名を配列格納→ファイル名の配列を項目A配列から1つ取り出し検索→合致したらファイル名を項目Bに置き換え、Aを次の値にして繰り返しといった形になるのでしょうか。 こうじゃないですか? ループ開始→項目A・Bを配列格納→ファイル名を変数に取り出す(仮に項目Aを$a,Bを$b)→file_exists($a)で検証、なければcontinue→file_exists($b)を検証あればどうする?スルーならcontinue→$aがあって$bがないならrename($a,$b)→ループ終了先頭へ戻る
Ruse

2018/01/05 09:29

$aを検証 → ある場合 → $bを検証 → ある場合 → 次のループへ                     → ない場合 → $aのファイル名を$bにrename      → ない → 次のループへ ということですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問