【问题标题】:Retrieving last inserted iD then uploading to MySQL. #PDO #PHP检索最后插入的 iD,然后上传到 MySQL。 #PDO #PHP
【发布时间】:2013-06-28 06:49:02
【问题描述】:

我有一个表单,可以同时将 Textarea InformationImage 上传到 MySQL。

Textarea iDAUTO_INCREMENTImage iD 必须是 textarea's 副本。我尝试在$_POST 中获取lastInsertId();返回Fatal error: Call to undefined function lastInsertId()

这是我当前用于将信息上传到函数和/或查询的 isset 代码:

if(isset($_POST['update']) && isset($_FILES['photo1'])){
    $update = $_POST['update'];
    $data = $Wall->Insert_Update( $uiD, $update);

    $name       = $_FILES['photo1']['name'];
    $tmp_name   = $_FILES['photo1']['tmp_name'];
    $target = "uploads/". $_FILES['photo1']['name'];

    if (move_uploaded_file($tmp_name,$target)) {
        $sth = $db->prepare("SELECT post_iD FROM posts WHERE uid_fk = :uiD");
        $sth->execute(array(':uiD' => $uiD));

        $post_iD = lastInsertId();
        $sth = $db->prepare('INSERT INTO user_uploads (image_path, uid_fk, image_id_fk) VALUES (:image_path, :uiD, :image_id_fk)');
        $sth->execute(array(':image_path' => $target, ':uiD' => $uiD, ':image_id_fk' => $post_iD));
    }
}

这是上传文本区域的 Insert_Update:

PUBLIC FUNCTION Insert_Update( $uiD, $update){
$sth = $this->db->prepare("SELECT post_iD,message FROM posts WHERE uid_fk = :uiD ORDER by post_iD DESC LIMIT 1");
$sth->execute(array(':uiD' => $uiD));

$result = $sth->fetch();

        if ($update!=$result['message']){

            $sth = $this->db->prepare("INSERT INTO posts ( message, uid_fk, ip, created) VALUES ( :update, :id, :ip, :time)");
            $sth->execute(array(':update' => $update, ':id' => $uiD, ':ip' => $_SERVER['REMOTE_ADDR'], ':time' => time()));

            $sth = $this->db->prepare("
                                        SELECT M.post_iD, M.uid_fk, M.message, M.created, U.username 
                                        FROM Posts M, users U 
                                        WHERE M.uid_fk=U.uiD 
                                        AND M.uid_fk = ? 
                                        ORDER by M.post_iD DESC LIMIT 1");
            $sth->execute(array($uiD));

            $result = $sth->fetchAll();
            return $result;
            } else {
            return false;
        }
}

表格:

<form method="POST" action="" enctype="multipart/form-data">
    <textarea name="update" id="update" class="_iType"></textarea>
    <input type="file" name="photo1">
    <input type="submit" value="post" class="update_button"> 
</form>

数据库中的更多信息,我怀疑它是否有用。

  1. posts table : textarea 信息所在的位置。

    *post_iD |留言 | uid_fk |知识产权 |已创建 |*

  2. user_uploads table :图像位置的位置。

    *image_iD |图像路径 | uid_fk | image_id_fk*

注意:image_id_fk 应该等于 post_iD(这很明显)。

lastInsertId()怎么样;假设被使用?

编辑 1:上传完成后,image_id_fk 的插入值等于 0,而不是 post_iD 值。出于这个原因有什么想法吗?

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    它可以在您成功执行INSERT 语句后立即使用。但是,您必须始终检查执行是否成功(或是否存在受影响的行),因为之前执行的语句中可能存在last insert ID

    $sth = $this->db->prepare("INSERT INTO posts ( message, uid_fk, ip, created) VALUES ( :update, :id, :ip, :time)");
    $sth->execute(array(':update' => $update, ':id' => $uiD, ':ip' => $_SERVER['REMOTE_ADDR'], ':time' => time()));
    
    $this->db->lastInsertId(); //Upon success, is available
    

    例如: 您有一个创建新帖子的功能。成功时此函数可以返回最后一个插入 ID 值,因此您可以将该值显示给用户。喜欢:

    if (isset($_GET['id'])){
      $id = $manager->createPost($_GET['id']) ;
      if (is_numeric($id)){
        echo "Your article has been created. ID: {$id}" ; //Or link to it.
      }
    }
    

    更新:

    这是我对您的问题的建议:lastInsertId always retuns 0:

    您插入值的表必须有PRIMARY KEY AUTO_INCREMENT 字段,最好是int 类型。

    【讨论】:

    • 感谢您非常详细地介绍该功能。如果 lastInsertId();根本没有检索任何值,并将值 0 上传到数据库?因为这就是它目前正在做的事情!
    • 您的数据库中有AUTO_INCREMENT 字段吗?
    • 不适用于必须等于具有 AUTO_INCREMENT 的 post_iD 的 image_id_fk。
    • 好吧,您的表中的每个项目都必须有一个唯一的AUTO_INCREMENT id。
    • 好吧,正如我在线程本身中提到的那样。 image_id_fk 应该等于最后插入的 id,以便我可以在循环中检索图像。 textarea = post_iD。图像 = image_id_fk = post_iD。所以它们需要匹配,因为它们是一起上传的。即使那样,我是否应该为 image_id_fk 设置 AUTO_INCREMENT,它不会有不同的 id 值吗?编辑:你是对的,它确实有自动增量,但我只是想匹配两个 id,所以我可以在一个循环中将数据拉到一起。
    【解决方案2】:

    您以错误的方式访问pdo lastinsertid。它需要数据库连接对象。

    $post_iD = lastInsertId();
    

    应该是

    $post_iD = $db->lastInsertId();
    

    【讨论】:

    • 你说得对,我的好人。我忘了提到当它上传时它总是输入一个值 0 而不是 lastinsertiD 值。
    • @iBrazilian 你能澄清一下吗?
    • 当然。而不是插入 lastInsertId();它上传的值为 0。好像 lastInsertId();根本没有检索任何值。在 MySQL 数据库上,image_id_fk = 0 而不是 ex:post_iD = 344 而 image_id_fk = 0。这可以理解吗?
    • @iBrazilian 在使用 lastInsertId() 之前,您正在使用 select 语句。那么你想要select语句的id吗?
    • 是的。这就是重点,因为我有一个表格并且我正在上传一个文件和文本信息,我希望他们两个拥有相同的 iD,以便我可以将信息汇总在一起。或者我希望 LastInsertId() 返回与 Insert_Update 函数正在上传的相同 post_iD。
    猜你喜欢
    • 2012-05-31
    • 2016-07-10
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    相关资源
    最近更新 更多