2011-08-09 69 views
2

好吧,我有以下代码:mysql_fetch_array只返回一行

$array = mysql_query("SELECT artist FROM directory WHERE artist LIKE 'a%' 
     OR artist LIKE 'b%' 
     OR artist LIKE 'c%'"); 
    $array_result= mysql_fetch_array($array); 

然后,当我尝试呼应的内容,我也只能随声附和$array_result[0];,它输出的第一个项目,但如果我尝试回声$array_result[1];我得到一个未定义的偏移量。

但是,如果我通过PHPMyAdmin运行上述查询,它将返回一个包含10个项目的列表。为什么这不被识别为10个项目的数组,允许我回显0-9?

感谢您的帮助。

+0

我知道'%'是通常的通配符,但是您是否尝试过使用'*'来代替? – JMichelB

回答

17

这是因为数组表示返回的结果集中的单个行。您需要再次执行mysql_fetch_array() function以获取下一条记录。例如:

while($data = mysql_fetch_array($array)) { 
    //will output all data on each loop. 
    var_dump($data); 
} 
+0

谢谢一堆。 奇怪的是,当我使用它时,它并没有得到第一行数据的值。即说第一个艺术家是苹果,第二个是香蕉,第三个是香瓜。 当我var转储,它只是香蕉 - >香瓜 - >等,没有苹果。 – Ando

+0

@Ando:当你使用PMA(PhpMyAdmin)时它会得到'apple'吗?可能是:(1)您的php生成的SQL查询不会适当地过滤记录。 (2)你不是'ORDER BY',而是'LIMIT',因此在过滤时可能会留下'apple'的记录。 – Dor

+0

我的SQL查询确实带回了Apple,并且我执行了ORDER BY艺术家ASC。有什么特别的是,如果我ORDER BY desc,那么它显示苹果在底部,但它是缺少应该是第一个项目...非常奇怪 – Ando

4

您应该使用while来获取所有数据。

$array_result = array(); 
while ($row = mysql_fetch_array($array, MYSQL_NUM)) { 
    $array_result[] = $row; 
} 
echo $array_result[4]; 
+1

无论如何,数据都存储在PHP的内存空间中。复制该数据通常是无用的。 – Dor

+0

@我没有看到如何将数据移入数组无用。你还有什么要访问数据?假设你需要这两行,你不能在while循环的同一次迭代中获得它们,所以首先将数据复制到一个可用数组将是一个好主意。 –

+0

@DaveChen我认为你是对的。这感觉像是一个PHP的缺点。 – Anthony

1

我更喜欢使用此代码:

$query = "SELECT artist FROM directory WHERE artist LIKE 'a%' 
     OR artist LIKE 'b%' 
     OR artist LIKE 'c%'";   
$result = mysql_query($query) or die(mysql_error()); 


while(list($artist) = mysql_fetch_array($result)) 
{ 
echo $artist; 
} 

如果你添加更多的字段来查询只需添加更多变数列表($艺术家,$ FIELD1,$场2等。 )
我希望它有帮助:)

+0

或者:while($ data = mysql_fetch_assoc($ result)){extract($ data); /*...*/}'。请参阅:http://php.net/manual/en/function.extract.php – Dor