ホームページ >バックエンド開発 >PHPチュートリアル >ファイルをアップロードしてデータベースに保存する小さなプログラムをデバッグしています。ここで専門家にアドバイスを求めてください。
実際、この関数は非常に簡単なはずですが、インターネットでプログラムを見て自分でデバッグしましたが、予期しないエラーが発生しました。
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 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!";}?>
エラー メッセージは何ですか?
$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() の下に追加します。
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 関数を追加します
情報を調べたところ、理由が分かりました。ありがとうございます。
ノットステッカー。