2012-02-13 26 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'に' $ 'を逃している知っていると仮定 - >' $ IDです。con ['file_ext']; ' –

+0

' do_upload() '関数の内部ではどうなりますか?接続が閉じられたり、他のデータベースアクションが発生した場合、あなたは 'INSERT_ID'を失う可能性があります –

+1

ファイル名には「upload /」が含まれてはいけません。おそらくあなたはそのディレクトリにすべてのファイルを保存しているでしょうから、ファイル名は" image1.jpg " –

答えて

4

mysql_insert_idでidにアクセスすることはできません。前にmysqlクエリを呼び出す必要はありません。新しいレコードを挿入してから更新する必要があります。新しいファイル名で

編集:私は、サーバーに画像/他のファイルをアップロードした時

、私は常にいくつかのランダムなハッシュでそれらの名前を変更しました。ファイルにはファイルシステム上でユニークなハッシュ名が付いていて、mysqlの行にはファイルとdb行を関連付けるだけのハッシュが設定されていました。 DBに新しいレコードを挿入する前に

、この名前のファイルが既に存在するかどうかをチェックして、いくつかのランダムな文字列を生成します。

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

do_upload方法でそれを行うと、それは$con配列内のファイルの名前を返すようにしましょう。

+2

何hszは正しいと述べた。ファイルをファイルシステムに追加し、レコードをdbに追加する必要があります。最後のID番号を返してからファイルの名前を変更し、最後にdbを再クエリして新しいファイル名で行を更新します。 **提案**ファイルにタイムスタンプとして名前を付け、そのタイムスタンプをdbに保存します。データベースへのクエリが1つ少なくなりました。独特のものです。 – gorelative

+0

タイムスタンプを使用した例を与えることができますか?ありがとう、@Mike – Shabib

+0

(最小限ではあるが)ランダムハッシュはtime()呼び出しよりも多くのリソースを必要とします。 2つのうち、時間()コールがより良いルートになります。 – gorelative

1

あなたはちょうどあなたがこのように行うことができ、あなたのidフィールドに一意の値を使用する場合:その後、あなただけ​​3210で同じことを行う必要がありtime()の代わりにmysql_insert_id ..を使用して

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の自動インクリメントは、 'id = 11'の新しいレコードを挿入し、' $ id = 6'を使用します。このようにしないでください! – hsz

+0

u @kristerに感謝しますが、2つのデータベースコールを作成せずにこれを行う方法はありますか? – 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; 
} 

関数..ファイル名を尋ねるところでは、time()を使用してください。

0

私は自分のアプリケーションの1つに同じ機能を組み込んでいます。私はここからダウンロードしたuuidジェネレータクラスを使用しています:https://github.com/Repox/codeigniter-uuid

このクラスを使用して、私は新しくアップロードされたイメージのuuidを生成し、ファイル名を ".ext"に設定します。私は、ファイル名への参照を持つように画像をアップロードしたユーザのために、データベースフィールドにuuidを保存しています。

私にとってはうまくいっています。

だから、コードスニペットは次のようになります。

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

は、この情報がお役に立てば幸いです。

敬具 セバスチャン

+0

これは動作のようなシーケンスを実装する多くの方法の1つです。 元の質問に関しては、$ id = mysql_insert_id();を使用しているようです。挿入後に行う必要があります。 http://www.tutorialspoint.com/mysql/mysql-using-sequences.htm – alfasin

関連する問題