我的db类
中有这个方法public function query($queryString)
{
if (!$this->_connected) $this->_connectToDb(); //connect to database
$results = mysql_query($queryString, $this->_dbLink) or trigger_error(mysql_error());
return mysql_num_rows($results) > 0 ? mysql_fetch_assoc($results) : false;
}
这适用于返回1行的查询,但是如何才能返回这样的数组呢?
$array[0]['name'] = 'jim'
$array[0]['id'] = 120
$array[1]['name'] = 'judith'
$array[1]['ID'] = 121
现在我知道我可以使用while循环将这些数据插入到数组中,但是我想知道PHP是否可以使用内部函数执行此操作?我无法在文档中找到我所追求的内容。
我不希望在方法中运行while的原因是因为我将在返回时重复数组,并且我不想两次运行结果(出于性能原因)。 / p>
有办法做到这一点吗?我的常规查询方法设计有问题吗?
非常感谢!
答案 0 :(得分:4)
public function query($queryString)
{
if (!$this->_connected) $this->_connectToDb(); //connect to database
$results = mysql_query($queryString, $this->_dbLink) or trigger_error(mysql_error());
$data = array();
while($row = mysql_fetch_assoc($results))
{
$data[] = $row;
}
return $data;
}
这将始终返回一个数组。
编辑: 我没有很好地阅读这个问题。 如果你真的不想使用循环,那么我会这样做:
public function query($queryString)
{
if (!$this->_connected) $this->_connectToDb(); //connect to database
return mysql_query($queryString, $this->_dbLink) or trigger_error(mysql_error());
}
然后循环它,但我只是使用循环。
答案 1 :(得分:2)
您可能还想查看PDO扩展程序。您可以将整个结果集加载到数组中,也可以使用foreach循环。
<?php
$db = new PDO($connection_string, $username, $password);
$result = $db->query($queryString);
foreach($result as $row) {
// do something
}
// or
$result = $db->query($queryString);
$result_array = $result->fetchAll(PDO::FETCH_ASSOC);
?>
答案 2 :(得分:1)
大多数人在查询中使用while()
循环来完成您想要的操作,然后遍历数组来处理它。
然而,你是对的:它浪费了内存,这可能是一个大数据集的问题。另一种方法是让查询方法返回结果集资源。然后你的while循环可以使用它来获取它所需的每一行。
为了抽象出来,我会建议另一个班为你做这件事。然后,您的查询调用将返回该类的新实例,该实例将MySQL结果集资源作为实例变量并打包mysql_fetch_assoc()
调用。
答案 3 :(得分:0)
查看PEAR::MDB2(Quickstart Cheatsheet)。它提供了许多不同的功能来做这样的事情。它也不会限制你使用MySQL特定的函数,因为它是一个数据库抽象层。
$ result = $ db-&gt; queryRow($ query,MDB2_FETCHMODE_ASSOC);
还有其他抽象层,如ADO。
答案 4 :(得分:0)
感谢您的想法。我有一个函数从sql返回一个关联数组(在Moodle中使用)。
$ results = get_records_sql($ sql);
//to create a numerically indexed array:
$data = array();
foreach ($results as $row)
{
$data[] = $row;
}
return $data;
}