2012-02-13 7 views
1

이미지 파일의 이름을 바꾸고 파일 위치를 데이터베이스에 저장하려고합니다. 내가에 삽입하고 테이블 행의 ID로 파일 이름을 원하는대로 내가, 그것으로 문제가 문제가 있습니다 을 업로드하고 내가 이런 나의 표를 참조 할 삽입 한 후 :.이름으로 파일 이름 바꾸기

---------------------------------------- 
| id | name | category | image   | 
---------------------------------------- 
| 1 | foo | category | uploads/1.jpg | 
---------------------------------------- 

을 id 필드가 자동으로 증가합니다.

function service() 
{ 
    $con=$this->do_upload(); 
    $id=mysql_insert_id(); 
    $data=array(
     'name'=>$this->input->post('name'), 
     'category'=>$this->input->post('category'), 
     'image'=>'uploads/'.$id.$con['file_ext']; 
    ); 
    $query=$this->db->insert('table',$data); 
    return $query; 
} 

이 올바른 방법이 아니다 및 가정으로 파일이 저장 '업로드/1.JPG'로 저장하는 wanted.instead으로 데이터베이스에 저장되지 않습니다 여기 내 코드입니다 'uploads/0.jpg'로 표시됩니다.
어느 누구도 저에게 올바른 권리 행사를 제공 할 수 있습니까? n.b. 나는 codeigniter 2.1.0mySQL 데이터베이스를 사용하고 있습니다.

+1

우리는 당신이'con'에'$'를 놓치고 알고 가정합니다.con [ 'file_ext'];' –

+0

'do_upload()'함수는 어떻게 될까요? 연결이 닫히거나 다른 데이터베이스 작업이 발생하면 'INSERT_ID'가 손실 될 수 있습니다 –

+1

파일 이름에 "upload /"가 포함되어서는 안됩니다. 아마도 해당 디렉토리에 모든 파일을 저장하고 있으므로 파일 이름을 "image1.jpg" –

답변

4

전에 mysql 쿼리를 호출하지 않고 mysql_insert_id으로 id에 액세스 할 수 없습니다. 새 레코드를 삽입하고 업데이트해야합니다. 새 파일 이름.

편집 : 서버에 이미지/다른 파일을 업로드 할 때

, 나는 항상 어떤 임의의 해시로 이름을 변경했다. 그래서 파일은 파일 시스템에 고유 한 해시 이름을 가지고 있었고 mysql 행에는 db 행을 파일과 연관시키기 위해이 해시를 설정했습니다.

$filename = ''; 
do { 
    $filename = substr(md5(uniqid(rand(), true)), 0, 8); 
} while (!file_exists('uploads/'.$filename)); 

do_upload 방법을 수행하고 $con 배열에 파일의 이름을 반환 할 수 있습니다 :

그래서 DB에 새 레코드를 삽입하기 전에,이 이름을 가진 파일이 이미 존재하는 경우 확인에 어떤 임의의 문자열을 생성합니다. 당신이 당신 id 필드에 고유 한 값을 사용하는 경우

+2

무엇이 hsz라고 말하는 것이 맞습니다. 파일을 파일 시스템에 추가하고 레코드를 db에 추가해야합니다. 마지막 ID #를 반환하고 파일의 이름을 바꾼 다음 db를 다시 쿼리하여 새 파일 이름으로 행을 업데이트하십시오 .. ** 제안 ** 파일의 이름을 timestamp로 지정하고 해당 타임 스탬프를 db에 저장하십시오. db에 대한 쿼리가 하나 줄어 듭니다. 그리고 마찬가지로 독특합니다. – gorelative

+0

는 타임 스탬프를 사용하여 예제를 제공 할 수 있습니까? 감사합니다 u, @Myke – Shabib

+0

(최소 임에도 불구하고) 무작위 해시는 time() 호출보다 많은 리소스를 사용합니다. 두 시간 중() 전화가 더 나은 길일 것입니다. – gorelative

1

당신은 다음과 같이 할 수있는 :

function update_service($id) 
{ 
    $con=$this->do_upload(); 
    $result = mysql_query("SELECT MAX(id) FROM <table_name>"); 
    $data = mysql_fetch_row($result); 
    $id = $data[0] + 1; 
    $data=array(
     'name'=>$this->input->post('name'), 
     'category'=>$this->input->post('category'), 
     'image'=>'uploads/'.$id.$con['file_ext']; 
    ); 
    $query=$this->db->insert('table',$data); 
    return $query; 
} 
+1

이 솔루션은 데이터 부정확성을 유발할 수 있습니다. 빠른 시나리오 : 10 개의 레코드가 있으므로 마지막 ID는 '10'이므로 '$ id = 11'입니다. 하지만 마지막 5 개의 레코드를 지우면'$ id = 6'이됩니다. MySQL의 autoincrement는'id = 11'을 가진 새로운 recod를 삽입 할 것이고'$ id = 6'을 사용할 것입니다. 이런 식으로하지 마십시오! – hsz

+0

u님께 감사드립니다. @krister하지만 두 데이터베이스 호출을하지 않고서는 다른 방법이 있습니까? – Shabib

+0

@hsz 그럼 어떻게 할 건가요? 나는이 경우 꽤 초보자입니다. – Shabib

1
function service() 
{ 
    $con=$this->do_upload(); 
    $id = time(); 
    $data=array(
     'name'=>$this->input->post('name'), 
     'category'=>$this->input->post('category'), 
     'image'=>'uploads/'.$id.$con['file_ext']; 
    ); 
    $query=$this->db->insert('table',$data); 
    return $query; 
} 

는 .. 대신에 mysql_insert_id의 time() 사용 후 그냥 do_upload()에서 같은 일을 할 필요가 함수명 .. 어디서 파일 이름을 묻는 지 time() 만 사용하십시오.

0

내 응용 프로그램 중 하나에서 동일한 기능을 내장했습니다. 여기에서 다운로드 한 uuid 생성기 클래스를 사용하고 있습니다 : https://github.com/Repox/codeigniter-uuid.

이 클래스를 사용하여 새로 업로드 한 이미지에 대해 uuid 's를 생성하고 파일 이름을 ".ext"로 설정합니다. 파일 이름에 대한 참조가있는 이미지를 업로드 한 사용자에 대해서도 데이터베이스 필드에 uuid를 저장합니다.

나를 위해 잘 작동합니다.

은 그래서 코드는 다음과 같습니다

$this->load->library('uuid'); 
$uuid = $this->uuid->v4(); 
$new_file_name = $uuid.$image_data['file_ext']; 

희망이 도움이됩니다. >`$ 아이디 -

안부 세바스찬

+0

이것은 동작과 같은 시퀀스를 구현하는 많은 방법 중 하나입니다. 원래의 질문에 관해서는, $ id = mysql_insert_id(); 삽입 전에 완료해야합니다. http://www.tutorialspoint.com/mysql/mysql-using-sequences.htm – alfasin