Autor Zpráva
fan_dax
Profil *
Dobrý den, potřeboval bych načíst data ze .json souboru a vypsat je v tabulce pomocí PHP metody. Zkušel jsem různé tutoriály na internetu, ale vždycky nastal nějaký problém. Poslední pokus, který jsem teď udělal mi vypsal několik errorů a za nimi kombinaci čísel a písmen, které ani nevím, kde se vzaly. Zkusil jsem dát ukázku mého kódu na kod.djpw.cz, ale zřejmě to neumí PHP (odkaz tady). Tak jsem vytvořil nový FTP účet určený jen pro tento účel s údaji: server - 124299.w99.wedos.net , login - w124299_jakpsatweb , heslo - JakPsatWeb1! . Riziko napadení webu si uvědomuji, proto jsem nastavil oprávnění uživatele jen na možnost zobrazení. Veškerý postup mi prosím pište sem do vlákna. Výstup FTP na webu můžete najít na této adrese.
Radek9
Profil
fan_dax:
Když se pozorně podíváš na strukturu toho JSON souboru, tak uvidíš problém. Pod klíčem "previous" se neskrývá kolekce, ale přímo objekt. Pokud chceš vypsat jen ty klíče, které tímto stringem začínají, tak takto:

<?php
$jsonData = file_get_contents("http://phptest.originalfm.cz/jsontest/json1/test.json");
$json = json_decode($jsonData, true);

echo '<h3>Data</h3>';

$output = "";

foreach($json as $key => $previous)
{
  if (strpos($key, 'previous') !== 0) continue;
  
  $output .= $previous['song_name'];
}

echo $output;
?>
fan_dax
Profil *
Super, funguje to, ještě bych potřeboval nastavit, aby skript každých 20 sekund refreshoval a aktualizoval údaje v případě změny.
Keeehi
Profil
Meta tagy přesměruj stránku samu na sebe a nastav tam 20 sekund.
fan_dax
Profil *
ok, děkuji. Ještě by mě zajímalo, jak nastavit, aby interpret_url bylo odkazem interpreta s tím, že by se otevřelo v novém okně. Jako další by mě zajímalo, jak k previous přidat další objekt - current a jak nastavit, aby se zobrazovala jen data z previous a ne z previous 2-4.
fan_dax
Profil *
Omlovám se, asi jsem to nenapsal srozumitelně. Chtěl bych nastavit, aby interpret_url, který je v JSON souboru byl odkazem na interpret_name, takže zhruba takto:

<a href="interpret_url">interpret_name</a>, toto samozřejmě nelze, protože jsme v PHP, takže jsem to vyřešil takhle:

$output .= '<a href="#" target="blank">'.$current['interpret_name'].'</a>';, zajímalo by mě, co mám doplnit místo #, aby to odkazovalo na interpret_url.
Radek9
Profil
fan_dax:
current a jak nastavit, aby se zobrazovala jen data z previous a ne z previous 2-4
Tak to je ale něco trochu jiného. Původně to vypadalo, že chceš vypsat všechny, které na previous začínají. Pokud chceš vypsat jen určitě klíče, tak třeba takto:
$keys = ['previous', 'current'];
foreach($keys as $key) {
  $item = &$json[$key];
  
  $output .= $item['song_name'];
}

zajímalo by mě, co mám doplnit místo #, aby to odkazovalo na interpret_url.
No přeci vypsat tu danou položku. Stejně jako to děláš u interpret_name. Navíc je vhodné to ošetřit pomocí funkce htmlspecialchars. A taktéž pomocí isset zjistit, zda tam URL vůbec je:
  if (isset($item['interpret_url'])) {
    $output .= '<a href="' . htmlspecialchars($item['interpret_url']) . '" target="_blank">' . $item['interpret_name'] . '</a>';
  }
fan_dax
Profil *
Když jsem script překopíroval a dal pryč previous, který nakonec asi nebudu potřebovat, vznikl mi tento kód, je to správně?


<meta http-equiv="refresh" content="3">
<title>JSONTEST</title>
<?php
$jsonData = file_get_contents("test.json");
$json = json_decode($jsonData, true);
$output = "";
$keys = ['current'];
foreach($keys as $key) {
  $item = &$json[$key];
}

foreach($json as $key => $current)
{
if (strpos($key, 'current') !== 0) continue;
 if (isset($item['interpret_url'])) {
     $output .= $item['song_name'].'<br>';
    $output .= '<a href="' . htmlspecialchars($item['interpret_url']) . '" target="_blank">' . $item['interpret_name'] . '</a>';
  }
echo $output;}
?>
, pokud ano, tak bych ještě chtěl poradit, jak k song_name přidám do <div id="por"> a interpret_name (i s odkazem) přidám do <div id="grep">?
Radek9
Profil
fan_dax:
vznikl mi tento kód, je to správně?
Proboha ne. Doporučuji, aby ses pořádně naučil základy. Předně k čemu jsou cykly atp. Určitě ti dobře poslouží místní učebnice: Péhápko: Učebnice PHP

Pokud potřebuješ vypsat jednu konkrétní položku, tak přece ten cyklus nepotřebuješ:
<?php
$jsonData = file_get_contents("test.json");
$json = json_decode($jsonData, true);
$output = "";

$item = &$json['current'];

$output .= $item['song_name'].'<br>';
$output .= '<a href="' . htmlspecialchars($item['interpret_url']) . '" target="_blank">' . $item['interpret_name'] . '</a>';
 
echo $output;
?>

jak k song_name přidám do <div id="por"> a interpret_name (i s odkazem) přidám do <div id="grep">?
Prostě ty kusy obal. Stejně jako položku interpret_name obaluješ odkazem.
fan_dax
Profil *
Takže kód bude takhle?

<meta http-equiv="refresh" content="3">
<title>JSONTEST</title>
<?php
$jsonData = file_get_contents("test.json");
$json = json_decode($jsonData, true);
$output = "";
 
$item = &$json['current'];
 
$output .= '<div id="por">' .$item['song_name'] .'</div>';
$output .= '<div id="grep"><a href="' . htmlspecialchars($item['interpret_url']) . '" target="_blank">' . $item['interpret_name'] . '</div></a>';
 
echo $output;
?>
Pokud ano, potřeboval bych ještě poslední věc. Chtěl bych tento skript vložit do Drupalové šablony, ale když refreshuji pomocí <meta http-equiv="refresh" content="3">, refreshuje se mi celá stránka, lze nějakým způsobem refreshnout pouze skript?
Radek9
Profil
fan_dax:
Takže kód bude takhle?
Ještě se ti kříží ukončovací značky:
$output .= '<div id="grep"><a href="' . htmlspecialchars($item['interpret_url']) . '" target="_blank">' . $item['interpret_name'] . '</a></div>';

lze nějakým způsobem refreshnout pouze skript?
Pomocí PHP ne. Jde to pomocí JS (ajax), nebo pomocí iframu (kdy vlastně reloaduješ jenom rám).
fan_dax
Profil *
Ukončovací značky jsem upravil a vytvořil nový soubor iframe.php, kam jsem dal následující kód:

<iframe id="hraje" src="index.php"></iframe>
<script>window.onload = function(){
setInterval(function(){
    parent.frames['abradioplay'].location.href = "index.php";
},30);}</script><style> #hraje {border: none; padding: 0px; margin: 0px;}</style>

Je to takhle OK?


Teď jsem si všiml, že to nějak nechce fungovat, jdu hledat dál...
fan_dax
Profil *
Nakonec jsem nějaký script našel a pokusil se ho přizpůsobit, mohlo by to být takhle?
<iframe id="hraje" src="index.php"></iframe>

    <script>
        window.setInterval(function() {
            reloadIFrame()
        }, 10000);

        function reloadIFrame() {
            document.getElementById('hraje').contentWindow.location.reload();
        }
    </script>
    <style> #hraje {border: none; padding: 0px; margin: 0px;}</style>
fan_dax
Profil *
Zdravím, script mi funguje přesně tak, jak má. Narazil jsem ale na věc, která se mi jeví jako nepraktická - v případě, že v souboru json nejsou žádná data, tak to logicky nic nevypíše. Mohl bych poprosit o vytvoření kódu, kde bych si napsal vlastní text a ten by se mi ukazoval v případě žádných dat?

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0