【问题标题】:Why Data is not getting inserted into the mysql database using php?为什么没有使用 php 将数据插入到 mysql 数据库中?
【发布时间】:2012-06-11 05:54:06
【问题描述】:

我有一个 INSERT 函数,它在“Image”表的“ImageFile”字段中插入图像文件名,由于自动编号,每一行都有自己的 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 表后如何从 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,因为那是大学服务器的版本。

【问题讨论】:

标签: php mysql


【解决方案1】:

你需要使用这个: 选择 LAST_INSERT_ID();

【讨论】:

  • 所以它会选择 LAST_INSERT_ID($lastimageid); 吗?还是选择 LAST_INSERT_ID(ImageId)?
  • while ($someArray) { $res = mysql_query('INSERT INTO ImagesTable SET imageName = "karumburum.jpg"'); $id = mysql_query('SELECT LAST_INSERT_ID();'); $res2 = mysql_query('INSERT INTO OtherTable SET imageId = '.$id.', otherColumn = "'.$somedata.'"'); }
【解决方案2】:

您需要为插入到Image_Question 表中的每条记录的VALUES 子句提供ImageId。使用 PHP 的 mysql_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 扩展已不再维护,社区已开始 deprecation process;您可以改用改进的MySQLi 扩展或PDO 抽象层,它们都支持prepared statements,其中变量可以作为参数传递(不会针对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();

【讨论】:

    【解决方案3】:

    试试这个查询。

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

    【讨论】:

    • 我不需要$lastimageid = mysql_insert_id();吗?
    • 我仍然无法将数据插入到 Image_Question 表中,我已经更新了包含您的查询的代码,我发现您刚刚说需要 mysql_insert_id(),所以我的问题我在哪里将 mysql_insert_id() 代码放在我的代码中,为什么你认为它没有将数据插入数据库? (我检查了查询,两个查询都没有拼写错误)
    • 这个答案是一个糟糕的主意:它不是并发安全的!如果在上述插入Question 之前,另一个连接插入image,则会进行错误的关联。
    • 很抱歉,您不再需要 $lastimageid = mysql_insert_id(); 这个了。只需此查询即可。
    • @eggyal:如果是这样的话,如果你选择mysql_insert_id();也会发生同样的事情,那么你认为正确的方法是什么?
    猜你喜欢
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多