1-символьный результат цикла foreach в PHP - PullRequest
3 голосов
/ 29 августа 2009

Здравствуйте, у меня есть цикл 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>';
}
?>

и это моя структура БД

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 ]

4 голосов
/ 29 августа 2009

Из кода я бы сказал, что $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>';
}

Кроме того, вы можете захотеть избежать данных, которые вы выводите, чтобы убедиться, что у вас нет какой-либо инъекции 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)


Для получения дополнительной информации см. Страницу руководства о строке, особенно Доступ к строке и ее модификация с помощью символа , в котором указано:

Символы в строках могут быть доступ и изменение путем указания смещение нуля желаемого символ после строки с помощью квадратные скобки, как в $ str [42]. Думайте о строке как о массиве символы для этой цели.

А:

Нецелые типы преобразуются в целое число.

И преобразование 'title' в целое число дает 0; Итак, вы получите первый символ строки.


Надеюсь, это поможет, и вы поняли «почему»; -)

2 голосов
/ 29 августа 2009

Я думаю, что вы пытаетесь сделать это:

$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 голосов
/ 03 января 2018

Я страдал от того же выхода. Позже обнаружил ошибку, которую я сделал. Я инициализировал ту же переменную до того как строку. Использование новой переменной решило проблему. Помощь найдена на: http://www.sitepoint.com/forums/showthread.php?259452-Only-outputting-first-character-of-array

0 голосов
/ 29 августа 2009

Вы должны перебрать результаты $ с помощью mysql_fetch_array, поскольку он выбирает только один результат для каждого вызова:

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>';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...