检索最后插入的iD,然后上载到MySQL#PDO#PHP

检索最后插入的iD,然后上载到MySQL#PDO#PHP,php,mysql,pdo,Php,Mysql,Pdo,我有一个表单,可以将Textarea信息和图像同时上传到MySQL 文本区域iD是AUTO_INCREMENT,而图像iD必须是文本区域的副本。我已经在$\u POST中尝试获取lastInsertId();返回致命错误:调用未定义的函数lastInsertId() 这是我当前用于将信息上载到函数和/或查询的isset的代码: if(isset($_POST['update']) && isset($_FILES['photo1'])){ $update = $_POST

我有一个表单,可以将Textarea信息和图像同时上传到MySQL

文本区域
iD
AUTO_INCREMENT
,而图像
iD
必须是
文本区域的副本。我已经在
$\u POST
中尝试获取
lastInsertId()
;返回
致命错误:调用未定义的函数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_更新:

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;
        }
}
表格:


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

  • posts表格
    :文本区域信息的位置

    *已创建post|iD|消息| uid|fk | ip ||*

  • 用户上传表
    :图像位置的位置

    *图像|图像|路径| uid | fk |图像| iD | fk*

  • 注意:
    image\u id\u fk
    应该等于
    post\u id
    (这很明显)

    lastInsertId()如何使用;假设要使用

    编辑1:上载完成后,图像的插入值\u id\u fk等于0,而不是post\u id值。出于这个原因,您有什么想法吗?

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

    $post_iD = lastInsertId();
    
    应该是

    $post_iD = $db->lastInsertId();
    
    您正在以错误的方式访问。它需要数据库连接对象

    $post_iD = lastInsertId();
    
    应该是

    $post_iD = $db->lastInsertId();
    

    它可以在成功执行
    INSERT
    语句后立即使用。但是,您必须始终检查执行是否成功(或者是否有受影响的行),因为可以从以前执行的语句中找到
    最后一个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始终重新运行0


    插入值的表必须有
    主键自动递增
    字段,最好是类型为
    int

    它可以在成功执行
    插入
    语句后立即使用。但是,您必须始终检查执行是否成功(或者是否有受影响的行),因为可以从以前执行的语句中找到
    最后一个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始终重新运行0



    您插入值的表必须有
    主键自动递增
    字段,最好是键入
    int

    您是对的,我的好人。我忘了提到当它上传时,它总是输入一个0的值,而不是最后插入的值。@iBrazilian你能澄清一下吗?当然。而不是插入lastInsertId();它上载0的值。好像lastInsertId();根本没有检索任何值。在MySQL数据库上,image\u id\u fk=0而不是ex:post\u id=344,而image\u id\u fk=0。这可以理解吗?@iBrazilian在使用
    lastInsertId()
    之前,您使用的是select语句。那么您想要select语句的id吗?是的。这就是重点,因为我有一个表单,我正在上传一个文件和文本信息,我希望它们都有相同的iD,这样我就可以把信息放在一起。或者我希望LastInsertId()返回与Insert\u Update函数正在上载的post\u iD相同的post\u iD。我忘了提到当它上传时,它总是输入一个0的值,而不是最后插入的值。@iBrazilian你能澄清一下吗?当然。而不是插入lastInsertId();它上载0的值。好像lastInsertId();根本没有检索任何值。在MySQL数据库上,image\u id\u fk=0而不是ex:post\u id=344,而image\u id\u fk=0。这可以理解吗?@iBrazilian在使用
    lastInsertId()
    之前,您使用的是select语句。那么您想要select语句的id吗?是的。这就是重点,因为我有一个表单,我正在上传一个文件和文本信息,我希望它们都有相同的iD,这样我就可以把信息放在一起。或者我希望LastInsertId()返回与Insert\u Update函数上载的post\u iD相同的post\u iD。感谢您对该函数的详细介绍。如果lastInsertId()发生了什么;是否根本没有检索任何值,并将0的值上载到数据库?因为这就是它目前正在做的事情!您的数据库中是否有一个
    自动增量
    字段?对于必须等于具有自动增量的post\u id的image\u id\u fk,您的表中的每个项都必须有一个唯一的
    自动增量
    id。正如我在线程本身中提到的那样。image_id_fk应等于最后插入的id,以便我可以在循环中检索图像。textarea=post\u iD.image=image\u iD\u fk=post\u iD.所以它们需要匹配,因为它们是一起上传的。即使这样,如果我对图像id fk进行自动增量,它的id值会不同吗?编辑:你说得对,它确实有自动递增功能,但我只是想匹配两个id,这样我就可以把数据放在一个循环中。谢谢你对这个函数的详细介绍。如果lastInsertId()发生了什么;是否根本没有检索任何值,并将0的值上载到数据库?因为这就是它目前正在做的事情!您的数据库中是否有一个
    自动增量
    字段?对于必须等于具有自动增量的post\u id的image\u id\u fk,您必须具有唯一的
    自动增量