我的两个可能的解决方案对于我的问题我希望回显插入的最后一个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>';
我实际上比桌面上显示的内容多一个,如下图所示:
正如你所看到的,我有“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。
答案 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;
这不会强迫您在此查询之前进行INSERT
或UPDATE
查询。
答案 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