1

皆様へのご挨拶、

行のコピーに関する質問を確認していますが、解決策が見つからないか、間違って検索しています。

複数のファイルをアップロードし、アップロードプロセス中に行が同時に作成される2つのテーブルにいくつかの情報を保存しようとしています。

「media」と呼ばれる2つのテーブルがあり、「pmedia」構造は次のとおりです。

CREATE TABLE IF NOT EXISTS `media` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `product_id` int(1) unsigned NOT NULL default '0',
  `media_id` int(1) unsigned NOT NULL default '0',
  `ordering` int(2) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `i_product_id` (`product_id`,`media_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=267 ;

CREATE TABLE IF NOT EXISTS `pmedia` (;
  `media_id` int(11) unsigned NOT NULL auto_increment,
  `file_title` char(126) NOT NULL default '',
  `file_mimetype` char(64) NOT NULL default '',  
  PRIMARY KEY  (`media_id`),
  KEY `i_vendor_id` (`vendor_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=274 ;

「pmedia」に複数の画像をアップロードしていますが、問題ありません。

$query="INSERT into pmedia (`file_title`,`file_mimetype`) VALUES ('$file_name','$file_type') ; ";

しかし同時に、アップロードされたファイルの自動作成列「media_id」も「media」テーブルにコピーしたいと思います。

結果はアップロード後になります。

ここに画像の説明を入力してください

EDIT2: ループ自体でした。書き間違えました。以下のコードは、RulyとgaRexの助けとインスピレーションによって機能します。どうもありがとうございました。

編集 :

これが構造です。説明が不足していることをお詫びします。(私は単一のクエリでそれを実行しようとはしていません。)ループをどのように実装する必要がありますか?このようにして、アップロードされたデータのみをpmediaに書き込みます。

<?php
if(isset($_FILES['files'])){
$errors= array();
foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
    $file_name = $_FILES['files']['name'][$key];
    $file_size =$_FILES['files']['size'][$key];
    $file_tmp =$_FILES['files']['tmp_name'][$key];
    $file_type=$_FILES['files']['type'][$key];

    if($file_size > 2097152){
        $errors[]='File size must be less than 2 MB';
    }       


        $query="INSERT into pmedia (`file_title`,`file_mimetype`) VALUES ('$file_name','$file_type') ; ";
        $media_id = mysql_insert_id();

        $query2="INSERT into media (`media_id`) VALUES ($media_id) ; ";


    $desired_dir="user_data";
    if(empty($errors)==true){
        if(is_dir($desired_dir)==false){
            mkdir("$desired_dir", 0700);        // Create directory if it does not exist
        }
        if(is_dir("$desired_dir/".$file_name)==false){
            move_uploaded_file($file_tmp,"$desired_dir/".$file_name);
        }else{                                  // rename the file if another one exist
            $new_dir="$desired_dir/".$file_name.time();
             rename($file_tmp,$new_dir) ;               
        }
     mysql_query($query);
     mysql_query($query2);  

    }else{
            print_r($errors);
    }
}
if(empty($error)){
    echo "Success";


} }
?>
<form action="" method="POST" enctype="multipart/form-data">
<input type="file" name="files[]" multiple/>
<input type="submit"/>
</form>
4

2 に答える 2

2

これを行うには2つの方法があります。

  1. 複数のクエリを実行する

    実行後:

    $query="INSERT into pmedia (`file_title`,`file_mimetype`) VALUES ('$file_name','$file_type') ; ";
    

    新しいレコードのIDを取得し、mysqli_insert_idを使用します

    http://www.php.net/manual/en/mysqli.insert-id.php

    次に、以下を実行します。

    $query="INSERT into media (`id`,`product_id`, `media_id`, `ordering`) VALUES ($id, $product_id, $media_id, $ordering) ; ";
    
  2. トリガーを使用しますが、この場合は、pmediaテーブルからorderingのid、product_idの値を取得できると思うので、確信しています。

編集:

複数の行を追加するには、ループが必要です。ループでは、これらの3つの手順を実行する必要があります。コードは次のようになります。

// Looping {
    $query="INSERT into pmedia (`file_title`,`file_mimetype`) VALUES ('$file_name','$file_type') ; ";

    $media_id = mysqli_insert_id($conn);

    $query="INSERT into media (`id`,`product_id`, `media_id`, `ordering`) VALUES ($id, $product_id, $media_id, $ordering) ; ";
// } Looping
于 2013-03-25T01:05:59.203 に答える
0

1つのクエリで複数の行をpmediaに挿入するのはなぜですか?

最も簡単で信頼性の高い方法は、そこに1行ずつ挿入してから、メディアテーブルを更新することです。

ただし、必要に応じて、これら2つの方法を試すことができます。それらは両方とも汚れています:

  1. 外部に設定できる一意の値を持つ列をpmediaに追加します。それを私たちの素敵なGUID(googleを参照)CHAR(36)にします。次に、スクリプトでこの値を生成し、pmediaの各行に設定します。後は、mysqlの挿入IDはすでに生成されているため、必要ありません。次に、挿入クエリでpmediaを参照して、メディアテーブルに挿入できます。

    t1(v1、v2)の値($ v1、(guid = $ guidの場合はt2からidを選択))、..に挿入します。

  2. トランザクションを開始します。pmediaに挿入し、最後のレコードのlast_insert_id()を取得します。次に、レコードの数を数えるときに、最初のレコードのIDを計算できます。

しかし、plsは覚えています-どちらの方法も汚くて悪いです。

于 2013-03-25T02:56:30.470 に答える