我有一个函数可以根据sql查询将一些行提取到一个数组中。 该数组是从函数返回的,如何遍历返回数组的所有元素? 我是Php的初学者。
function get_user_wants($user_id)
{
$query=mysql_query("select product_id from user_wishlist where user_id= $user_id");
return mysql_fetch_assoc($query);
}
$out=get_user_wants($user_id);
print_r($out);
它只打印第一个元素或第一个记录!
答案 0 :(得分:4)
尝试这样的事情:
$sql = "select product_id from user_wishlist where user_id= $user_id";
$res = mysql_query($sql) or die("FAIL: $sql BECAUSE: " . mysql_error());;
while ($row = mysql_fetch_assoc($res))
{
print_r($row);
}
如果你还没有注意到它,有人会激怒你使用MySQL而不是像MySQLI或PDO这样的东西。不要让他们打扰你。这里的要点是您的查询可能返回许多行,并且您需要某种迭代器来检索所有行,以便您的脚本可以处理它们。
在本例中,每个$ row数组中都会有一个product_id元素。一旦看到print_r()函数的输出,您可能会明白如何更改代码。这可能会成为你想要的(我想)。
function get_user_wants($user_id)
{
$sql = "select product_id from user_wishlist where user_id= $user_id";
$res = mysql_query($sql) or die("FAIL: $sql BECAUSE: " . mysql_error());;
while ($row = mysql_fetch_assoc($res))
{
$out[] = $row['product_id'];
}
return $out;
}
答案 1 :(得分:2)
您将一次调用的结果返回mysql_fetch_assoc()
,因此您只能获得第一行。
循环遍历它们以创建多维数组,然后返回:
function get_user_wants($user_id)
{
$query=mysql_query("select product_id from user_wishlist where user_id= $user_id");
$rows = array();
while($row = mysql_fetch_assoc($query))
{
$rows[] = $row;
}
return $rows;
}
现在您可以使用foreach
$list = get_user_wants(99);
foreach($list as $product)
{
print_r($product);
}
附注:不建议使用mysql_*
库,建议升级到MySQLi或PDO。
答案 2 :(得分:2)
你做不到。该函数仅返回第一个结果。而且没有更多的信息。
所以你需要返回不同的东西,例如结果资源:
function get_user_wants($user_id)
{
$query = mysql_query("select product_id from user_wishlist where user_id= $user_id");
return $query;
}
然后你可以迭代它:
$result = get_user_wants($user_id);
while ($out = mysql_fetch_assoc($result))
{
print_r($out):
}
更好的方法是将结果包装在迭代器中:
function get_user_wants($user_id)
{
$query = mysql_query("select product_id from user_wishlist where user_id= $user_id");
return new MySqlResult($query);
}
$result = get_user_wants($user_id);
foreach ($result as $out)
{
print_r($out):
}
这样的结果迭代器看起来像:
/**
* MySql Result Set - Array Based
*/
class MySqlResult implements Iterator, Countable
{
private $result;
private $index = 0;
private $current;
public function __construct($result)
{
$this->result = $result;
}
public function fetch($result_type = MYSQL_BOTH)
{
$this->current = mysql_fetch_array($this->result, $result_type);
return $this->current;
}
/**
* Return the current element
* @link http://php.net/manual/en/iterator.current.php
* @return array
*/
public function current()
{
return $this->current;
}
public function next()
{
$this->current && $this->fetch();
}
/**
* Return the key of the current element
* @link http://php.net/manual/en/iterator.key.php
* @return mixed scalar on success, or null on failure.
*/
public function key()
{
return $this->current ? $this->index : null;
}
/**
* Checks if current position is valid
* @link http://php.net/manual/en/iterator.valid.php
* @return boolean The return value will be casted to boolean and then evaluated.
* Returns true on success or false on failure.
*/
public function valid()
{
return (bool)$this->current;
}
/**
* Rewind the Iterator to the first element
* @link http://php.net/manual/en/iterator.rewind.php
* @return void Any returned value is ignored.
*/
public function rewind()
{
$this->fetch();
}
/**
* Count of rows.
*
* @link http://php.net/manual/en/countable.count.php
* @return int The count of rows as an integer.
*/
public function count()
{
return mysql_num_rows($this->result);
}
}
答案 3 :(得分:1)
尝试
foreach ($out as $key=>$value)
echo "$key: $value<br>";
作为起点。