Как извлечь одно значение из значения столбца таблицы базы данных в кодировке json в Joomla? - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь получить URL-адрес изображения из Joomla через PHP / Sql Query. Это многомерный массив или объект, но я не могу получить второе измерение.

Какой это тип данных? Я должен преобразовать это как-то? Я уже пробовал "loadAssocList ()" и "loadObjectList ()", но оба дают мне странные данные.

Как мне преобразовать его в многомерный массив или, что еще лучше, получить доступ к значению $r[images][intro_image]? И почему там сбежали слэши?

Joomla DB Query, как в документации:

<code>$db = JFactory::getDbo();
$id = 9; //example
$query = $db->getQuery(true);
$query->select('*');
$query->from('#__content');
$query->where('catid="'.$id.'"');

$db->setQuery((string)$query);
$res = $db->loadAssocList();
?>
<?php foreach($res as $r): ?>
<pre>
<?php print_r($r); ?>
<? php endforeach; ?>

Массив ответов PHP:

[fulltext] => 
    [state] => 1
    [catid] => 9
    [created] => 2018-09-10 20:45:29
    [created_by] => 165
    [created_by_alias] => 
    [modified] => 2018-09-14 08:28:52
    [modified_by] => 165
    [checked_out] => 165
    [checked_out_time] => 2018-09-14 08:32:10
    [publish_up] => 2018-09-10 20:45:29
    [publish_down] => 0000-00-00 00:00:00
    [images] => {"image_intro":"images\/thumb_2017-28-04-Taspo.jpg","float_intro":"","image_intro_alt":"","image_intro_caption":"","image_fulltext":"images\/thumb_2017-28-04-Taspo.jpg","float_fulltext":"","image_fulltext_alt":"","image_fulltext_caption":""}
    [urls] => {"urla":"\/images\/\/Presseartikel\/2017-28-04-Taspo-optimiert.pdf","urlatext":"","targeta":"","urlb":false,"urlbtext":"","targetb":"","urlc":false,"urlctext":"","targetc":""}
    [attribs] => {"article_layout":"","show_title":"","link_titles":"","show_tags":"","show_intro":"","info_block_position":"","info_block_show_title":"","show_category":"","link_category":"","show_parent_category":"","link_parent_category":"","show_associations":"","show_author":"","link_author":"","show_create_date":"","show_modify_date":"","show_publish_date":"","show_item_navigation":"","show_icons":"","show_print_icon":"","show_email_icon":"","show_vote":"","show_hits":"","show_noauth":"","urls_position":"","alternative_readmore":"","article_page_title":"","show_publishing_options":"","show_article_options":"","show_urls_images_backend":"","show_urls_images_frontend":""}
    [version] => 5

Мне нужно прочитать данные из этой части массива:

{"image_intro":"images\/thumb_2017-28-04-Taspo.jpg","float_intro":"","image_intro_alt":"","image_intro_caption":"","image_fulltext":"images\/thumb_2017-28-04-Taspo.jpg","float_fulltext":"","image_fulltext_alt":"","image_fulltext_caption":""}

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

У меня есть несколько моментов, которые нужно сделать.

Поскольку вы хотите получить доступ только к значению image_intro для выбранной строки, вам следует запросить именно это - в качестве наилучшей практики.

  1. Назначьте images в качестве целевого столбца из таблицы #__content и приведите ваше значение $id к целому числу, если эта переменная передается из небезопасного ресурса (например, данные, отправленные пользователем)).

  2. loadResult () - лучший вызов для доступа к значению (один столбец и одна строка) в наборе результатов.

  3. Хорошей привычкой является встроенная система обнаружения ошибок (try{}catch{}) и отображения контрольных точек для целей отладки.Только будьте осторожны, чтобы не показывать фактические сообщения об ошибках php конечному пользователю, потому что плохие люди могут делать зловещие вещи с этой обратной связью высокого значения.

  4. Значение, которое возвращается в результатенабор на самом деле является объектом JSON.Чтобы получить доступ к значению внутри по его ключу, вы должны сначала декодировать значение в массив или объект php. json_decode () - правильный вызов для этой задачи.Если вы передадите функции значение json без второго параметра, будет сгенерирован массив объектов, и доступ к значению image_intro осуществляется с синтаксисом ->image_intro.Если вы используете true в качестве второго параметра, будет сгенерирован массив и должен использоваться синтаксис ["image_into"].

Код:

$id = 9;  // assumed to be insecure, so casting with (int) is done in snippet
try {
    $db = JFactory::getDbo();
    $query = $db->getQuery(true)
                ->select("images")
                ->from("#__content")
                ->where("catid = " . (int)$id);
    echo $query->dump();
    $db->setQuery($query);
    if (!$result = $db->loadResult()) {  // declare $result and check for falsey value
        echo "Sorry no row found @ id = " , (int)$id;
    } else {
        echo "Image Intro = " , json_decode($result)->image_intro;
    }
} catch (Exception $e) {
    echo  "Syntax Error: " , $e->getMessage();  // never show getMessage() details to the public
}

приведенный выше фрагмент отобразит встроенный запрос и желаемый результат: (это будет ваш дБ префикс)

ВЫБРАТЬ изображения ИЗ lmnop_content ГДЕ catid = 9

Изображение Введение= images / thumb_2017-28-04-Taspo.jpg


ps Если вам нужна поддержка Joomla, пожалуйста, оставьте свой вопрос на Joomla Stack Exchange .Именно здесь команда Joomla хочет, чтобы вы публиковали сообщения для лучшей поддержки сообщества.

Вы можете или не можете заметить, что в разделе administrator вашего сайта есть Справка вкладка и 2-й последний элемент раскрывающегося списка: Stack Exchange <- это приведет вас непосредственно к JSE. </p>

0 голосов
/ 14 сентября 2018

Изображения в формате JSON, поэтому сначала необходимо декодировать эти данные.

$images = json_decode($r['images']);
print_r($images);

, затем вы можете получить доступ к image_intro, используя следующий код -

$images->image_intro;
...