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);
}

また、まだ気づいていない場合は、MySQLI や PDO などの別のものではなく、MySQL を使用することについて誰かがあなたを非難するでしょう。邪魔させないでください。ここでのポイントは、クエリが多くの行を返す可能性があり、スクリプトがそれらを処理できるように、すべての行を取得する何らかの反復子が必要であるということです。

この場合、各 $row 配列に 1 つの 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):
}

より良い方法は、結果を Iterator でラップすることです。

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 に答える