ホームページ >バックエンド開発 >PHPチュートリアル >ファイルをアップロードしてデータベースに保存する小さなプログラムをデバッグしています。ここで専門家にアドバイスを求めてください。

ファイルをアップロードしてデータベースに保存する小さなプログラムをデバッグしています。ここで専門家にアドバイスを求めてください。

WBOY
WBOYオリジナル
2016-06-23 14:01:161083ブラウズ

実際、この関数は非常に簡単なはずですが、インターネットでプログラムを見て自分でデバッグしましたが、予期しないエラーが発生しました。

HTML フロントエンド コード:

<html><body><form action="upload.php" method="post" enctype="multipart/form-data"><label for="file">Filename:</label><input type="file" name="file" id="file" /> <br /><input type="submit" name="submit" value="Submit" /></form></body></html>


PHP バックエンド コード:
<?php if ($_FILES ['file'] != "none" && $_FILES ['file'] != "") {	$time_limit = 60;	set_time_limit ( $time_limit );		$file_type = $_FILES ['file'] ['type'];	$file_name = $_FILES ['file'] ['name'];	$file_size = $_FILES ['file'] ['size'];	$fp = fopen ( $_FILES ['file'] ['tmp_name'], "rb" );		if (! $fp)	{		die ( "file open error" );	}		$file_data = file_get_contents($_FILES["file"]['tmp_name']);	//$file_data = fread($fp, $file_size ) ;	fclose ( $fp );	 $conn = mysqli_connect ( "localhost", "root", "root" );    if (! $conn)    {		die ( "error : mysql connect failed" );    }    mysqli_select_db($conn,"onlytest" );    $sql = "insert into onlytest.file (contents,type,name,size) values ('$file_data','$file_type','$file_name','$file_size')";    $result = mysqli_query ($conn, $sql);    //$id = mysqli_insert_id ($conn);    //echo $id;    mysqli_close ( $conn );    set_time_limit ( 30 );     if ($result)    	echo "succeed to upload the files ";    else    	echo "failed!";   } else {	echo "You haven't uploaded any files!";}?>


データベースはonlytest、テーブル名はfile、いくつかのキーワードはid、contents、type、name、sizeです。設定は次のとおりです。次のように:


ディスカッションに返信 (解決策)

エラー メッセージは何ですか?

$file_data が LONGBLOB 型フィールドに格納されるのはなぜですか?

エラーメッセージはありませんが、データベースを確認したところ、常に「失敗」が返され、データがデータベースに保存されていませんでした。

テストに大きなドキュメントやファイルを使用する可能性があることを考慮して、longblob タイプを使用しました。

状況は、小さなgif画像をアップロードするのは問題ありませんが、jpgやwordなどの大きなファイルで保存することはできません。

設定でアップロードできる最大サイズはどれくらいですか?

はい、これが問題である可能性があります。この変数を見つけた場合、どうすれば変更できますか。それ?


あなたの設定で許可されている最大アップロードサイズは何ですか?

print_r($_FILES); さらに、 echo mysqli_error($conn); にはエラーがありますか?私はphpでupload_max_filesize = 2M、max_file_uploads = 20
を見つけましたが、これは正しいようです。

設定で許可されている最大アップロード サイズはどれくらいですか?

74K の写真をアップロードしましたが、データベースに保存されず、「失敗」が返されました。 php.iniでアップロードファイルの最大制限を設定する場合、それは2Mです。
何が起こったのですか?

あなたの提案に従って、 print_r($_FILES);echo mysqli_error($conn); を追加しました
結果は次のようになります:


他にエラー メッセージはありません (ブラウザのエラー メッセージ表示は正常です)。何が起きてる?
print_r($_FILES); 大きなファイルを転送するときに値はありますか?
また、出力される SQL ステートメントは何ですか?

echo mysqli_error($conn); この文を mysqli_quey() の下に追加します。

エラーメッセージの印刷コマンドの位置を変更して最後に置きました。コマンドは次のとおりです: h echo "& lt; br/& gt;";

echo "& lt; br/& gt;";

echo mysqli_error ($ const); echo" & lt; br/& gt; "" "" C :WindowsTempphpA968.tmp [error] => 0 [size] => 76201 ) )

SQL 構文にエラーがあります。対応するマニュアルを確認してください。 MySQL サーバーのバージョンに合わせて、1 行目の ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROÿÛ' 付近で使用する正しい構文を確認してください

また、大きなファイル echo $sql をアップロードしました非常に長いコンテンツが表示されました。ここではもう表示されません。


insert intoonlytest.file (contents,type,name,size) value ('$file_data','$file_type','$file_name',$file_size) のようです
この文は間違っていますか?
どのような SQL ステートメントを出力できますか?

print_r($_FILES); 大きなファイルを転送するときに何か値はありますか?
さらに、エラーはありますか?

すべてのコマンドを出力して、マスターの指導。
echo "
";
print_r($_FILES);
echo mysqli_error($conn);
echo $sql;
mysqli_close ($conn);

エラー メッセージ:


フィルターします。 mysql_escape_string 関数を $file_data に追加します

言うまでもなく、このトリックは本当にうまくいき、本当に成功しました。 mysql_escape_string のみを使用でき、mysql_real_escape_string() も使用できません。

別のプログラムを作成し、データベースから正常にダウンロードしました。

しかし、なぜこのようなことが起こったのでしょうか?マスターはそれを説明できますか?

フィルタリングします。 $file_data に mysql_escape_string 関数を追加します

情報を調べたところ、理由が分かりました。ありがとうございます。

ノットステッカー。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。