Php 返回插入行的id(自动增量) 我将数据插入名为“花名册”的表中。第一列(id_花名册)是使用mysql自动递增的id 我运行SELECT查找id\u花名册

Php 返回插入行的id(自动增量) 我将数据插入名为“花名册”的表中。第一列(id_花名册)是使用mysql自动递增的id 我运行SELECT查找id\u花名册,php,mysql,Php,Mysql,我使用此id\u花名册将其与其他数据一起插入到“花名册”表中 if ($insert_stmt = $mysqli->prepare("INSERT INTO `roster`(`nom_roster`, `description_roster`, `id_organisation`, `created_by`, `creation_date`,`modified_by`) VALUES (?, ?, ?, ?, ?, ?)")) { $insert_stmt->bind_

我使用此id\u花名册将其与其他数据一起插入到“花名册”表中

if ($insert_stmt = $mysqli->prepare("INSERT INTO `roster`(`nom_roster`, `description_roster`, `id_organisation`, `created_by`, `creation_date`,`modified_by`) VALUES (?, ?, ?, ?, ?, ?)")) {

    $insert_stmt->bind_param('ssiisi', $roster_name, $description_roster, $organisation_id, $user_id, $creation_date, $user_id);

    if (!$insert_stmt->execute()) {
            $reponse = 'Sorry, a database error occurred; please try later';
        } else {
            // if INSERT OK -> create a new line in roster_membre table
                //1. get the roster_id
                $sql = "SELECT r.id_roster 
                            FROM roster r
                            WHERE r.nom_roster = ?
                            LIMIT 1";
                $stmt = $mysqli->prepare($sql);

                    if ($stmt) {
                        $stmt->bind_param('s', $roster_name); 
                        $stmt->execute();    // Execute the prepared query.
                        $stmt->store_result();
                        $stmt->bind_result($id_roster);
                        $stmt->fetch(); 

                        $level = 1;
                    //2. create a line with the roster_id and insert the membre as level 1 
                        $insert_stmt = $mysqli->prepare("INSERT INTO `roster_par_membre`(`id_membre`, `id_roster`, `level`, `modified_by`) VALUES (?,?,?,?)");
                        $insert_stmt->bind_param('iiii', $user_id, $id_roster, $level, $user_id);
                        $insert_stmt->execute();

                    $reponse = 'success';
                    }   
到目前为止,代码仍在运行,但不是很好。 当我们在一个表中创建一个新行时,有没有一种方法可以直接返回一个用于sql查询(将数据插入第二个表)的值(带有自动递增的id)?或者在一个语句中合并两个查询(两个插入)

简短编辑:这是一个AJAX$响应,返回值(JSON)

好的,解决方案:

                //1. get the roster_id
            $sql = "SELECT r.id_roster 
                        FROM roster r
                        WHERE r.nom_roster = ?
                        LIMIT 1";
            $stmt = $mysqli->prepare($sql);

                if ($stmt) {
                    $stmt->bind_param('s', $roster_name); 
                    $stmt->execute();    // Execute the prepared query.
                    $stmt->store_result();
                    $stmt->bind_result($id_roster);
                    $stmt->fetch(); 
只需将所有这部分更换为

$id_roster =  $mysqli->insert_id;

又好又容易。感谢albanx

这些是我用于查询我不想使用任何框架(仅php)的项目的函数:


寻找最后一个插入id?只使用mysqli->query(insert),mysqli->insert\u id怎么样?@vp\u arth是的,这就是最后一个插入id;我查一下。关于如何相应地修改代码,你有什么想法吗?@Raphael_b,我有个好主意-你应该在代码编辑器中打开它并修改代码。@albanx:谢谢你的提示。我目前正在考虑这个选择。这似乎就是我要找的。只需要找到如何让它工作。干杯没关系。我刚刚发布了一些示例,这些示例是我用来更快地编写查询的短手函数。我在这里做了一些手动转义,但是,这可以调整为与mysqli->prepareSo一起使用。你为每个查询打开一个连接,然后将原始php值注入一个准备好的语句中,然后通过将值注入
…@DarkBee来滥用系统。实际上,这不是完整的类,正如我所说的,这只是一个可以调整的示例。逃逸和使用有什么问题?和注入原始php值?@DarkBee,你认为(通过你而不是你的方式)打开关闭连接有什么区别吗?如果你用1000个用户运行1000个查询,它确实有区别是的,你应该使用准备好的语句,而不是自己注入值
/**
     * 
     * Executes query methods
     * @param string $query the query string
     * @param array $vals array of values
     * @param bool $show show the query
     * @return int/array/false
     */
    function q($query, $vals=array(), $show_query=false) 
    {
        $conn = new mysqli(...)
        $offset = 0;
        foreach ($vals as $v) 
        {
            $cv     = $conn->real_escape_string($v);//escape the value for avoiding sql injection
            $fv     = ($v===NULL) ? 'NULL':"'".$cv."'"; //if value is null then insert NULL in db
            $qpos   = strpos($query, '?', $offset);//replace the ? with the valeue
            $query  = substr($query, 0, $qpos).$fv.substr($query, $qpos+1);
            $offset = $qpos+strlen($cv)+1;
        }

        $result = $conn->query($query);

        if($show || $result===false) echo $query."<br>";
        $rows = array();
        if($result===true)
        {
            return $conn->affected_rows;
        }
        else if($result===false)
        {
            return false;
        }
        else 
        {
            while ($row = $result->fetch_array(MYSQLI_ASSOC) ) 
            {
                $rows[]=$row;
            }
        }

        return $rows;
    }

    function lastid()
    {
        return $this->qval("SELECT LAST_INSERT_ID()");
    }
q('INSERT INTO USER(name, email) VALUES(?,?)', array('admin','admin@admin.com'));
$id = lastid();