PDO lastInsertId();问题PHP

6
我有一个包含父子关系的数据库。我需要先插入到父表,然后获取ID,用于接下来插入子表数据。
以下是我用于插入数据库的代码片段。这是我第一次使用PDO类。我得到的错误是“未定义属性:and,在非对象database::$db上调用成员函数lastInsertId()”。我必须承认我对PHP比较新。谢谢。
{

    public function __construct($DB_TYPE, $DB_HOST, $DB_NAME, $DB_USER, $DB_PASS)
    {
        parent::__construct($DB_TYPE.':host='.$DB_HOST.';dbname='.$DB_NAME, $DB_USER, $DB_PASS);
}

$this->db = new database(DB_TYPE, DB_HOST, DB_NAME, DB_USER, DB_PASS);

    $this->db->insert('images', array(
        'image_userID' => $data['image_userID'],
        'image_date' => $data['image_date']
    ));

/**
 * insert
 * @param string $table A name of table to insert into
 * @param string $data An associative array
 */
public function insert($table, $data)
{
    $fieldNames = implode('`, `', array_keys($data));
    $fieldValues = ':' . implode(', :', array_keys($data));

    $sth = $this->prepare("INSERT INTO $table (`$fieldNames`) VALUES ($fieldValues)");

    foreach ($data as $key => $value) {
        $sth->bindValue(":$key", $value);
    }

    $sth->execute();

$result= $this->db->lastInsertId();
 return $result;
}
1个回答

7
最后一个插入的ID来自活动语句,而不是数据库句柄。因此,请将您的代码的最后一行更改为以下内容:
$return = $sth->lastInsertId();

非常感谢您的回复,我已经让lastInsertID()正常工作,并查看了您提到的另外两个问题。我删除了分号,您是正确的,但如果我从字段名称中删除反引号,我的函数将不再插入数据。 - denn
正如您所看到的,我删除了绑定部分并进行了检查。至于反引号,在implode中也添加了反引号,因此查询中的反引号是正确的。今天还太早,咖啡不够。对此很抱歉。 - JvdBerg
4
这个答案不正确。lastInsertId来自PDO对象,而不是语句(statement)对象。http://php.net/manual/en/pdo.lastinsertid.php - jsgoupil
1
同意@jsgoupil的观点,这是无效的。sth返回的是PDOStatement,它不包含lastInsertId,所以我不明白这怎么可能是正确的答案。我认为这可能是一个过时的答案。 - Ante Braovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接