2009-08-28 4 views
3

안녕하세요, 그것은 첫 번째 문자가 DB를 기록1 문자 만 foreach 루프 결과

<?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>'; 
} 
?> 

을 형성 표시 이상한 결과를 얻을이 foreach 루프를 가지고이 내 DB 구조입니다

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가 DB에서 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>'; 
} 

, 당신은 HTML의 어떤 종류를하지 않도록하기 위해, 당신이하고 출력하기하는 데이터를 탈출 할 수 있습니다/자바 스크립트 주입 - 최소한 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의 정수, 자동 증가 또는 그런 일, 너무 많이하지 않습니다 위험) 다른 답변에 코멘트를보고 난 후에


편집

,536,913

$의 데이터 2는 다음과 같이 보이는, 연관 배열입니다 : foreach 문을 의미

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

것이다 루프 세 번 $이 발 될 것 :

int 152 
string 'this is the title' (length=17) 
string 'http://...../' (length=13) 
당신이 먼저 사용으로 63,210

(각각의 반복에 대한 하나 개의 값), $ 브로 배열 스칼라 값이 아니다. 당신이 그렇게하면


:

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

당신이

null 

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

을 수행 할 때 얻을 당신이 얻을 :

string 't' (length=1) 

즉, 문자열의 키와 함께 배열 액세스를 사용할 때 첫 번째 문자 만 가져옵니다.

string 's' (length=1) 


경우 :

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

당신을 가져옵니다


참고 숫자 키 문자열에 해당 배열 액세스, 배열의 한 문자에 액세스하는 데 사용됩니다 자세한 내용은 문자열에 대한 설명서 페이지, 특히 String access and modification by character을 참조하십시오.

문자열 내의

문자 가 를 지정하여 액세스되고 수정 될 수있는 제로 $ str을 [42]에서와 같이 사각 배열 브래킷을 사용하여 문자열 후 원하는 캐릭터의 오프셋. 이 목적으로 문자열을 문자의 배열로 생각하십시오.

그리고 :

정수가 아닌 유형은 정수로 변환됩니다.

'제목'을 정수로 변환하면 0이됩니다. 그래서, 당신은 문자열의 첫 번째 문자를 얻습니다.


희망이 도움이, 나는 동일한 출력으로 고통 "왜";-)

+0

대단히 고마워요! 이것은 많은 것을 설명합니다! – Aviatrix

+1

당신은 환영합니다 :-) (처음으로 문자열의 한 문자 만 가져 오는 문제는 저에게도 이상하게 보였습니다 ^^하지만 완벽하게 정상적인 설명이 있습니다 ^^) 재미있게 놀아 라! –

0

그것은 단지 하나의 resu를 가져과 같이로 MYSQL_ASSOC와 $ 이상의 결과를 반복한다 각 통화에 대한 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을 사용하여 반향을 수행해서는 안되며, –

+0

oops라고 말하고 싶습니다. 복사 붙여 넣기의 나쁜 습관. – Zed

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이 아니라 반향을 수행해야합니다. –

+0

좋은 지적입니다. 수정되었습니다. –

+0

알 겠어. 왜 이럴까? 또는 ould를 편집하려면 어떻게해야합니까? (afcourse 메신저 while 루프를 사용하려고하는데,이 괴상한 일로 인해 오늘 밤 잠을 자지 못합니다.) – Aviatrix