PHP无法正确获取插入的最后一个ID

时间:2014-07-21 10:48:22

标签: php database output

我的两个可能的解决方案对于我的问题我希望回显插入的最后一个ID以了解填写表单的人数,但它会影响下表中的数据。注意:这不会影响数据库本身,只会影响浏览器的输出。

connect.php

@$db = new mysqli('127.0.0.1', 'blop', 'blop', 'blop');

if ($db->connect_errno) {
    die ('Sorry, we are having some problems.');
}

显示结果:

function returnData() {
    global $db;

    echo ('<style> td {border: 1px solid #000; background:#ed8043;} th {border:1px solid #000; background:#fff</style>
                    <table style="width:100%; text-align:center;">
                        <tr>
                        <th>Line</th>
                        <th>id</th>
                        <th>Name</th>
                        <th>Email</th>
                        <th>Visited</th>
                        </tr>');


    $result = $db->query("SELECT * FROM `people` ORDER BY `created` DESC");
    $count = $result->num_rows;
    echo 'Number of visits: ' .$count.'<br><br>';

    /*$visits1 = $result->fetch_assoc();
    echo $visits1['id']. '<br>';
    $visits2 = $db->insert_id;
    echo $visits2. '<br>';*/

    $row_num = 1;
        while ($row = $result->fetch_object()) {

            echo ('
                    <tr>
                    <td>' .$row_num. '</td>
                    <td>' .$row->id. '</td>
                    <td>' .$row->first_name. '</td>
                    <td>' .$row->mail. '</td>
                    <td>' .$row->created.'</td>
                    </tr>'
                );

            $row_num++;
        }
            echo ('</table><br>');
            $result->free();
}

问题在于,当我尝试这样的时候:1。

$result = $db->query("SELECT * FROM `people` ORDER BY `created` DESC");
$visits1 = $result->fetch_assoc();
echo $visits1['id']. '<br>';

我实际上比桌面上显示的内容多一个,如下图所示:enter image description here

正如你所看到的,我有“756”女巫很好,因为它是最后一个id插入但我不想要相应的行(id为756),它从下面的表中消失了。当我修改上面的代码时,它工作正常,第一行是插入的最后一个ID。

我有一个替代代码来解决这个问题,问题是这不起作用:2。

$result = $db->query("SELECT * FROM `people` ORDER BY `created` DESC");
$visits2 = $db->insert_id;
echo $visits2. '<br>';

这次表是正确的,它显示所有行,但总id的数量是0。 enter image description here

4 个答案:

答案 0 :(得分:0)

尝试使用:

SELECT `AUTO_INCREMENT`
FROM  INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'blop'
AND   TABLE_NAME   = 'people';

答案 1 :(得分:0)

来自php文档:

mysqli_insert_id()函数返回查询生成的ID,该查询在具有AUTO_INCREMENT属性的列的表上。如果最后一个查询不是INSERT或UPDATE语句,或者如果修改后的表没有具有AUTO_INCREMENT属性的列,则此函数将返回零。

因此SELECT查询不会返回最后插入的ID。

通常,此查询应适用于按列排序的表的最后一行:

select column_name from table_name order by column_name desc limit 1;

对于id,您也可以使用:

select LAST_INSERT_ID() from table;

这不会强迫您在此查询之前进行INSERTUPDATE查询。

答案 2 :(得分:0)

在第一个示例中,您不应该进行第二次提取_...&#39;马上。那是因为你已经放弃了第一行,你已经抓住了。

下面的快速(未经测试,抱歉拼写错误)修复:

<强> ...

$row = $result->fetch_object();
echo $row->id. '<br>';

$row_num = 1;
    while ($row_num == 1 || $row = $result->fetch_object()) {

        echo ('
                <tr>
                <td>' .$row_num. '</td>
                <td>' .$row->id. '</td>
                <td>' .$row->first_name. '</td>
                <td>' .$row->mail. '</td>
                <td>' .$row->created.'</td>
                </tr>'
            );

        $row_num++;
    }

<强> ...

答案 3 :(得分:0)

fetch_*方法正在做什么,以及您需要什么,以便您可以迭代它们。它是编程循环的简单逻辑。要执行函数n次,请将其置于循环中,或手动调用n次。您可以手动调用它一次,因此您已从此结果集中获取了第一个项目。将它放在while()循环中将从结果集中获取剩余的元素。

为了避免这种情况,您最好切换到已经获取的结果集并对其进行操作。

目前,您违反了单一责任原则,因为returnData获取数据,制作HTML等等。

使用查询创建函数getData(),然后将其与foreach一起使用以获取所有结果集。

仅使用一次获得最后一个Id(第一个)。

function getData() {
     global $db;
     $result = $db->query("SELECT .......");
     while ($row = $result->fetch_object()) {
          $rows[] = $row;
     }
     return $rows;
}

现在在returnData(),你可以使用

getData()[0]->id

要获取最后一个id,因为您还可以遍历该方法而不会丢失结果集:

foreach (getData() as $data) {
    echo $data->id;
}

您最好为此应用程序中需要的每件事物制作功能。获取最后一个id,获取整个结果集,获取rowcount等。从单个查询/方法中获取它是很好的做法。

老实说,你的代码中有很多问题需要修复,从全局变量开始,到函数/程序样式的结尾都有利于OOP