2014-07-21 99 views
0

对于我的问题,我有两种可能的解决方案我想回显最后插入的ID以知道有多少人填写表单,但会影响下表中的数据。注意:这不会影响数据库本身,只会影响浏览器的输出。PHP无法获取正确插入的最后一个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>'; 

我actualy多了一个ID比下面显示的图片显示的要多: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

+0

,你做的电网也将代码丢弃功能/程序的风格好被张贴 –

+0

好吧现在去更新它 – Miguel

回答

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

+0

感谢它的工作 – Miguel

0

尝试使用:

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

Nop没有工作。谢谢 – Miguel

+0

WHERE TABLE_SCHEMA ='blop' - blop它是你的数据库名称,是不是正确的名称? –

0

从PHP文件:

mysqli_insert_id()函数返回查询在具有AUTO_INCREMENT属性的列的表上生成的ID。如果最后一个查询不是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查询。

0

在第一个示例中,您不应该马上执行第二个“获取_...”。那是因为你丢弃了第一行,你已经提取了。

快速(未经测试,对不起错别字)以下修正:

...

$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++; 
    } 

......