mysql dp 에 그림 업로드하는 php 코드

ant01의 이미지

아래는 php로 작성한 mysql에 그림 업로드하는 test프로그램입니다.
그런데 image라는 변수를 포스트로 받는 데 if(!empty($image))의 분기를 타지 않아
몇 개의 코드를 삽입했습니다. 그런데 echo $image; echo $_POST[image]; 모두 값을 출력하지 않습니다.
어디를 손 봐야 할까요?

<?php
$connect=mysql_connect("localhost","php","test06") or die(mysql_error());
mysql_select_db("shop0") or die("데이타베이스를 선택할 수 없습니다.");
 
echo $image;
if(empty($image)) $image=$_POST[image];
echo $_POST[image];
 
if (!$_POST['uploaded']){ 
?> 
	<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"  
	ENCTYPE="multipart/form-data"> 
	Upload:<br><br> 
	<input type="file" name="image"><br><br> 
	<input type="hidden" name="uploaded" value="1"> 
	<input type="submit" value="Upload"> 
	</form> 
 
<?php 
}
else {
	$ip=$REMOTE_ADDR; 
 
	if (!empty($image)){ 
		echo "jkdjd";
		copy($image, "./temporary/".$ip.""); 
		$filename1 = "./temporary/".$REMOTE_ADDR; 
		$fp1 = fopen($filename1, "r"); 
		$contents1 = fread($fp1, filesize($filename1)); 
		fclose($fp1); 
		$encoded=$contents1;
		//$encoded = chunk_split(base64_encode($contents1));  
 
		$query="INSERT INTO test (code,picture)"."VALUES ('1','$encoded')";
		$result=mysql_query($query,$connect);
 
		unlink($filename1); 
	}
}
?> 
pogusm의 이미지

$_FILES 전역 변수를 이용하셔야 할듯합니다.

print_r($_FILES[image]);
해보세요

ant01의 이미지

알려주신대로 하니 이번에는 무조건 if(!empty($image))의 분기를 탑니다.
그리고 blob에 0byte가 저장됩니다.
이제는 어디를 손 봐야 할까요?

pogusm의 이미지

파일을 DB에 저장해본적이 없어서, 정확히는 모르겠지만..

print_r($FILES[image]) 을 해보면 아래와 같이 출력됩니다.

Array ( [name] => test.jpg [type] => image/jpeg [tmp_name] => /tmp/phpAB2iA9 [error] => 0 [size] => 92006 )

파일이름, 타입, 임시로저장된파일, 에러, size 의 정보를 갖고 있습니다.

    if ($_FILES[image][size]>0){  // 파일사이즈가 0 이상 일때만
        $fp = fopen($_FILES[image][tmp_name], "r"); // 실제 파일은 임시파일로 저장되어 있으므로, 그것을 읽어온다.
        $contents = fread($fp, $_FILES[image][size]);
        fclose($fp);
 
        echo $contents;  // 실제 데이터가 들어있는 변수. 테스트용도로 출력해봄
 
        // $contents 를 DB에 저장
        //$query="INSERT INTO test (code,picture)"."VALUES ('1','$encoded')";
        //$result=mysql_query($query,$connect);
 
    }

위의 코드를 참고로 해보면 답이 나오지 않을까요?

ant01의 이미지

알려주신대로 하니 그림 출력은 됩니다. 그런데 왜 저장은 안될까요? blob는 데이타 양만 클 뿐
다른 데이터 형처럼 쓰면 된다고 하는 것 같은데요?
지금도 계속 0byte 저장됩니다. 이유를 모르겠습니다.

송효진의 이미지

일단 결과만 나오는 답변 : mysql_escape_string()
권장하는 답변 : http://kr.php.net/manual/en/pdostatement.bindparam.php

ps. file_get_contents()

ant01의 이미지

http://antonio.pyy.kr/index.php?mid=computer&document_srl=3979

에 작동 확인 후 소스 올려 놓았습니다. php5로 된 소스는 찾기 힘들 더군요.

참고들 하세요. addslashes 를 하니 잘 저장 되더군요.

ant01의 이미지

하도 출력이 되질 않아서 db에 저장하기전의 데이터를 phpmyadmin에서 저장한 blob데이터와 비교해 보았습니다.
그런데 결과가 다르네요.
addslashes 단독으로, addslashes-mysql_escape_string ,mysql_escape_string-addslashes 모두 해 보았는데
결과는 모두 상이합니다.
이미 위에 글 보신 분들에게는 죄송하구요. 지금 왜 그런가 알아보는 중인데 누구 아시느 분이 좀 알려 주시면 감사하겠습니다.
아래는 비교 코드입니다.

<?php
$connect=mysql_connect("localhost","php","test06") or die(mysql_error());
mysql_select_db("shop0") or die("데이타베이스를 선택할 수 없습니다.");
mysql_query("set names utf8");
 
if(empty($image)){
	$image=$_FILES[image][tmp_name];
}
 
if (!$_POST['uploaded']){ 
?> 
	<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"  
	ENCTYPE="multipart/form-data"> 
	Upload:<br><br> 
	<input type="file" name="image"><br><br> 
	<input type="hidden" name="uploaded" value="1"> 
	<input type="submit" value="Upload"> 
	</form> 
 
<?php 
}
else {
	if (!empty($image)){ 
		$fp = fopen($_FILES[image][tmp_name], "r"); 
        $data2 = fread($fp, $_FILES[image][size]);
        fclose($fp);
 
		$data2=addslashes($data2);
		$data2=mysql_escape_string($data2);
$query="select * from test where no='1'";
$result=mysql_query($query,$connect);
$data=mysql_fetch_array($result);
$data1=$data[picture];
 
if($data1==$data2) echo "same"; else echo "different";
 
		unlink($filename1); 
	}
 
}
mysql_close($connect);
?> 
ant01의 이미지

http://antonio.pyy.kr/index.php?mid=computer&document_srl=3984

에 출력되는 결과까지 확인하고 다시 정리하여 올렸습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.