2009-08-28 32 views
3

你好,我有這樣的foreach循環,讓怪異的結果,它顯示的第一個字符組成的數據庫記錄1個字符只有foreach循環結果在PHP

<?php 
$result2 = mysql_query("SELECT id,fp_thumb,title FROM media") or die(mysql_error()); 
$data2 = mysql_fetch_array($result2) or die(Mysql_error()); 

foreach ($data2 as $val) { 

    echo '<li><a href="media.php?id='.$val['id'].'"><img src="'.$val['fp_thumb'].'" alt="'.$val['title'].'" /></a></li>'; 
} 
?> 

,這是我的數據庫結構

SET FOREIGN_KEY_CHECKS=0; 
-- ---------------------------- 
-- Table structure for media 
-- ---------------------------- 
CREATE TABLE `media` (
    `id` int(11) NOT NULL auto_increment, 
    `thumb` varchar(500) NOT NULL, 
    `url` varchar(500) NOT NULL, 
    `fp_thumb` varchar(500) NOT NULL, 
    `title` varchar(500) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

-- ---------------------------- 
-- Records 
-- ---------------------------- 
INSERT INTO `media` VALUES ('1', '22', 'http://goeshere.com', '/images/slideshow/ctmbs.jpg', 'Test 1'); 
INSERT INTO `media` VALUES ('2', '2', 'http://goeshere1.com', '/images/slideshow/hitlex.jpg', 'test 2'); 
INSERT INTO `media` VALUES ('3', '3 ', 'http://goeshere2.com', '/images/slideshow/tsord.jpg', 'test 3'); 

任何信息將是有益的 提前感謝和歡呼聲^^

回答

4

從代碼中,我會說$data2代表數據庫中的1行數據。

因此,它應該是$data2,它包含您想要顯示的內容。

你的foreach循環沒用:如果你想顯示1行的數據,你可以直接使用$data2


如果你想一行一行地去,你不能遍歷$ data2,但是在mysql_fetch_array返回數據的時候循環。

這樣的事情,我會說:

$result2 = mysql_query("SELECT id,fp_thumb,title FROM media") or die(mysql_error()); 
while ($data2 = mysql_fetch_array($result2)) { 
    echo '<li><a href="media.php?id='.$data2['id'].'"><img src="'.$data2['fp_thumb'].'" alt="'.$data2['title'].'" /></a></li>'; 
} 

此外,您可能想逃離你的outputing的數據,以確保你沒有任何類型的HTML/JavaScript注入 - 至少在src和title中,我會說;對於這一點,你可以用htmlspecialchars

您的迴音會的話,大概是這樣的:

echo '<li><a href="media.php?id=' 
    . $data2['id'] 
    . '"><img src="' 
    . htmlspecialchars($data2['fp_thumb']) 
    . '" alt="' 
    . htmlspecialchars($data2['title']) 
    . '" /></a></li>'; 

(我認爲ID是一個整數,自動遞增或類似的東西,所以沒有太多的風險)看到另一個答案的評論後


編輯

隨着你第一次使用了什麼:

$ DATA2是一個關聯數組,看起來像這樣:

array 
    'id' => int 152 
    'title' => string 'this is the title' (length=17) 
    'fp_thumb' => string 'http://...../' (length=13) 

這意味着在foreach將循環三次,$ VAL將是:

int 152 
string 'this is the title' (length=17) 
string 'http://...../' (length=13) 

(對於每次迭代的一個值)

即$ val爲不是數組是標量值。


當你做到這一點:

$a = 152; 
var_dump($a['id']); 

null 

在做

$a = 'this is the title'; 
var_dump($a['id']); 

你:

string 't' (length=1) 

即,只有在字符串上使用數組訪問時,您纔會獲得第一個字符,並且該字符串是一個鍵。


註上一個字符串數組訪問,與數字鍵,用於訪問數組的一個字符:

$a = 'this is the title'; 
var_dump($a[3]); 

讓你:

string 's' (length=1) 


對於更多信息,請參見有關字符串的手冊頁,尤其是String access and modification by character,其中指出:

串內

性狀可以是 通過指定 訪問和修改從零開始使用 正方形陣列括號後的字符串所需 字符的偏移,如在$ STR [42]所述。 爲此目的,可以將字符串看作爲 個字符的數組。

和:

非整數類型被轉換爲 整數。

並轉換 '標題' 的整數給出0;所以,你得到了字符串的第一個字符。


希望這有助於你理解「爲什麼」 ;-)

+0

非常感謝您!這解釋了很多! – Aviatrix 2009-08-28 21:15:20

+1

不客氣:-)(我第一次遇到只有一個字符串的問題時,我也覺得很奇怪^^但是有一個完全理智的解釋^^)玩得開心! – 2009-08-28 21:17:14

0

你應該遍歷$結果與mysql_fetch_array因爲它僅取一個RESU LT每個呼叫:

while ($val = mysql_fetch_array($result2, MYSQL_ASSOC)) { 
    echo '<li><a href="media.php?id='.$val['id'].'"><img src="'.$val['fp_thumb'].'" alt="'.$val['title'].'" /></a></li>'; 
} 
+0

$ data2將是包含當前行數據的變量,而不是$ val =>這裏不應該使用$ val來做回顯,我會說 – 2009-08-28 20:50:38

+0

oops。複製粘貼的壞習慣。 – Zed 2009-08-28 20:52:05

2

我認爲你正在試圖做的是這樣的:

$result2 = mysql_query("SELECT id,fp_thumb,title FROM media") or die(mysql_error()); 

while($data2 = mysql_fetch_array($result2)) { 
    echo '<li><a href="media.php?id='.$data2['id'].'"><img src="'.$data2['fp_thumb'].'" alt="'.$data2['title'].'" /></a></li>'; 
} 
?> 

這將顯示所有的表中的記錄。那是你想要做什麼?

這裏重要的一點是,mysql_fetch_array只能檢索一條記錄,並且您需要多次調用它才能檢索多條記錄。當沒有更多記錄要提取時,它最終會返回FALSE。

+0

然後,他應該使用$ data2做回顯,而不是$ val(未在代碼示例中的任何位置初始化) – 2009-08-28 20:49:56

+0

好點。編輯! – 2009-08-28 20:50:29

+0

好吧,我得到這個,但爲什麼每個不會工作?或者我該如何編輯它才能工作? (afcourse即時通訊將使用while循環,但是,這種奇怪的事情不會讓我今晚睡) – Aviatrix 2009-08-28 20:54:50