-2

我有一个关于 mysql 和 PDO 的问题。我已经给自己一个任务,如何开始使用 PDO 而不是旧的 mysql* PHP 函数。

解释起来有点困难,但我想让网站尽可能高效(无论如何从 PHP 的角度来看)。我找到了一堆关于 MySQL PDO 的好教程,但我还没有成功地找到解决方案。

假设我想定期查询各种表以获取它们包含的所有数据;为此,我打算使用一个参数设置一个函数 - 要查询的表的名称: 像这样:

function getData($table)
{
    global $db;
    $SQL_query = "SELECT * FROM $table";
    $statement = $db->query($SQL_query);
    $result = $statement->fetch(PDO::FETCH_NUM);
    return $result;
}

这很好用;但是该函数仅返回表的第一“行”。现在的问题是;如何使函数返回所有行?我可以尝试这样的事情:

function getData($table)
{
    global $db;
    $SQL_query = "SELECT * FROM $table";
            $statement = $db->query($SQL_query);
            while ($row = $statement->fetch(PDO::FETCH_NUM)
    {
    return $result;
            }
}

如果有任何提示/建议等,我将不胜感激......如果有这种期望行为的最佳实践?

4

2 回答 2

1

答案是您可能不想返回表的所有行。将语句句柄返回给调用者进行迭代可能会更好。否则,当您实际上可能不需要在程序中执行此操作时,您会将整个表加载到内存中。如果您的所有表都没有那么多数据,这可能不是问题,但一旦您开始在更大的表上执行此操作,肯定会占用内存。

例如,如果您要将整个表数据简单地输出到浏览器客户端,假设您有一个表,该表有 1000 行,每行平均 1kB 数据。如果您使用您的方法,则必须将 1MB 的数据读入内存,而如果让调用者遍历结果集,则只需在内存中平均保留 1 kB 的数据。

于 2013-05-22T22:20:26.277 回答
1

你对这个函数的想法是完全错误的。

正如 Mike Brant 所说,从表中选择所有数据是没有意义的——您可能会将数据库与平面文件混淆。SQL 的强大功能触手可及,不使用它就是犯罪!

因此,让您的函数接受SQL 查询和它的参数,以便按照 PDO 的要求进行绑定。

function getData()
{
    $global $db;
    $params = func_get_args();
    $query = array_shift($args);

    $stmt = $db->prepare($query);
    $stmt->execute($params);
    return $stmt->fetchAll();
}

现在你可以像这样使用它

$rows = getData("SELECT * FROM t WHERE cat=?",$category);

整洁,嗯?

这将是非常有用且方便的功能。

于 2013-05-23T05:53:55.930 回答