0

写真を保存してデータベースから取得しようとしていますが、問題が発生しています。他の投稿を調べましたが、解決策が見つかりませんでした。写真はデータベースにアップロードされていますが、元に戻すことができないようです。また、URL では $id=0 ですが、$id を対応するデータベース番号と等しくなるように変更しても、空白のページがロードされるだけです...これは多くのコードであることを知っているので、応答は非常に大きくなります感謝!!

CHOOSE_PHOTO.PHP

<form enctype="multipart/form-data" action="process_photo.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="100000" />
Choose a file to upload: <input name="image" type="file" /><br />
<input type="submit" value="Upload File" />
</form>

PROCESS_PHOTO.PHP

 MY_LOGIN_INFO_AND_DATABASE_CONNECTION

if ($_FILES) {
  $image_types = array 
    ("image/bmp",
    "image/jpeg",
    "image/pjpeg",
    "image/gif",
    "image/x-png"); 
 if (is_uploaded_file ($_FILES["image"]["tmp_name"])) {
   $image  = addslashes (fread 
      (fopen ($_FILES["image"]["tmp_name"], "r"), 
      filesize ($_FILES["image"]["tmp_name"])));
$file_name = $_FILES["image"]["name"];
$file_size = $_FILES["image"]["size"];
$file_type = $_FILES["image"]["type"];
if (in_array (strtolower ($file_type), $image_types)) {
  $sql = "INSERT INTO image_table "
     . "(image_type, image, image_size, image_name, image_date) ";
  sql.= "VALUES (";

  $sql.= "'{$file_type}', '{$image}', '{$file_size}', "
     . "'{$file_name}', NOW())";
  @mysql_query ($sql, $conn);

exit();
  }
 } 
} 


$id = mysql_insert_id($conn);

mysql_close($conn);

header("Location: photo_preview.php?id=$id");

PHOTO_PREVIEW.PHP

 MY_LOGIN_INFO_AND_DATABASE_CONNECTION

$result = mysql_query("SELECT * FROM image_table WHERE image_id=  " 
. mysql_real_escape_string($_GET["id"]), $conn);

if(!$result) die(mysql_error());

$row = mysql_fetch_assoc ($result);


  if (mysql_num_rows($result) > 0)
   {
    $row = @mysql_fetch_assoc ($result);
    $image_type = $row["image_type"];
    $image = $row["image"];
    Header ("Content-type: $image_type");
    print $image;
   } 
?>
4

1 に答える 1

0

基本的に、すべてがうまくいくと仮定しますが、うまくいきません。反対のアプローチを取り、すべてが失敗すると想定してください。書き終えたら、次のプロジェクトのためにコピーして貼り付けます。次に、予期しないことが起こったときに、何が起こったかを正確に伝えるコードがそこにあります。

いくつかの問題:

  1. データベースへのエントリを正しく「エスケープ」しません。「add_slashes」で動作させることもできますが、すべてのスティング入力を安全にするために mysql_real_escape_string() を使用する必要があります。PDOさらに良いのは、関数が減価償却されるため、またはmysqli_()関数で準備済みステートメントを使用mysql_()することです。準備済みステートメントを使用すると、文字列が自動的にエスケープされ、安全になります。

  2. SQLインセット「@mysql_query()」ですべてのエラーを非表示にし、それが機能したかどうかを確認しません。あなたが欲しいif (!mysql_query()) {' then show errors (use 'mysql_error())。これはおそらくあなたが間違っているところです - 入力が失敗していて、その理由をチェックしていません.

  3. また、「fread」や「fopen」などの動作もチェックしません。エラーが発生する可能性があります。'file_get_contents()' を使用して戻り値を確認してください。false を返す場合は失敗です - エラーを表示して理由を調べます。

  4. ファイルが正しくアップロードされたことを実際に確認することはありません。$_FILES["image"]["error"] で 0 より大きい値を確認してください。

  5. 行が見つかったと仮定しSELECTますが、そうでない場合 (たとえば、誰かが危険な ID を与えた場合)、$row は false になります (他のエラーが発生します)。したがって、続行する前に $row が配列であり、false でないことを確認してください。

  6. 画像の種類が一致しない場合 ( in_array)、エラー メッセージは表示されません。続けて、存在しない ID を使用し、失敗する運命にあるページにリダイレクトします (ポイント 5 を参照)。

  7. 実際には、リダイレクトの前に「出口」があります。それは期待されていますか?あなたは基本的に「有効な有効なファイルがある場合は停止しますが、有効なファイルがない場合は存在しないファイルにリダイレクトします...

だから - 修正することがたくさん。エラーを隠してはいけませんが、エラーが発生した場合はフィードバックを提供してください。

于 2012-09-23T07:11:09.373 に答える