使用 MySQL 查询中的多行
Working with multiple rows from a MySQL query
在开始之前,我想指出我可以解决我的问题。我已经在 PHP 中进行了充分的排练,以便能够找到我正在尝试做的事情的解决方法。 但是我想把它模块化;没有过多的细节来进一步混淆我的问题,我将简化我正在尝试做的事情,这样它就不会影响我正在做的事情的目的。请记住这一点。
我正在开发一个简单的 CMS 来管理用户数据库并编辑他们的信息。它具有分页功能(有效)和左侧的按钮,您单击该按钮可打开表单以编辑他们的信息并将其提交到数据库(也有效)。
不起作用的是使用非常基本的脚本在 table 中显示 MySQL 的每一行,我不会详细介绍它的工作原理。但它基本上用这个进行数据库查询:
SELECT * FROM users OFFSET (insert offset here) LIMIT (insert limit here)
本质上,对于分页,它告诉要偏移多少数字,限制是每页显示多少用户。这些设置、定义和测试都是准确的,它们确实有效。但是,我不太熟悉如何处理这些结果。
这是第 2 页上针对此 CMS 的示例查询:
SELECT * FROM users OFFSET 10 LIMIT 10
这应该 return 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 达到内存限制 limit/timeout。
如果事情简单,请原谅我。我很少以这种方式处理数据库数据。我想要它做的是显示我请求的 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(使用 class mysqli)重新制作了另一个数据库,并将其重新格式化为 class 扩展mysqli.可以在此处更好地了解完整脚本:
是的,它可以满足我的要求。它查询多行,我可以处理它们,但是我希望使用与我计划使用的方法完全相同的方法。谢谢你的帮助。
我认为你应该使用 mysql_fetch_assoc()
:
<?php
while ($row = $db->query($pagination->get_content())) {
print_r($row);
}
?>
在开始之前,我想指出我可以解决我的问题。我已经在 PHP 中进行了充分的排练,以便能够找到我正在尝试做的事情的解决方法。 但是我想把它模块化;没有过多的细节来进一步混淆我的问题,我将简化我正在尝试做的事情,这样它就不会影响我正在做的事情的目的。请记住这一点。
我正在开发一个简单的 CMS 来管理用户数据库并编辑他们的信息。它具有分页功能(有效)和左侧的按钮,您单击该按钮可打开表单以编辑他们的信息并将其提交到数据库(也有效)。
不起作用的是使用非常基本的脚本在 table 中显示 MySQL 的每一行,我不会详细介绍它的工作原理。但它基本上用这个进行数据库查询:
SELECT * FROM users OFFSET (insert offset here) LIMIT (insert limit here)
本质上,对于分页,它告诉要偏移多少数字,限制是每页显示多少用户。这些设置、定义和测试都是准确的,它们确实有效。但是,我不太熟悉如何处理这些结果。
这是第 2 页上针对此 CMS 的示例查询:
SELECT * FROM users OFFSET 10 LIMIT 10
这应该 return 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 达到内存限制 limit/timeout。
如果事情简单,请原谅我。我很少以这种方式处理数据库数据。我想要它做的是显示我请求的 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(使用 class mysqli)重新制作了另一个数据库,并将其重新格式化为 class 扩展mysqli.可以在此处更好地了解完整脚本:
是的,它可以满足我的要求。它查询多行,我可以处理它们,但是我希望使用与我计划使用的方法完全相同的方法。谢谢你的帮助。
我认为你应该使用 mysql_fetch_assoc()
:
<?php
while ($row = $db->query($pagination->get_content())) {
print_r($row);
}
?>