php5.1.6でのエラーメッセージについてお伺いします。

サーバーは、エックスサーバーです。

Warning: copy(img/http://www.hoge.com/03.png) [function.copy]: failed to open stream: No such file or directory in /home/xxxxxxx/xxx.com/public_html/qr/google.php on line 41
これはどういうエラーなのでしょうか?
下記コードのcopy($qr, $imgfile);部分で出ています。


define('QR_URI', 'http://chart.apis.google.com/chart');
set_time_limit(0);
$data = array("http://www.hoge.com/01", "http://www.hoge.com/02", "http://www.hoge.com/03");
foreach($data as $var) {
 $imgfile = 'img/' . $var . '.png';
 if (!file_exists($imgfile)) {
  $qr = QR_URI . '?chs=200x200&cht=qr&chld=m|1&chl=' . urlencode($var);
  copy($qr, $imgfile);
 }
}


よろしくお願いします。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/03/21 19:40:42
  • 終了:2011/03/21 20:34:02

ベストアンサー

id:deflation No.2

deflation回答回数1036ベストアンサー獲得回数1262011/03/21 20:19:08

ポイント42pt
$imgfile = 'img/' . $var . '.png';

において、コピー先が "img/http://www.hoge.com/01.png", "img/http://www.hoge.com/02.png", "img/http://www.hoge.com/03.png" になってしまっているのがエラーの原因です。


下記のように書き直してみて下さい。

define('QR_URI', 'http://chart.apis.google.com/chart');
set_time_limit(0);
$data = array(
    "http://www.hoge.com/01",
    "http://www.hoge.com/02",
    "http://www.hoge.com/03"
);
foreach($data as $var) {
    preg_match("/\/([0-9]+)$/", $var, $items);
    $imgfile = 'img/' . $items[1] . '.png';
    if (!file_exists($imgfile)) {
        $qr = QR_URI . '?chs=200x200&cht=qr&chld=m|1&chl=' . urlencode($var);
        copy($qr, $imgfile);
    }
}
id:seadwell

ファイル名変更のご指導までいただきありがとうございます。

無事ファイルは出力されました。

少し考えれば、ファイル名に同じURLまで含める必要は無いですね。

ありがとうございます。

2011/03/21 20:33:29

その他の回答(1件)

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492011/03/21 20:05:07

ポイント28pt

【原因】

Linuxではファイル名に / は使えないので書き込みに失敗します

( / はディレクトリの区切りに使われる文字のためです)

 

【解説】

file_existsはファイルまたはディレクトリの存在を探すだけなので / が区切り文字と認識されてもエラーの原因とはならず、単にFalseという結果になります

copyでは / をディレクトリの区切り文字としてしまうためNo such file or directory(ファイルかディレクトリが見当たらない)というエラーになります

 

【対応例】

(例1) / を _ などに置き換えてしまう

(例2)ファイル名はarray("www.hoge.com/01", "www.hoge.com/02", "www.hoge.com/03");といった具合にしておき、

  copyの前に www.hoge.com というディレクトリの存在確認(無ければ作る)をしてから copyを行うようにする

id:seadwell

あっさり動きました。

そんなルールがあるなんて今知りました。

ありがとうございます。

2011/03/21 20:23:42
id:deflation No.2

deflation回答回数1036ベストアンサー獲得回数1262011/03/21 20:19:08ここでベストアンサー

ポイント42pt
$imgfile = 'img/' . $var . '.png';

において、コピー先が "img/http://www.hoge.com/01.png", "img/http://www.hoge.com/02.png", "img/http://www.hoge.com/03.png" になってしまっているのがエラーの原因です。


下記のように書き直してみて下さい。

define('QR_URI', 'http://chart.apis.google.com/chart');
set_time_limit(0);
$data = array(
    "http://www.hoge.com/01",
    "http://www.hoge.com/02",
    "http://www.hoge.com/03"
);
foreach($data as $var) {
    preg_match("/\/([0-9]+)$/", $var, $items);
    $imgfile = 'img/' . $items[1] . '.png';
    if (!file_exists($imgfile)) {
        $qr = QR_URI . '?chs=200x200&cht=qr&chld=m|1&chl=' . urlencode($var);
        copy($qr, $imgfile);
    }
}
id:seadwell

ファイル名変更のご指導までいただきありがとうございます。

無事ファイルは出力されました。

少し考えれば、ファイル名に同じURLまで含める必要は無いですね。

ありがとうございます。

2011/03/21 20:33:29

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません