電子書籍の厳選無料作品が豊富!

現在、DBに画像を登録するプログラムを作成しているのですが、登録できません。ファイルの大きさが問題なのかと思い、小さい画像(1.5M)でためしてみましたが、やはりできませんでした。

DBのフィールド名なども正しいことを確認しています。
原因、対策がわかる方がいらっしゃいましたら教えてください。

よろしくお願いします。

----------------------
<?php
if($_POST["submit"]=="upload")
{

// データベースに接続する処理。




mysql_select_db( $dbname );
mysql_set_charset("utf8");// 文字コードを指定します。

// ファイル情報を取得

$file = $_FILES["userfile"]["name"];// 元のファイル名
$type = $_FILES["userfile"]["type"];// MIME型
$tmpname = $_FILES["userfile"]["tmp_name"];// テンポラリファイル名
$size = $_FILES["userfile']['size"];//サイズ

// 画像サイズを取得
list($width, $height) = getimagesize($tmpname);
// 画像データを取得
$contents = file_get_contents($tmpname);
// エンコード
$contents = base64_encode($contents);
// SQL用にエスケープ
$contents = mysql_real_escape_string($contents,$conn);




// 格納
$strsql = "INSERT INTO DBpractice ("."size, imgtype, width, height, imgdata ".") values ( "."$size, '{$type}', $width, $height, '{$contents}'".");";


$res = mysql_query($strsql,$conn);

print mysql_error($conn);
echo "更新を完了しました。";

mysql_close($conn);

}
?>

<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>test</title>
<link href="common/css/base.css" rel="stylesheet" type="text/css" />

</head>
<body>



<form name="rfform" action="<?=$_SERVER['PHP_SELF'] ?>" enctype="multipart/form-data" method="post">
<input type="hidden" name="act" value="upload">
<input type="file" name="userfile">
<input type="submit" name="submit" value="アップロード">
</form>

</body>
</html>
---------------------------

A 回答 (9件)

><?=変数?>をつかうためには、php.iniの設定が必要であるということは知りませんでした。

どのような設定が必要なのでしょうか。
php.iniのshort_open_tagがonになっていることですが、action要素に$_SERVER['PHP_SELF'] の値が挿入されているようなので問題ないようですね。

>修正後、試しましたがやはり結果は同じです。
echo で$fileなどが表示されるようになっていませんか?

正直なところ、他にも全角スペースがないかを含め、ソースを最初から全部見直したほうがいいと思います。
その際は、php.iniの設定で、phpのエラーを画面で表示するようにしたほうがいいですね。
レンタルサーバーだと、 .htaccessが使えないと駄目ですけど。
一度、ローカルに環境を整えてそこで試してからサーバーに上げるようにしたほうがいいように思います。
    • good
    • 0
この回答へのお礼

あれからスペースを確認したり、色々と思考錯誤した結果なんとか登録することができました。昨日反映されていなかったデータが今日になってDBに反映されていたりと、正直どこが決定的なミスだったのか自分でもよくわからないのですが、解決できてよかったです。

有益なアドバイスを沢山いただきありがとうございました。

お礼日時:2012/02/14 22:37

> INSERT INTO DBpractice (size, imgtype, width, height, imgdata ) values ( , '', 41, 50, '/9j/4AAQSkZJRgABAQAAAQABAAD



ということは、sizeとimgtypeにまともな値が入っていないことからクエリーエラーがおきているのでしょう。

sizeについて:

> $size = $_FILES["userfile']['size"];//サイズ

囲み記号において"と'が混在しているので統一しましょう。
$size = $_FILES["userfile"]["size"];//サイズ

imgtypeについて:

> $type = $_FILES["userfile"]["type"];// MIME型

これに値が入らないのが不思議ですね。わかりません。
ただ、とりあえず私だったら以下のようにするかな。
1. アップロード前のファイルが本当に画像ファイルか
2. アップロード前のファイル名において画像らしい拡張子がついているか
3. プログラム処理において、例えば想定するMIMEがimage/gifとimage/jpegなら、
  $typeがそれらと等しいか確認してどれとも一致しなければ、エラーなどを表示し、
  クエリ(insert ...)には進まないようにする
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。無事、解決いたしました。
いただいたアドバイスは次回以降の参考にさせていただきます。

ありがとうございました。

お礼日時:2012/02/14 22:38

上記HTML部分をコピーして、$fileなどを表示させてみましたが問題ありませんでした。


初歩的なところではありますが、上記ソースでは$fileなどの変数と=の間が全角スペースになっていますが
実際は半角スペースですよね?
また、formタグのaction要素の部分を<?=変数?>としていますが、php.iniの設定はしてあるんですよね?
画面で、ソースの表示をした際のaction要素はどうなっているでしょうか?

この回答への補足

ご指摘箇所の半角スペースは気付いていませんでした。
修正後、試しましたがやはり結果は同じです。

<?=変数?>の部分は、ソース上では、以下のようになっています。この状態は正しいのでしょうか。

action="/XXXXX/upload.php

※XXXXはupload.phpが入っているフォルダ名

<?=変数?>をつかうためには、php.iniの設定が必要であるということは知りませんでした。どのような設定が必要なのでしょうか。
もし参考サイトなどがあれば教えてください。(現在、自分でも調査中ですが、よさそうなサイトを見つけることがまだできていません。)


ちなみに環境は、サクラインターネットを使用しています。

※プログラミング初心者のため、基本的事項がよくわかっておらずご迷惑をおかけし、申し訳ありません。よろしくお願いいたします。

補足日時:2012/02/13 18:09
    • good
    • 0

$_FILES["userfile"]["error"] の値はどうなっていますか?


1 ならばアップロードできるファイルサイズオーバーしています。
サイズが1MB以下のファイルで試してみてください。
アップロードできるファイルサイズを増やしたければphp.iniを修正してください。

この回答への補足

帰ってきた値は0でした。0 ということはファイルのアップロードは成功している ということを調べたのですが、やはりDBのテーブルには該当するデータは見当たりません。

何かもっと根本的なところで間違いをしているのでしょうか?

補足日時:2012/02/13 17:19
    • good
    • 0

$size = $_FILES["userfile']['size"];



とありますが
$size = $_FILES["userfile"]["size"];

ではないでしょうか。
SQL文も$sizeの部分がおかしいようですし。

ちなみに、
'/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBkZWZhdWx0IHF1YWxpdHkK/9sAQwAIBgYHBgUIBwcH・・・・・・・・・
というのは、ファイルの内容なので問題ないかと思います。

この回答への補足

情報が前後してしまい、申し訳ありません。
さきほど、ご指摘部分も修正後 echo $strsql;を実行したところ上記のエラーとなりました。


サイズの部分がおかしいということは、やはりファイルの容量の問題なのでしょうか??
何か他に原因がわかりますでしょうか??

補足日時:2012/02/13 16:08
    • good
    • 0

SQL文の構文が間違ってるというエラーのようですね。


$strsql を echo で表示するとどうなりますか?

この回答への補足

ありがとうございます。

echo をしたところ、以下のようなエラーが出ました。

width, height以外がうまく取得できていないように思えるのですが、取得部分が何かおかしいのでしょうか??

INSERT INTO DBpractice (size, imgtype, width, height, imgdata ) values ( , '', 41, 50, '/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBkZWZhdWx0IHF1YWxpdHkK/9sAQwAIBgYHBgUIBwcH・・・・・・・・・

補足日時:2012/02/13 15:45
    • good
    • 0

こんにちは。



if ( $_POST['submit'] == 'upload' ) {
}

この条件がtrueにならないと思いますがいかがでしょうか。
<input type="submit" name="submit" value="アップロード">
という指定であれば$_POST['submit']の中身は"アップロード"になるはずです。

if ( $_POST['submit'] == 'アップロード' ) {
}

にするか
if ( $_POST['act'] == 'upload' ) {
}

にしないとifの中は実行されないと思います。

なので、エラーメッセージも、画像の情報も表示されないんだと思います。

この回答への補足

ご回答 ありがとうございます。
おっしゃられる通り、valueとの整合性がおかしいですね。。

if ( $_POST['act'] == 'upload' ) {
}

に修正しましたところ、今度は以下のエラーがでました。

最後の方に'41''50'とあるのは、サイズのことをさしているのではないかと推測していますが、解決できずに困っています。解決策がおわかりであればご教授ください。 よろしくお願いいたします。



/var/tmp/phpkWq15A/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBkZWZhdWx0IHF1YWxpdHkK/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAMgApAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A8X05d91AvrKBX03arizhHpGv8q+aNGBbU7JfWdf5ive9e8VWnh2yjVl865ZAViBxgepPYVPUpbEfjaTy/Dd6en7lh+fFfPjNyx9q7bW/iBqOuafLaS2kKQzNs3pnIAIOOvtXFzwPASH6HgGqEyKQ/uPq1VqssoKAHoKZsWgRp6Ef+JzY56CZSfzFd14ftJvG+uXLynEbMXlc8lVPAUfQcVyHh+ylj8Q2Cyxnb5g57V6R8MNPcaRc30Usar553KUycKPXt1rKpLljdGtGPNKzNvVfhxo0ekxpCjRNGdysGySfUjvXlGrWKu9xEAN8WQQOzCvoSS1N7Krfa2i+X5olwA/HfPWvCviFatpfimaSDKpcqGwP7w4NZ0ZO9jbEU0lzJHEk4pMikk4kIYYJ5wabj2NdJyHWHUbeby/IZQ0a8sQR2rb8AeI006aXSpW2pdf6ts8CTpg/Xiti0+F2bC71KOeaG22u0Nve2xSY7c4zyMZ/lXm9xC6mS5UbFEgA29s5PH5Vk43umaqTjaSPpJXYWokkV4o1XLF8cn/CvHfiJOb3WUWKMsY0yFA7npn04qno/i7X7mQJPfvNBEuAJADg9j9frU0snmM0rNvcnLbuc0UqLUrsurXUlZHF3kF1Ko8+LDoPvHGSP61Q8lvQ/lXa3G0g8ZB9azvs0f8AdX8hXQ4nNc+lYXabTJhKxkG0jDnNfNuvxpFfTpGioodgAowOpoorlpm09iTRwBZEjuxq7k5PNFFdcdjFkM33B+NV6KKoR//ZYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' '', 41, 50, '/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2' at line 1

補足日時:2012/02/13 14:11
    • good
    • 0

> 現在、DBに画像を登録するプログラムを作成しているのですが、登録できません。



どうやって登録できないことがわかりましたか。
私の過去の失敗では、実は登録出来ていたけど取り出し方が間違っていたというのがありました。

> $file = $_FILES["userfile"]["name"];// 元のファイル名
> $type = $_FILES["userfile"]["type"];// MIME型
> $tmpname = $_FILES["userfile"]["tmp_name"];// テンポラリファイル名
> $size = $_FILES["userfile']['size"];//サイズ
> list($width, $height) = getimagesize($tmpname);
> $contents = file_get_contents($tmpname);
> $res = mysql_query($strsql,$conn);

これらの値が真または適切(そう)な値であるか、echoで確認してみましょう。

> print mysql_error($conn);

これでどんなメッセージが表示されましたか。それを公開しましょう。
もしエラーメッセージが無いのなら、繰り返しになりますが、登録は出来ているのかもしれません。

この回答への補足

登録できていないということは、実際のテーブルに何の値も入っていないことから確認しているのですが、何か間違っているでしょうか。

print mysql_error($conn);
では何のメッセージも表示されず、また以下を格納の前に行ってみましたが何の表示もされませんでした。(書き方や場所などが間違っているのでしょうか、、、)

echo $file;
echo $type;
echo $tmpname;
echo $size;
echo $contents;


ちなみに、ブラウザ画面上の動きとしては、アップロードボタンを押すと、「ファイルが選択されていません」という状態に戻ってしまう状況です。

補足日時:2012/02/13 12:55
    • good
    • 0

> DBのフィールド名なども正しいことを確認しています。



フィールドの型は どうなってますか?
1.5Mって大概デカいかと思いますが。

とりあえず、試しに longblob とかにしてみてはどうでしょう。

この回答への補足

ご回答ありがとうございます。
フィールド型はblob型でしたので、longblobで試してみましたがやはり無理でした。。
.gifや.jpgなど拡張子も変えてみたりしてみたのですが同じでした。

何か他に原因はありますでしょうか?

補足日時:2012/02/13 12:22
    • good
    • 0

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