如何搜索数据库并一次性返回整个阵列?

时间:2019-02-09 04:50:45

标签: php mysql database

所以我的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()的东西来查看有多少项。

1 个答案:

答案 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