Smartyを利用したファイルアップロードについて

このQ&Aのポイント
  • PHPとSmartyを使って、データベースにファイルをアップロードするプログラムを作成しましたが、エラーが発生します。
  • ファイルの情報はデータベースに格納されますが、アップロードしたファイルデータは格納されません。
  • 解決策をお教えください。
回答を見る
  • ベストアンサー

Smartyを利用したファイルアップロードについて

PHPとSmartyを使って、データベースにファイルをアップロードするプログラムを作ったのですが、実行すると Warning: fread(): supplied argument is not a valid stream resource in line 147 Warning: fclose(): supplied argument is not a valid stream resource in line 148 というエラーが表示されます。 データ以外の情報はデータベースに格納されるのですが、アップロードしたファイルデータは格納されません。 何故なのか分からないので、教えていただければ幸いです。 ちなみに作成環境は以下のとおりです。 Apache/2.0.59 (Win32) PHP/5.2.3 MySQL クライアントのバージョン: 5.0.37 //*Smartyのプログラムソース*// function screen_submit_report($param) { global $smarty; if (!get_report($param)) { exit(); } $re_name = $_POST["re_name"]; $seito_id = $_POST["SEITO_ID"]; $ka_id = $_POST["KA_ID"]; $fp = fopen($_FILES["uploadfile"]["tmp_name"], "rb"); $filedat = fread($fp, filesize($_FILES["uploadfile"]["tmp_name"])); fclose($fp); //147行目 $filedat = addslashes($filedat); //148行目 $conn = db_conn(); $sql = "INSERT INTO report (seito_id, re_name, data, ka_id) values ('$seito_id', '$re_name', '$filedat', '$ka_id')"; $res = db_query($sql, $conn) or die("データ抽出エラー".mysql_error()); if ($res) { $page["message_header"] = "追加が完了しました。"; } else { $page["message_header"] = "追加が失敗しました。" . mysql_error(); } $page["name"] = "アップロード完了"; $page["act"] = ""; $page["button_value"] = ""; $smarty->assign("page", $page); $smarty->assign("message", $message); // テンプレートを表示 $smarty->display("submit_report.tpl"); } //*関係するデータベース*// mysql> describe report; +--------+------------+----+---+-------+--------------+ |Field |Type |Null|Key|Default|Extra | +--------+------------+----+---+-------+--------------+ |re_no |smallint(6) |NO |PRI|NULL |auto_increment| |seito_id|mediumint(9)|YES | |NULL | | |re_name |varchar(200)|YES | |NULL | | |data |blob |YES | |NULL | | |ka_id |smallint(6) |YES | |NULL | | +--------+------------+----+---+-------+--------------+

  • eves
  • お礼率20% (1/5)
  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.1

fread() と fclose() が問題ということは fopen() が失敗しているのだと。 $_FILES を確認してみてください。 enctype="multipart/form-data" が抜けているとか?

eves
質問者

お礼

回答ありがとうございます! ずっとインターネットに接続できず、お礼が遅くなってしまってすみません。 ご指摘通り、multipartの問題でした。 PHPにとらわれて、フォームをちゃんと確認していませんでした。 この記述を加えることで、無事にアップロードできました。 ありがとうございました。

関連するQ&A

  • ファイルのダウンロードプログラム

    PHPとSmartyを使ってアップロードしたwordファイルを、ダウンロードするプログラムを作成していますが、ファイル開く際に 「ファイルを開こうとして、エラーが発生しました。」 というダイアログが表示されます。 テキストで開くと、内容が文字化けしていますが、確認できるので、 エンコードの問題だと考え、エンコードの文を追記すると、ファイルは開けるのですが、 「A」 としか表示されません。 お答えいただければ幸いです。 以下はダウンロードプログラムです。 if ($_GET["no"]!="") { $re_no = $_GET['no']; $sql = "SELECT data FROM report WHERE re_no=$re_no"; $result = mysql_query($sql); if (!$result) { print("SQLの実行に失敗しました<BR>"); print(mysql_errno().": ".mysql_error()."<BR>"); exit; } $row = mysql_fetch_array($result); $row = mb_convert_encoding($row, "UTF-8", "UTF-8"); mysql_close($con); mb_http_output("pass"); header("Content-type: application/msword"); header("Content-Disposition: inline; filename=report.doc"); echo $row[0]; } ダウンロード用のリンクは <a href="repo.php?no={$row2.re_no}">DL</a> と表記しています。 ちなみに作成環境は以下のとおりです。 Apache/2.0.59 (Win32) PHP/5.2.3 MySQL クライアントのバージョン: 5.0.37 //*関係するデータベース*// mysql> describe report; +--------+------------+----+---+-------+---------------+ |Field |Type |Null|Key|Default|Extra | +--------+------------+----+---+-------+---------------+ |re_no |smallint(6) |NO |PRI|NULL |auto_increment | |seito_id|mediumint(9)|YES | |NULL | | |re_name |varchar(200)|YES | |NULL |utf8_general_ci| |data |blob |YES | |NULL | | |ka_id |smallint(6) |YES | |NULL | | +--------+------------+----+---+-------+---------------+

    • 締切済み
    • PHP
  • SQL及びSMARTYの利用

    お世話になります SMARTYとmySQLを利用してサイトを構築しています。 下記の様なSQLデータからデータを一行ずつ生成したいです。 名前だけは取り出すことが出来たのですが、年齢の取り出し方が判りません。 アドバイスをお願い致します SQL------------------------------------------------------------------- ---------------------------- | id | namae | age | ---------------------------- | 1 | 田中 | 22 | ---------------------------- | 2 | 佐藤 | 29 | ---------------------------- PHP------------------------------------------------------------------- //空の配列を用意 $name = array(); //SMARTY用の代入変数を生成 while($data = $res -> fetchRow()){ array_push($name,mb_convert_encoding($data['namae'],"SJIS","UTF-8")); } $smarty->assign("namae",$name); HTML------------------------------------------------------------------ {foreach from=$namae item=namae} {$namae}{$age}<br> {/foreach} ----------------------------------------------------------------------

    • ベストアンサー
    • PHP
  • PHPとSmartyの関連について

    PHPとSmartyの関連について PHPからSmartyに出力しているのですが中身がNULLになります。 データベースアクセスにはPDOを使用しています。 PHPソース DBアクセス $SQL = "select ITEM_ID from ITEM_TBL limit 0, 3"; $STMT = $GLOBALS["PDO"] -> query($SQL); $ROW = $STMT -> fetchAll(PDO::FETCH_ASSOC); Smartyでアサイン $smarty -> assign("ITEM_LIST", $ROW); Smartyソース <table> {{foreach from=$ITEM_LIST item=LIST}} <tr> <td>{{$LIST.ITEM_ID}}</td> </tr> {{/foreach}} </table> のような感じでページ出力したいのですが、表示をすると中身がNULLでした。 PHP側で var_dump($ROW); を行うと array(3) { [0]=> array(1) { ["ITEM_ID"]=> string(1) "1" } [1]=> array(1) { ["ITEM_ID"]=> string(1) "2" } [2]=> array(1) { ["ITEM_ID"]=> string(1) "3" } } 中身が配列で格納されています。 smarty側で {$ITEM_LIST|@var_dump} を行うと array(3) { [0]=> NULL [1]=> NULL [2]=> NULL } でした。 いろいろとやってみたのですが、わからなくなってしまったので どなたかご教授いただけませんでしょうか。よろしくお願いします。

    • 締切済み
    • PHP
  • Smarty3のリソース・プラグイン

    Smarty3のリソース・プラグインについて Smarty3(3.0.9)でリソース・プラグインを行うと以下エラーが出力され、データベース内のテンプレートを呼び出すことができません。 Uncaught exception 'SmartyException' with message 'Unable to load template db 'test.tpl'' in /usr/local/lib/php/smarty/sysplugins/smarty_internal_template.php:165 Stack trace: #0 /usr/local/lib/php/smarty/sysplugins/smarty_internal_template.php(554): Smarty_Internal_Template->isExisting(true) #1 /usr/local/lib/php/smarty/Smarty.class.php(340): Smarty_Internal_Template->getRenderedTemplate() #2 /usr/local/lib/php/smarty/Smarty.class.php(384): Smarty->fetch('test.tpl', NULL, NULL, NULL, true) #3 /usr/local/apache2/htdocs/test.php(18): Smarty->display('test.tpl') #4 {main} thrown in /usr/local/lib/php/smarty/sysplugins/smarty_internal_template.php on line 165 同様のプログラムでSmarty2*で実行するとうまく表示します。 Smarty3のマニュアル(英語版)を見てもうまくいきません。。 ご存知の方、ぜひ教えてください。 (環境) OS:Debian 6.0.1 WebServer:Apache2.2.19 PHP:PHP5.3.6 MySQL:MySQL5.0.87 (プラグイン) <?php require('DB.php'); define("DB_FILE","mysqli://*****:*****@localhost/*****"); function smarty_resource_db_source ($name, &$source, $o_smarty) { $db = DB::connect(DB_FILE); $stt = $db->prepare("SELECT source FROM templates WHERE name =?"); $rs = $db->execute($stt,array($name)); if(is_null($row=$rs->fetchRow(DB_FETCHMODE_ASSOC))){ return FALSE; }else{ $source=$row["source"]; return TRUE; } } function smarty_resource_db_timestamp($name, &$modified, $o_smarty) { $db = DB::connect(DB_FILE); $stt = $db->prepare("SELECT * FROM templates WHERE name =?"); $rs = $db->execute($stt,array($name)); if(is_null($row=$rs->fetchRow(DB_FETCHMODE_ASSOC))){ return FALSE; }else{ $modified=$row["modified"]; return TRUE; } } function smarty_resource_db_secure($name, $o_smarty) { // 全てのテンプレートがセキュアであると仮定します return true; } function smarty_resource_db_trusted($name, $o_smarty) { // テンプレートから使用しません } ?> (呼び出しファイル) <?php set_include_path('/usr/local/lib/php/smarty/:' . get_include_path()); @include('Smarty.class.php'); $o_smarty = new Smarty(); // Smartyのテンプレートのキャッシュファイル格納先を指定 $o_smarty->compile_dir = "/usr/local/apache2/htdocs/template_c"; $o_smarty->plugins_dir[]="/usr/local/apache2/htdocs/plugin"; $o_smarty->default_resource_type="db"; // phpスクリプトからテンプレートリソースを使用します $o_smarty->display("test.tpl"); ?> (データベース) CREATE TABLE templates ( name VARCHAR(100) NOT NULL default '', modified TIMESTAMP, source TEXT, PRIMARY KEY (name) ) DEFAULT CHARACTER SET utf8; -- Dumping data for table 'templates' INSERT INTO templates VALUES('test.tpl', "2010-12-25 22:00:00", '{$x="hello world"}{$x}');

    • 締切済み
    • PHP
  • Smartyへの2次元配列引渡しについて

    PHP+Smartyで現在開発をしておりますが MySQLからデータを取得し、それをSmartyに引き渡すと中身がNULLになってしまう現象が発生しています。 これがすべてにおいて発生しているのであれば納得いくのですが ある環境では発生して、またある環境では問題なく処理できるのです。 対処法を探してみましたが、どうしても対処できないので ご教授いただけたらと思います。 サーバから抽出した内容をPHP側でvar_dumpしたものです。 array(3) { [0]=> array(1) { ["ITEM_ID"]=> string(1) "1" } [1]=> array(1) { ["ITEM_ID"]=> string(1) "2" } [2]=> array(1) { ["ITEM_ID"]=> string(1) "3" } } これを $smarty -> assign("LIST", $ROW); でsmartyに出力しました。 Smarty側では以下の内容を実行しました。 {{$LIST|@var_dump}} 結果 array(3) { [0]=> NULL [1]=> NULL [2]=> NULL } でした。 問題ない環境だと array(3) { [0]=> array(1) { ["ITEM_ID"]=> string(1) "1" } [1]=> array(1) { ["ITEM_ID"]=> string(1) "2" } [2]=> array(1) { ["ITEM_ID"]=> string(1) "3" } } ときちんと値を引き継いでいます。 下記は上記の内容を実行した環境です。 動作しなかった環境 ローカル(XAMPP使用) PHP Version 5.2.9 Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9 サーバ: localhost via TCP/IP サーバのバージョン: 5.1.33-community MySQL クライアントのバージョン: 5.0.51a 動作した環境 レンタルサーバー PHP Version 5.2.9 Apache/2.2.11 (Unix) mod_ssl/2.2.11 OpenSSL/0.9.8i DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 サーバ: Localhost via UNIX socket サーバのバージョン: 5.0.75-community-log MySQL クライアントのバージョン: 5.0.75 サーバー環境によって処理される内容もかわってくるのでしょうか・・・。

    • ベストアンサー
    • PHP
  • データベースへの接続

    以前の質問の、PHP+MySQLの「データを検索して表示する」についての続きなのですが、データを検索すると、 DB Error: not found という画面が出ました。これは構文はあってるけどDBが見つからないって事なんですか? データベースは「速効!図解プログラミングPHP+MySQL」を見ながら、下記のように作りました。 mysql> show fields from member; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | mediumint(9) | NO | PRI | NULL | auto_increment | | last_name | varchar(50) | YES | | NULL | | | first_name | varchar(50) | YES | | NULL | | | age | tinyint(3) unsigned | YES | | NULL | | +------------+---------------------+------+-----+---------+----------------+ 4 rows in set (0.01 sec) MYSQLをインストールした後で、XAMPPをダウンロードしたのですが、それが原因なんでしょうか? 解決策を教えてください。 質問ばかりしていますが、よろしくお願いします。

    • ベストアンサー
    • PHP
  • 何故、mysql_insert_id が not a valid になるのでしょうか?  

    MySQLバージョン サーバ5.0.45、 クライアント 3.23.49 Apache2.0.61 (Win32) PHP4.4.7 の環境下で、 名称 member, id int(10) unsigned not null auto_increment、 name, varchar(20) not null, mail varchar(30) not null のテーブルを作りました。          次のスクリプトを書いて <?php session_start(); $name = $_POST["name"]; $mail = $_POST["mail"]; print_r($_POST); $conn = mysql_pconnect("localhost", "ABC", "XYZ") or die("Can't connect"); mysql_select_db("SIMEI", $conn) or die("db error") ; $query = "INSERT INTO member (name, mail) VALUES ('$name','$mail')"; $result = mysql_query($query, $conn); //$oid = 'mysql_insert_id($result)'; //''で括ってみる $oid = mysql_insert_id($result); // ← 11行 $result = mysql_query( "SELECT id FROM member WHERE oid = $oid", $conn); if($result){ print("insert OK");}  echo "Can't insert "; $_SESSION['id'] = mysql_result($result, 0); // ← 14行 mysql_close($conn); ?> これを実行すると、 データはmysql DB に登録されますが、下記のエラーが出て、id を取得できません。 何故でしょうか? どうすれば不具合を解決することができるでしょうか? Warning: mysql_insert_id(): supplied argument is not a valid MySQL-Link resource in C:\・・・・\insert.php on line 11 Warning: mysql_result(): supplied argument is not a valid MySQL result resource in C:\・・・・・\insert.php on line 14

    • ベストアンサー
    • MySQL
  • Smarty 三次元配列を使いたい

    最近Smartyを使い始めた者です。 以下のような多次元配列を、$smarty->assign('data', $data); します。 $data = array( [0] => array( [id] => 23 [comment] => 'aaa' [name] = array( [0] => 'xxx' [1] => 'yyy' )) [1] => array( [id] => 24 [comment] => 'bbb' [name] = array( [0] => 'zzz' )) [2] => array( [id] => 25 [comment] => 'ccc' [name] = array( [0] => 'ttt' [1] => 'uuu' )) ) そして、以下のようなテーブルを表示させたいのです。 |-------------------| | 23  | aaaa | xxxx | |    |     |------| |    |     | yyyy | |-------------------| | 24  | bbbb | zzzz | |-------------------| | 25  | cccc | tttt | |    |     |------| |    |     | uuuu | |-------------------| <td>タグのrowspan属性を使おうと思っています。 {foreach}をつかって、以下のようなものを書きましたが、駄目でした。 {foreach from=$data item=value01 name=kiji} <tr> <td rowspan="{$value01.numgoods}">{$value01.id}</td> <td rowspan="{$value01.numgoods}">{$value01.comment}</td> {foreach from=$value01 item=value02 name=goods} {if $smarty.foreach.goods.first} <td>{$value02.name.0]</td></tr> {else} <tr> <td>{$value.name.1}</td> </tr> {/if} {/foreach} {/foreach} エラー表示は、 syntax error: unrecognized tag: $value02.name.0 です 本当は、$value02.name の.0を三次元での要素数分だけ自動でループしてほしいのですが、その書き方がわかりません。 ネットをあさっても、これと言うサイトを見つけれません。 そもそも、三次元目の要素を取得するsmartyの方法がわかりません。 どなたかご教授の程、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPとMYSQL、DBのデータが空の表現は0が良

    こんばんは。 MYSQLではint型、varchar型、text型、smallint型、tinity型、float型で データが無いことを表すのはnullでも構わないですよね。 そのときPHPでMYSQLからデータを受け取ってデータが空かどうかを区別するには、 if(!a==null){}のようにnullを使うことになります。 PHPでnullを扱うのはトラブルの元になると参考書に書いてありました。 そういうときは、MYSQLでnullじゃなくて0が一番無難でしょうか。 また、0よりも半角文字や「データ無」のようにするべきですか。

    • 締切済み
    • PHP
  • PHP PEARのPagerをSmartyで使う

    初めまして、PEARのPagerを勉強していたのですが、Smartyで実装したいと思い試行錯誤していたらうまく表示されなくて困っています。 【PHP】 //PEARの読み込み、Smartyクラスの読み込み、MySQLクラスの読み込みは省略 //上記は正常に動作しています。 // テーブルの行数を数えます $sql = "SELECT COUNT(*) AS cnt FROM table_name;"; //レコード開始位置指定 $start = 0; //最大レコード数を指定 $limit = 10; // データを取り出すSQLを実行します。 $sql = "select * from table_name ORDER BY no DESC LIMIT $start, $limit"; $result = mysql_query($sql); while($rows = mysql_fetch_array($result)){ $res_data[]=array("title"=>$row['title'],"name"=>$row["name"],"no"=>$row["no"]); } //Pagerのパラメータを指定 $params = array( "itemData" => $res_data, "totalItems" => $limit, "perPage" => 6, "delta" =>5, "mode" =>"Jumping" ); //パラメータの連想配列を受け取る $pager =& Pager::factory($params); // ページデータの割り当て処理 foreach($pager->getPageData() as $item){ $res_data_page[] = $item; } //戻る/次/最初/最後のリンクとページリンクを返す $link = $pager -> getLinks(); //現在のページ番号を返す $currentPageID = $pager -> getCurrentPageID(); // テンプレート用に変数を設定 $smarty->assign('data', $res_data_page); $smarty->assign('pageNavi', $link['all']); $smarty->assign('currentPage', $currentPageID); ■tpl <table border="1"> <tr> <th>名前</th> <th>NO</th> <th>タイトル</th> </tr> {foreach from=$data item=i} <tr> <td>{$i.name}</td> <td>{$i.no}</td> <td>{$i.title}</td> </tr> {/foreach} </table> <p>{$pageNavi}</p> <p>{$currentPage}ページを表示</p> 参考URL http://meerweb.blog7.fc2.com/blog-entry-101.html データベースへの接続は出来ていて、ページャー機能は動いています。 取得しているデータ数もあっているのですが、全部1行目のデータだけ表示されます。 どなたか原因が分かる方いらっしゃいましたら、是非ともご教授ください。 よろしくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう