2

我有一个函数可以根据 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);

它只打印第一个元素或第一条记录!

4

4 回答 4

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;
}
于 2012-12-30T17:52:34.373 回答
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。

于 2012-12-30T17:54:04.147 回答
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);
    }
}
于 2012-12-30T17:54:09.680 回答
1

尝试

foreach ($out as $key=>$value) 
  echo "$key: $value<br>";

作为起点。

于 2012-12-30T17:51:33.513 回答