所以我的php脚本中有一个选择状态SELECT * FROM Users WHERE age = 21 LIMIT 10
。现在,我必须遍历所有行以保持获取新的数据行。我该怎么做,以至于我花了O(1)
的时间来处理整个数据?现在,我有一个while循环,使其变为O(n)
。
function search($stmt, $age) {
$sql = "SELECT * FROM Users
WHERE age = ?
LIMIT 10";
if(!mysqli_stmt_prepare($stmt, $sql)) {
return false;
} else {
mysqli_stmt_bind_param($stmt, "i", $age);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$outfitArray = [];
while($row = mysqli_fetch_assoc($result)) {
$searchResults[] = $row;
}
return $searchResults;
}
}
$conn = mysqli_connect($servername, $dBUsername, $dbPassword, $dbName);
if($conn != false) $stmt = mysqli_stmt_init($conn);
print_r(search($stmt, 21));
我的第二个问题是,我使用什么select语句来查看放置偏移量。因此,如果我得到50个结果,该如何获得第40-50个结果。
我的第三个问题是,如何不将搜索结果的数量放入数组或使用循环?然后使用类似count()
的东西来查看有多少项。
答案 0 :(得分:2)
要一次性获取所有数据,可以使用mysqli_fetch_all()
例如
(async () => {
const file_name = window.location.href.split('/').pop();
const country = file_name.split(/\./)[0];
const parent_img = document.querySelector(".pic");
Promise.all(Array.from(
{ length: 8 },
(_, i) => {
const pic_num = ("000" + (i + 1)).slice(-3);
const pic_name = `${country}_${pic_num}.jpg`;
const pic_path = "../images/" + country + "/" + pic_name;
const newImage = new Image();
newImage.src = pic_path;
newImage.alt = pic_name;
return new Promise((resolve, reject) => {
newImage.onload = function() {
console.log(`Found: ${pic_path}`);
resolve(newImage);
}
newImage.onerror = function() {
console.log(`Not Found: ${pic_path}`);
reject();
}
});
}
))
.then((images) => {
images.forEach((image) => {
parent_img.appendChild(image);
});
});
})();
请注意,您需要指定$searchResults = mysqli_fetch_all($result, MYSQLI_ASSOC);
,此功能的默认值为MYSQLI_ASSOC
。
要获取行,例如从41-50开始,您可以在limit clause中使用偏移量:
MYSQLI_NUM
请注意,在没有LIMIT 40, 10
的情况下使用LIMIT
是没有意义的,因为不能保证行的顺序,并且每次执行查询都可能得到不同的结果。您可能需要按ORDER BY
或用户名或类似名称进行订购。
要获取搜索结果的数量,请将查询更改为使用COUNT
:
id