복붙노트

PHP로 MySQL 데이터베이스에 Blob 삽입

PHP

PHP로 MySQL 데이터베이스에 Blob 삽입

나는 데이터베이스에 이미지를 저장하려고하는데, 어떤 이유로 작동하지 않는 것 같습니다. 여기 내 테이블의 구조가 있습니다.

mysql> describe ImageStore;
+---------+----------+------+-----+---------+-------+
| Field   | Type     | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+-------+
| ImageId | int(11)  | NO   | PRI | NULL    |       |
| Image   | longblob | NO   |     | NULL    |       |
+---------+----------+------+-----+---------+-------+
2 rows in set (0.01 sec)

그리고 여기에 이미지를 삽입하는 쿼리 또는 최소한 그것이 필요한 것입니다.

//Store the binary image into the database
                $tmp_img = $this->image['tmp_name'];
                $sql = "INSERT INTO ImageStore(ImageId,Image)               
                VALUES('$this->image_id','file_get_contents($tmp_image)')";
                mysql_query($sql); 

file_get_contents ($ tmp_image)의 값을 인쇄하면 화면에 많은 양의 데이터가 있습니다. 그러나이 값은 데이터베이스에 저장되지 않으며 내가 직면 한 문제입니다.

해결법

  1. ==============================

    1.

    $sql = "INSERT INTO ImageStore(ImageId,Image)
            VALUES('$this->image_id','file_get_contents($tmp_image)')";
    

    이것은 $ sql이라는 이름의 PHP 문자열을 생성합니다. 아직 아무 쿼리도 실행하지 않으므로 잠시 MySQL을 잊어 버리십시오. 당신은 단지 끈을 만들고 있습니다.

    PHP의 마법은 변수 이름 (예 : $ this-> image_id)을 큰 따옴표 안에 쓸 수 있다는 것을 의미합니다. 변수는 계속해서 마법처럼 확장됩니다.

    "변수 보간법"이라고하는이 기능은 함수 호출에서는 발생하지 않습니다. 그래서 여기서하는 일은 문자열 "file_get_contents ($ tmp_image)"를 데이터베이스에 쓰는 것입니다.

    따라서, file_get_contents ($ tmp_name)를 호출 한 결과를 연결하려면 문자열에서 뛰어 나와 명시 적으로 작업을 수행해야합니다.

    $sql = "INSERT INTO ImageStore(ImageId,Image)
            VALUES('$this->image_id','" . file_get_contents($tmp_image) . "')";
    

    (이 구문이 어떻게 작동하는지 강조하는 구문에서도 알 수 있습니다.)

    이제 문제는 바이너리 데이터에 '가 포함되어 있으면 쿼리가 유효하지 않다는 것입니다. 따라서 mysql_escape_string을 통해 실행하여 질의 연산을 위해 위생적으로 처리해야한다.

    $sql = "INSERT INTO ImageStore(ImageId,Image)
            VALUES('$this->image_id','" . mysql_escape_string(file_get_contents($tmp_image)) . "')";
    

    이제는 큰 문자열이 생겨 데이터베이스가 부피가 커지고 있습니다.

    데이터베이스에 이미지를 저장하지 마십시오. 데이터베이스에서 이미지를 저장할 수 있습니다.

  2. ==============================

    2.Tomalak의 코멘트를 확장하려면 따옴표 안에 함수를 실행할 수 없습니다.

    Tomalak의 코멘트를 확장하려면 따옴표 안에 함수를 실행할 수 없습니다.

    시험:

    $sql = "INSERT INTO ImageStore(ImageId,Image)               
            VALUES('{$this->image_id}','".file_get_contents($tmp_image)."')";
    
  3. ==============================

    3.이 시도:

    이 시도:

    $tmp_img = $this->image['tmp_name'];
    $sql = "INSERT INTO ImageStore(ImageId,Image)               
      VALUES('$this->image_id','" . addslashes(file_get_contents($tmp_image)) . "')";
    mysql_query($sql);
    
  4. ==============================

    4.언급 한 바와 같이 "file_get_contents ($ tmp_image)"문자열을 db 대신에 file_get_contents 함수를 실행할 필요가 있습니다. db64에 저장하기 전에 base64_encode와 같은 해시 알고리즘을 사용하여 이미지를 해시하는 것을 잊지 마십시오.

    언급 한 바와 같이 "file_get_contents ($ tmp_image)"문자열을 db 대신에 file_get_contents 함수를 실행할 필요가 있습니다. db64에 저장하기 전에 base64_encode와 같은 해시 알고리즘을 사용하여 이미지를 해시하는 것을 잊지 마십시오.

  5. from https://stackoverflow.com/questions/7052655/insert-blobs-in-mysql-databases-with-php by cc-by-sa and MIT license