【问题标题】:Working with multiple rows from a MySQL query处理来自 MySQL 查询的多行
【发布时间】:2015-09-04 17:33:12
【问题描述】:

在开始之前,我想指出我可以解决我的问题。我已经在 PHP 中进行了足够多的排练,以便能够找到我正在尝试做的事情的解决方法。 然而我想让它模块化;在不进行太多细节以进一步混淆我的问题的情况下,我将简化我正在尝试做的事情,这样它就不会减损我正在做的事情的目的。请记住这一点。

我正在开发一个简单的 CMS 来管理用户数据库并编辑他们的信息。它具有分页功能(有效)和左侧的按钮,您可以单击该按钮打开表单以编辑其信息并将其提交到数据库(也有效)。

不能使用非常基本的脚本在表中显示 MySQL 中的每一行,我不会详细介绍它的工作原理。但它基本上是这样进行数据库查询的:

SELECT * FROM users OFFSET (insert offset here) LIMIT (insert limit here)

本质上,分页告诉我们要偏移多少个数字,限制是每页显示多少用户。这些设置、定义和测试是准确的,它们确实有效。但是,我不太熟悉如何处理这些结果。

这是第 2 页上针对此 CMS 的示例查询:

SELECT * FROM users OFFSET 10 LIMIT 10

这应该在数据库中返回 10 行、10 个用户。它确实如此,当我在命令提示符下尝试这个命令时,它给了我我需要的东西:

但是当我尝试像这样在 PHP 中处理这些数据时:

<?php
    while ($row = $db->query($pagination->get_content(), "row")) {
        print_r($row);

    }
?>

$db->查询方法是:

public function query($sql, $type = "assoc") {
    $this->last_query = $sql;
    $result = mysql_query($sql, $this->connection);
    $this->confirm_query($result);

    if ($type == "row") {
        return mysql_fetch_row($result);
    } elseif ($type == "assoc" || true) {
        return mysql_fetch_assoc($result);
    } elseif ($type == "array") {
        return mysql_fetch_array($result);
    } elseif ($type == false) {
        return $result;
    }
}

$pagination->get_content 方法是:

    public function get_content() {
        global $db;

        $query = $this->base_sql;

        if (!isset($_GET["page"])) {
            $query .= " LIMIT {$this->default_limit}";
            return $query;
        } elseif (isset($_GET["page"]) && $_GET["page"] == 1) {
            $query .= " LIMIT {$this->default_limit}";
            return $query;
        } elseif (isset($_GET["page"])) {
            $query .= " LIMIT {$this->default_limit}";
            $query .= " OFFSET " . (($_GET["page"] * $this->default_limit) - 10);
            return $query;
        }
    }

我的 while 循环结果(应该打印出数据库的每一行,不是吗?)每次都给我相同的行,一直持续到 PHP 达到内存限制/超时限制。

如果它很简单,请原谅我。我很少以这种方式处理数据库数据。我想要它做的是显示我请求的 10 个用户。欢迎随时提出任何问题。

在一些评论之后,我决定切换到 MYSQLI 功能并且它可以工作

    // performs a query, does a number of actions dependant on $type
public function query($sql, $type = false) {
    $sql = $this->escape($sql);

    if ($result = $this->db->query($sql)) {
        if ($type == false) {
            return $result;
        } elseif ($type == true || "assoc") {
            if ($result->num_rows >= 2) {
                $array;
                $i = 1;

                while ($row = $result->fetch_assoc()) {
                    $array[$i] = $row;
                    $i++;
                }

                return $array;
            } elseif ($result->num_rows == 1) {
                return $result->fetch_assoc();
            }
        } elseif ($type == "array") {
            if ($result->num_rows >= 2) {
                $array;
                $i = 1;

                while ($row = $result->fetch_array()) {
                    $array[$i] = $row;
                    $i++;
                }

                return $array;
            } elseif ($result->num_rows == 1) {
                return $result->fetch_array();
            }
        }
    } else {
        die("There was an error running the query, throwing error: " . $this->db->error);
    }
}

基本上,简而言之,我将整个数据库删除,然后根据 OOD mysqli(使用类 mysqli)重新制作另一个数据库,并将其重新格式化为扩展 mysqli 的类。可以在这里找到更好的完整脚本:

http://pastebin.com/Bc00hESn

是的,它做我想做的事。它查询多行,我可以处理它们,但是我希望使用与我计划执行它们的方法完全相同的方法。谢谢你的帮助。

【问题讨论】:

  • mysql_* 再次运行......来吧人们:(
  • 我假设您对我使用“mysql_fetch_row”和其他人的评论?好吧,如果您要这么说,至少告诉我,如果它确实有所作为,我应该使用 mysqli 版本。从我到目前为止所做的事情来看,我从来没有真正需要使用更新的功能。
  • limit start_rows,rows_to_fetch。您只需继续运行相同的查询,获取第一个 $this-&gt;default_limit 行。你需要增加那个值,所以你正在获取limit $current_page,$this-&gt;default_limit
  • 但是你仍然要为每一行运行一个查询 - 这将是每一个效率低下
  • 如果可以的话,你应该stop using mysql_* functions。它们不再被维护并且是officially deprecated。改为了解 prepared statements,并考虑使用 PDO,it's really not hard

标签: php mysql database pagination


【解决方案1】:

我认为你应该使用mysql_fetch_assoc():

<?php
    while ($row = $db->query($pagination->get_content())) {
        print_r($row);
    }
?>

【讨论】:

  • billy 是正确的,如上所述,mysql_fetch_row 只返回一行
  • 是的,我记得尝试 fetch_assoc,但没有运气。给我一点时间,我马上重新测试。
  • 是的,我曾尝试使用 fetch_assoc,但会加载页面。不完全确定为什么会这样,但我认为我最好的办法是重构我的数据库如何完全工作。从大家所说的使用 mysql_ 函数来看,显然 mysqli 或 PDO 是要走的路。至于我为什么用mysql_函数,多半是习惯?
  • 我无法想象这不起作用。要遍历行,您需要使用mysql_fetch_assoc()mysql_fetch_array()。前者为您提供字段名称 - 唯一的缺点是重复的列名称不起作用。
  • “加载页面”是什么意思?
猜你喜欢
  • 2017-12-15
  • 2012-07-05
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多