0

「Image」テーブルの「ImageFile」フィールドに画像ファイル名を挿入するINSERT関数があります。自動番号のおかげで、各行には独自のImageIdがあります。この例を以下に示します。

ImageId    ImageFile

23         orange.jpg
24         flowers.png
25         castle.png
26         orange.jpg

私がやりたいことは、ImageId を QuestionId と SessionId を持つ別のテーブルに挿入して、このテーブル (Image_Question) が ImageId を使用して Image テーブルを Image Question テーブルにリンクできるようにすることです。現在、mysql_insert_id を使用して Image テーブルから ImageId を取得し、Image_Question テーブルの ImageId に格納しようとしています。

しかし、私は何をする必要があるのか​​ わからないようです。現時点では、画像テーブルへのINSERTING値は正常に機能していますが、Image_Questionテーブル内に値を挿入しません。

私の質問は、Image テーブルに挿入された各行についてです。Image テーブルに挿入された後に Image テーブルから ImageId を取得し、mysql_insert_id() を使用して Image_Question テーブルに挿入するにはどうすればよいですか? 以下の例:

ImageId   SessionId  QuestionId

23        AAA        1
24        AAA        2
25        AAA        3
26        AAA        4

SessionId と QuestionId の INSERT 値をコーディングしましたが、ImageId を取得して挿入する方法だけが必要です。以下は現在のコードです。

      <?php

        session_start();


        //connect to db

        $result = 0;
        $i = 0;
        $insertimage = array();


                    move_uploaded_file($_FILES["fileImage"]["tmp_name"],
      "ImageFiles/" . $_FILES["fileImage"]["name"]);
      $result = 1;

        $imagesql = "INSERT INTO Image (ImageFile) 
        VALUES ('ImageFiles/".mysql_real_escape_string($_FILES['fileImage']['name'])."')";

    mysql_query($imagesql);

    for($i = 0;  $i < $c; $i++ ){


    $insertimage[] = "'". 
                    mysql_real_escape_string($_SESSION['id'] ) . 
                    ($_SESSION['initial_count'] > 1 ? $_SESSION['sessionCount'] : '') ."' ,'". 
                    mysql_real_escape_string( $_POST['numQuestion'][$i] ) ."'";

}

    $imageinsertsql .= "INSERT INTO Image_Question 
         (ImageId, SessionId, QuestionId) 
         VALUES 
         ((SELECT ImageId FROM Image ORDER BY ImageId DESC LIMIT 1),
          " . implode('), (', $insertimage) . ")";

          mysql_query($imageinsertsql);

              }

              mysql_close();

        ?>

それが大学のサーバーのバージョンであるため、私は古いphpバージョン5.2.13を持っています。

4

3 に答える 3

0

これを使用する必要があります:SELECT LAST_INSERT_ID();

于 2012-06-07T07:27:51.063 に答える
0

テーブルに挿入される各レコードImageIdの句に toを指定する必要があります。PHP の関数を使用すると、次のようにループを調整できます。VALUESImage_Questionmysql_insert_id()for

for ($i = 0;  $i < $c; $i++) {
  $insertimage[] = mysql_insert_id()
  .", '".mysql_real_escape_string($_SESSION['id'] )
        .($_SESSION['initial_count'] > 1 ? $_SESSION['sessionCount'] : '') . "'"
  .", '". mysql_real_escape_string( $_POST['numQuestion'][$i] ) . "'";
}

$imageinsertsql .= "INSERT INTO Image_Question 
  (ImageId, SessionId, QuestionId) 
  VALUES 
  (" . implode('), (', $insertimage) . ")";

ただし、古い MySQL 拡張機能はもはや維持されておらず、コミュニティは非推奨プロセスを開始しています。代わりに、改善されたMySQLi拡張機能またはPDO抽象化レイヤーのいずれかを使用できます。どちらも、変数をパラメーターとして渡すことができる準備済みステートメントをサポートしています (SQL に対して評価されないため、エスケープする必要はありません)。たとえば、PDO を使用すると、次のようになります。

$dbh = new PDO("mysql:dbname=$db;charset=utf8", $username, $password);

$qry = $dbh->prepare('INSERT INTO Image (ImageFile) VALUES (?)');
$qry->execute(array("ImageFiles/{$_FILES['fileImage']['name']})"));

$qry = $dbh->prepare('INSERT INTO Image_Question (ImageId, SessionId, QuestionId) 
                      VALUES (:ImageId, :SessionId, :QuestionId)');

$qry->bindValue(':ImageId', $dbh->lastInsertId());
$qry->bindValue(':SessionId', $_SESSION['id'] .
                 ($_SESSION['initial_count'] > 1 ? $_SESSION['sessionCount'] : '')
               );

$qid = null;
$qry->bindParam(':QuestionId', $qid);
foreach ($_POST['numQuestion'] as $qid) $qry->execute();
于 2012-06-07T08:05:40.900 に答える
-1

このクエリを試してください。

$imagesql = "INSERT INTO Question 
         (ImageId, SessionId, QuestionId) 
         VALUES 
         ((SELECT ImageId FROM image ORDER BY ImageId DESC LIMIT 1),
          " . implode('), (', $insertimage) . ")";
于 2012-06-07T07:31:04.117 に答える