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

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

ただいまの
回答率

91.26%

  • PHP

    15693questions

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

  • PostgreSQL

    751questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 76

Ruse

score 6

前提・実現したいこと

特定のディレクトリに保存してあるファイル名が、
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);    
}

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

<?php
$conn = pg_connect("host=127.0.0.1 port=5432 dbname=hoge user=hoge password=hoge")
 or die(pg_last_error());

//***テーブル側の項目を取得
//SELECT文で該当テーブルの項目を取得
$sql = "SELECT 項目a, 項目b FROM table_a";
$result = pg_query($conn, $sql);
if (!$result) {
  echo "An error occurred.\n";
  exit;
}
//****ディレクトリ側
//カレントのディレクトリ
$path = './data2';
while ($row = pg_fetch_assoc($result)) {
    $filename=$path. "/". $row['項目a'];
    if (file_exists($filename)) {
        rename($filename, $path. "/". $row['項目b']);
    }
}
pg_close($conn);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/05 18:26

    丁寧にありがとうございます、頂いたphpを一部書き換えた上で実行した所、現状以下のエラーで変換出来ていない状態です。
    PHP Warning: rename(ファイル名1,ファイル名2): �A�N�Z�X�����ۂ���܂����B (code: 5) in ~~
    echoで道中のファイル名等を確認した所、取得できていて最終的なファイル名も .data2/ファイル名~ となっている事も確認できています。

    ただ、
    質問文の例では両方とも英数字でしたが、実際ファイル名2に日本語名が入るケースがあります。
    この場合だと、mb_convert_encodingが必要になるのではないかと思って追加したりしたのですが、同様のエラーが発生しています。

    キャンセル

  • 2018/01/05 18:32

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

    キャンセル

  • 2018/01/05 20:02

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

    キャンセル

  • 2018/01/09 18:03

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

    キャンセル

  • 2018/01/11 17:31

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

    キャンセル

+1

ディレクトリ内

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/04 17:22

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

    キャンセル

  • 2018/01/04 17: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)→ループ終了先頭へ戻る

    キャンセル

  • 2018/01/05 18:29

    $aを検証 → ある場合 → $bを検証 → ある場合 → 次のループへ
                        → ない場合 → $aのファイル名を$bにrename
         → ない → 次のループへ

    ということですね。

    キャンセル

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

ただいまの回答率

91.26%

関連した質問

  • 解決済

    postgreSQLで変数を使用したい

    PostgreSQLにて、変数を使用したい 以下のSQL文を参照ください UPDATE時に代入している現在時刻と、INSERT時に代入している現在時刻を全く同じ値にしたいの

  • 解決済

    PostgreSQLの配列型の全要素の比較

    前提・実現したいこと PostgreSQLの配列型の全要素を比較してすべて大きい場合のみTrueを返したいです。 例えば array[1, 2, 3] と array[1

  • 解決済

    重複したレコードを1件だけ残して削除したい

    postgreSQL(ver9.3.5)のデータベースを、phpPgAdmin(ver5.1)で操作しています。 phpPgAdmin でテーブルを表示させた時、 操作欄(

  • 解決済

    postgreSQL

    abcテーブル aaa   bbb  ccc       ddd 1020  taki 20160212   0 1020  jaki 20160421   0 105

  • 受付中

    PostgreSQL データの存在しない出力結果を0で埋めたい。

    PostgreSQL データの存在しない出力結果を0で埋めたい。 テーブルに存在しない、SQLの出力結果を0で埋めたいと考えております。 以下の様なSQLを作成したのですが

  • 受付中

    postgresql update select

    updateにて select文で検索した結果を更新したいのですが テーブル名 dataテーブル 変更したいカラム名 flg update テーブル名 set テー

  • 解決済

    sql select文での''の使用について

    postgresqlにて select '' as 宣言した名前,'' as 宣言した名前(2) form テーブル名 のような select部分でカラム名を宣言すると

  • 解決済

    SQLでURLから数字の部分だけ抜き出してくる

    postgres,prestoどちらかで良いのですが、URLから数字の部分だけを抜き出してくるクエリはどうすれば良いのでしょうか、、 例えば、https://teratail.co

同じタグがついた質問を見る

  • PHP

    15693questions

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

  • PostgreSQL

    751questions

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

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