2009-08-28 19 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を直接使うことができます。


1行ずつ移動したい場合は、$ 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/JavaScriptの注入のいずれかの種類を持っていないことを確認するために、あなたがoutputingされているデータをエスケープすることができます - 少なくとも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の整数、自動インクリメントまたはそのような何か、それほどではありませんリスク)別の答えにコメントを見た後


編集

あなたが最初に使用したものでは

int 152 
string 'this is the title' (length=17) 
string 'http://...../' (length=13) 
:foreachのがループ3回、そして$ valがあることを意味し、どの

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

の$ DATA2は、次のようになり連想配列であり、すなわち

(反復ごとに一つの値)、$ valが配列がスカラー値ではありません。


あなたがそれを行うとき:

string 't' (length=1) 
012:

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

をあなたは

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

を行うとき、あなたが得る

null 

を取得

つまり、文字列のキーを使用して、文字列に対して配列アクセスを使用する場合は、最初の文字のみを取得します。

string 's' (length=1) 


の場合:

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

はあなたを取得します。


注数字キーで文字列にその配列アクセス、配列の1つの文字にアクセスするために使用されます詳細については、文字列に関するマニュアルページ、特にString access and modification by characterを参照してください。

ストリング内

文字は$列str [42]のように、 正方形アレイブラケットを使用して文字列の後に、所望の 文字のオフセット ベースゼロを指定することによって にアクセスし、修正することができます。 この目的のために、文字列を 文字の配列と考えてください。

そして:

非整数型は 整数に変換されます。

'title'を整数に変換すると0になります。だから、あなたは文字列の最初の文字を取得します。


・ホープ、このことができます、と私は同じ出力に苦しん「なぜ」;-)

+0

ありがとう!これはたくさん説明します! – Aviatrix

+1

あなたは大歓迎です:-)(文字列の1文字しか取得できなかったのは初めてですが、それは私にとっても奇妙に思えました^^しかし完璧な説明があります^^)楽しくてください! –

0

それは一つだけRESUをフェッチとしてあなたはは、mysql_fetch_arrayと$以上の結果を反復処理する必要があります各呼び出しのための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は1つのレコードだけを取得することで、複数のレコードを取得するためには複数回呼び出す必要があることです。フェッチするレコードがなくなると、最終的にFALSEを返します。

+0

次に、$ data2を使ってエコーを行い、$ valではなく(コードサンプルのどこにでも初期化されていない) –

+0

良い点。編集されました! –

+0

私はこれを得るが、なぜそれぞれがうまくいかないのか?どのように私はそれを編集する必要がありますか? (今はwhileループを使うつもりですが、この奇妙なことは今夜寝ることはありません) – Aviatrix

関連する問題