みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

htmlとphpの分離

お世話になります。

ビジュアルをcssで調整するために、htmlとphpの分離したいんですが、どう分ければいいか教えていただけませんか?

ソースはこれです↓
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<link rel="stylesheet" type="text/css" href="base.css">
<title>ファイルのアップロードフォーム</title>
</head>
<body>
<form enctype="multipart/form-data" method="post">
<input type="file" name="myfile" size="30">
<input type="submit" value="アップロード">

<?php

//全てのエラー・警告を出力する
ini_set('error_reporting', E_ALL);

//アップするディレクトリ
$uploads_dir = '../../file_manager/uploads';

//データベースに接続
$con = mysql_connect('','','');
mysql_select_db("");

//セットされているかのチェック
if(isset($_FILES["myfile"])
and $_FILES["myfile"]["type"]=="application/pdf"
and $_FILES["myfile"]["error"] == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["myfile"]["tmp_name"];
$name = mysql_real_escape_string($_FILES["myfile"]["name"]);
$size = $_FILES["myfile"]["size"] / 1024;

//テーブルに格納
$sql ="insert into t_pdf_manage (name,size,upload_time,modify_time,flg) values('$name',$size,now(),now(),1)";
mysql_insert_id();
mysql_real_escape_string($sql);

$sql .=" on duplicate key update size=$size,modify_time=now(),flg=1";
$result=mysql_query($sql,$con);

//テーブルからidを抽出
$sql ="select id from t_pdf_manage where name='$name'";
$result=mysql_query($sql,$con);

//添字配列でidを取得
$row=mysql_fetch_row($result);

$up_name=$row[0];
//ファイル名をidにしてアップ
move_uploaded_file($tmp_name, "$uploads_dir/$up_name");

}


if(isset($_POST["del"])
and is_array($_POST["del"])) {
$sql ="update t_pdf_manage set flg=0 where id in(";
$flg=true;
foreach($_POST["del"] as $val) {
if($flg) {$flg=false;}
else {$sql.=",";}
$sql .="'".mysql_real_escape_string($val)."'";
}
$sql .=")";
$result=mysql_query($sql,$con);
}

$sql ="select id,name,size,upload_time,modify_time from t_pdf_manage where flg=1";
$result=mysql_query($sql,$con);

print "<table border=1>\n";
print "<tr>\n";
print "<th>名前</th>\n";
print "<th>サイズ(KB)</th>\n";
print "<th>アップロード</th>\n";
print "<th>更新</th>\n";
print "<th>表示</th>\n";
print "<th>削除</th>\n";
print "</tr>\n";
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
print "<tr>\n";
print "<td>".htmlspecialchars($row["name"])."</td>\n";
print "<td>".$row["size"]."</td>\n";
print "<td>".$row["upload_time"]."</td>\n";
print "<td>".$row["modify_time"]."</td>\n";
print "<td><a href=\"hyouji_test.php?id=" . $row["id"] . "\" target=\"new\"><img src=\"pdf.gif\"/></a></td>\n";
print "<td><input type=\"checkbox\" name=\"del[]\" value=\"".$row["id"]."\"></td>\n";
print "</tr>\n";
}
print "</table>\n";
mysql_close($con);
?>

<input type="submit" value="削除">
</form>
</body>
</html>

投稿日時 - 2012-04-26 10:57:37

QNo.7442089

すぐに回答ほしいです

質問者が選んだベストアンサー

>同じファイル内で分離できても、htmlとphpを別ファイルにはできないですか?
できますよ、と言うより別ファイルにする方が一般的です。
基本的には、2.のHTML表示の部分を別ファイルにして include "ファイル名"; とするだけです。/template/とかの専用ディレクトリにまとめておくとよいでしょう。

※尚「ビジュアルをcssで調整するために、htmlとphpの分離したい」は別問題です。「cssで調整する」のは単にCSS、あるいはHTML(文書構造)とCSS(見栄え)の分離になります。HTMLとPHPの分離は、処理(モデル)と表示(ビュー)の話になります。まだ混乱するかも知れませんが、うすっと頭の片隅に入れていてください。

投稿日時 - 2012-04-27 14:21:09

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

>php中のものにcssを設定することはできますか?

できますよ。普通にセレクタから指定してみてください。

多分何か勘違いしてる様に思うのですが、CSSはすべてのPHP側の処理、
つまりサーバー側の処理が終わったデータを、ブラウザが受け取ってレンダリングしています。
ブラウザは単純にHTMLとCSSを受け取って描画してるだけです。

その実行結果のページのソースをブラウザで確認できますよね?
そのHTMLに対してCSSがかかっていると考えてください。

投稿日時 - 2012-04-27 22:17:44

ANo.3

考え方を変えましょう。
今は「HTMLを表示しながら」必要に応じて データベースへ接続したり、削除したり、データを取得したりしていますよね。これを、順序を整理して

1.まずは処理だけを行う
・更新なのか削除なのか、何モードなのか判定
・送信内容がまともか確認(バリデート)
・データベースへの接続・更新・削除等の各処理、必要なデータの取得
ここでは何も出力せず、あくまでも「処理だけ」をします。
HTMLで必要なデータや、あるいはエラーメッセージ等は適宜変数へ入れておきます。

2.HTML表示
すべての処理が終わったら、ここで初めて <!DOCTYPE HTML PUBLIC ~ を開始します。
適宜HeaderやNaviなどの共通パーツを読み込んだり、エラーに応じた表示等々…。
必要なデータは変数に取得しているはずですから、ここではもうDBに接続したりしません。

また原則として、出力するHTMLでは、例えば<table border=1> などとはせず、<table id='Ichiran'>等としてidやclass名を振るだけです。見栄えに関することはすべてCSSの方に書くようにします。

※Ano2さんがお書きのように、HTML表示部分でも、たとえば一覧表示部分では
foreach($data as $res){
 echo <<<EOL
  <tr>
   <td class='dataName'>{$res['name']}</td>
   <td class='dataSize'>{$res['size']}</td>
   <td class='dataDate'>{$res['date']}</td>
  </tr>
EOL;
}
のようになり「表示に関する処理」は必要です。

投稿日時 - 2012-04-26 22:19:58

補足

JaneDue さん、ありがとうございます。

同じファイル内で分離できても、htmlとphpを別ファイルにはできないですか?

投稿日時 - 2012-04-27 11:56:03

ANo.2

実行結果で出力が決定するので、完全に切り離すとなると、予め実行結果のテーブルを変数に格納しておいて、html上に出力となると思いますが、もちろん実行環境でないとテーブルは生成されません。

これはMVCフレームワークやSmartyなどのテンプレートエンジンを使っても同じで、
やはりどこかでループ処理をして出力するものを生成しなければなりません。

つまり生成された結果に対してCSSで調整してやるか、予め生成内容を模したものを用意して、
CSSの調整を済ませておくというのが普通だと思います。

ひとつ気になるところがあるとすれば、ループの外にあるものに関してはわざわざprintを使わずに<?php?>の外に出してやった方がはるかに楽なのと、
一般にprintよりもechoの方が高速であるとされているのでそちらを使われたほうが良いでしょう。

投稿日時 - 2012-04-26 21:03:32

補足

emoemoemosan さん、ありがとうございます。

php中のものにcssを設定することはできますか?

例)
echo "<tr>\n";
echo "<td>".htmlspecialchars($row["name"])."</td>\n";
echo "<td>".$row["size"]."</td>\n";

この<tr>や<td>の部分です。

投稿日時 - 2012-04-27 11:05:36

ANo.1

単に画面とコードを分離したいだけなら、smarty とかのテンプレートエンジンみたいなライブラリを使い、
もっと深く、データ構造とかも分離なら、フレームワークを使うというところでしょう。

smarty
http://www.smarty.net/

一応日本語マニュアルもあるので使うのに困らないとは思います。

投稿日時 - 2012-04-26 11:38:00

お礼

athanasius さん、ありがとうございます。

調べてみます。

投稿日時 - 2012-04-27 11:19:35

あなたにオススメの質問