アプリ版:「スタンプのみでお礼する」機能のリリースについて

APIの天気予報を、PHP+smartyで表示しようと思います。しかし表示された画面のソースを見ると、xhtmlの最初の行に半角スペースが入って、htmlと認識されてしまいます。原因は以下のファイルのようなのですが、なにか原因がありますでしょうか?ちなみに、<?phpはファイルの先頭に、?>の後の改行はありません、文字コードはutf-8bom無しです
以下のファイルにidをpostしています。どうかご教授いただけないでしょうか?..........................................................
$documentroot = dirname( __FILE__) . '/';
require_once $documentroot . '../../php_libs/config/config.inc.php';
require_once("jsphon2/Jsphon.php");
require_once ("Net/UserAgent/Mobile.php");
require_once ("Net/IPv4.php");
require_once( _SMARTY_LIBS_DIR . "Smarty.class.php");

$smarty = new Smarty();

$smarty->template_dir = _SMARTY_TEMPLATES_DIR;
$smarty->compile_dir = _SMARTY_TEMPLATES_C_DIR;
$smarty->config_dir = _SMARTY_CONFIG_DIR;
$smarty->cache_dir = _SMARTY_CACHE_DIR;
$smarty->caching = 2;

if(isset($_POST['id'])){
//ライブドアの天気予報を表示する関数
function lwws($city,$day){
//XMLデータ取得用ベースURL
$req = "http://weather.livedoor.com/forecast/webservice/ …
//XMLデータ取得用リクエストURL生成
$req .= "?city=".$city."&day=".$day;
//XMLファイルをパースし、オブジェクトを取得
$xml = simplexml_load_file($req)
or die("XMLパースエラー");

$lwwsarea = $xml->pinpoint->location->title;
$lwwstitle = $xml->title;
$lwwsimage = $xml->image->url;
$lwwsalt = $xml->image->title;
$lwwsmax = $xml->temperature->max->celsius;
$lwwsmin = $xml->temperature->min->celsius;
$lwwsdescription = $xml->description;
$ret = '<div class="lwws">';
$ret .= '<div>'.'<span style="color:#ff0000;"></span>'.$lwwsarea.'の天気</div>';
$ret .= '<div style="background-color:#fce6f3">'.$lwwstitle."</div>";
$ret .= "<br /><div><img src=\"".$lwwsimage."\" alt=\"".$lwwsalt."\" /></div>";
$ret .= "<div>最高気温".$lwwsmax."度</div>";
$ret .= "<div>最低気温".$lwwsmin."度</div>";
$ret .= "<div>".$lwwsdescription."</div>";
$ret .= "</div>";
return array ($ret,$lwwsarea,$lwwstitle);
}

function lwws2($city,$day){
//XMLデータ取得用ベースURL
$req = "http://weather.livedoor.com/forecast/webservice/ …
//XMLデータ取得用リクエストURL生成
$req .= "?city=".$city."&day=".$day;
//XMLファイルをパースし、オブジェクトを取得
$xml = simplexml_load_file($req)
or die("XMLパースエラー");

$ret = '<div class="lwws2">';
$ret .= '<div style="background-color:#fce6f3">'.$xml->title."</div>";
$ret .= "<br /><div><img src=\"".$xml->image->url."\" alt=\"".$xml->image->title."\" /></div>";
$ret .= "<div>最高気温".$xml->temperature->max->celsius."度</div>";
$ret .= "<div>最低気温".$xml->temperature->min->celsius."度</div>";
$ret .= "<br />";
$ret .= "</div>";
return $ret;
}
//リクエストパラメータ設定
$city = $_POST['id']; //場所を設定
$day = "today"; //今日の天気
$day2 = "tomorrow";
$day3 = "dayaftertomorrow";

//ライブドアの天気予報を表示する関数をコールする
list($ret, $lwwsarea1, $lwwstitle1) = lwws($city,$day);
$ret2 = lwws2($city,$day2);
$ret3 = lwws2($city,$day3);
//キャッシュの残り時間を生成
$now=time() +(60 * 24);
$asu=time() +(60 * 60 * 24);
$y=date("Y", $asu);
$m=date("m", $asu);
$d=date("d", $asu);
$asu_byou= mktime(0, 0, 0, $m, $d, $y);
$sa= $asu_byou - $now;
}
$smarty-> assign ('lwws1' , $ret);
$smarty-> assign ('lwws2' , $ret2);
$smarty-> assign ('lwws3' , $ret3);
$smarty-> assign ('lwwsarea', $lwwsarea1);
$smarty->assign('city', $city);

$cache_id = $city;
//あすの0:00までの秒数をセットする
$smarty->cache_lifetime = $sa;
if ($smarty->is_cached("weather.tpl", $cache_id)){
$smarty->display("weather.tpl", $cache_id);
exit();
}
$smarty->display("weather.tpl", $cache_id);

A 回答 (2件)

同じ現象か分かりませんが、


smarty の テンプレート内で BOM 付きファイルを複数 include した場合に、余分な行が(正確には違うと思います)入る現象が起こりました。

恐らく、BOM が複数重なって、それが予期しない文字として認識されてしまったのだと思います。

私の場合は、BOM をひとつのファイルだけに付けて出力したら直りました。(見る人が見れば、まったくの凡ミスです)include するファイルには BOM を付けないようにすると良いかと思います。

BOM 無しファイルを扱っているということなので、違うかもしれませんが、参考までに。
    • good
    • 0

質問の内容がよくわからないので、有識者の解答を待つことにして、私からは少しだけアドバイスを。



$ret = '<div class="lwws">';
$ret .= '<div>'.'<span style="color:#ff0000;"></span>'.$lwwsarea.'の天気</div>';
$ret .= '<div style="background-color:#fce6f3">'.$lwwstitle."</div>";
$ret .= "<br /><div><img src=\"".$lwwsimage."\" alt=\"".$lwwsalt."\" /></div>";
$ret .= "<div>最高気温".$lwwsmax."度</div>";
$ret .= "<div>最低気温".$lwwsmin."度</div>";
$ret .= "<div>".$lwwsdescription."</div>";
$ret .= "</div>";

上記がすごく気持ち悪いです。可読性も低いので、ヒアドキュメントを使ってみてはいかがでしょうか?
----
$ret = <<< EOF
<div class="lwws">
<div><span style="color:#ff0000;"></span>{$lwwsarea}の天気</div>
<div style="background-color:#fce6f3">{$lwwstitle}</div>
<br />
<div><img src="{$lwwsimage}" alt="{$lwwsalt}" /></div>
<div>最高気温{$lwwsmax}度</div>
<div>最低気温{$lwwsmin}度</div>
<div>{$lwwsdescription}</div>
</div>
EOF;
----
    • good
    • 0
この回答へのお礼

大変勉強になりました。ありがとうございます。

お礼日時:2009/05/28 20:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!