Autor Zpráva
tmvitek
Profil *
Zdravím, jellikož jsem v javascriptu v životě nic nedělal, ale teď ho bohužel nutně potřebuji využít pro jeden můj nápad, tak bych potřeboval poradit. Z databáze MYSQL načtu data, v ní mám tabulku, ta má zatím 2 sloupce. Pak to potřebuji dostat do proměných do javacriptu, ale v javascriptu se mi vypíše pouze první sloupec - jmeno tabulky, druhý - adresa mi vypíše hodnotu null. Když však přes echo v php vypíšu druhý sloupec, tak mi to vypíše správnou hodnotu. Čím to prosím může být? Díky Tomáš

include ("./spojeni_databaze.php");
$databaze=neco;
$q = mysql_query("SELECT * FROM tabulka  ORDER BY adresa LIMIT 3") or die(mysql_error());

echo "Seznam adres";
while($data=mysql_fetch_array($q)){ 
echo $data["adresa"];
?>

<script>
var data = <? echo json_encode($data) ?>;

document.write(data["jmeno"]);
document.write(data["adresa"]);
</script>
RockFire
Profil
A v PHP už jsi něco dělal? Jsou tam hrubé chyby, např. while není uzavřený. Jinak tato proměnná bude fungovat jen v rámci toho cyklu.
tmvitek
Profil *
V php jakž takž něco, pardon, že while není uzavřený, zapoměnl jsem to dokopírovat. Ukončerný to má být až úplně na konci. ... S tím, že to bude fungovat jen v rámci cyklu počítám, stačí mi když mi to prostě vyípíše i jméno i adresu a né pouze jméno a null.
peta
Profil
tmvitek:
Povídání o živých ukázkách
www prohlizec FF - ctrl + u (zobrazit zdrojovy kod webove stranky) - to je vystup z php, ten je pro reseni dulezity, za predpokladu, ze mas spravne php. Pokud ne, pak je dulezity puvodni php a i html z prohlizece.

<script>
var data = <? echo json_encode($data) ?>;
 
document.write(data["jmeno"]);
document.write(data["adresa"]);
</script>

pokud to vygeneruje html kod
<script>
var data = {"jmeno":1,"adresa":2};
document.write(data["jmeno"]);
document.write(data["adresa"]);
</script>
pak to vypise 12. Bez te vyznacene casti, co jsi sem nedal, je problem jen ve hvezdach. Tipuji, ze mas problem v php nebo chybne zapsany nejaky dalsi kod. Zkus z toho udelat jednoduchy priklad uplne stejny, jako davas do fora, otestuj jeho funkcnost (viz problem s tim while).
(pod radek 7 bych dal mozna var_dump($data); )
Sir Tom
Profil
tmvitek:
stačí mi když mi to prostě vyípíše i jméno i adresu a né pouze jméno a null.
Na to není potřeba javascript, ale prosté

$result = mysql_query("SELECT jmeno, adresa FROM tabulka ORDER BY adresa LIMIT 3");
 
echo "Seznam adres:";
while(list($jmeno, $adresa)=mysql_fetch_array($result)){ 
   echo $jmeno;
   echo $adresa;
?>

PHPkem vypíšeš přímo obsah a nemusíš ho cpát do proměnné v JS - zaleží, ale na situaci - třeba tu JS proměnnou data potřebuješ k něčemu dalšímu...
tmvitek
Profil
peta:

Kód je prakticky on až na hlavičku atp., php předpokládám, že mám dobře, jelikož když to, co potřebuji vypíšu pomocí echo, tak není problém. Avšak když to chci vypsat pomocí JS, tak už mi to nefakčí :( Ještě jednou teda vložím celý kód.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  

  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <meta name="generator" content="PSPad editor, www.pspad.com">
  <title></title>
  </head>
<body>
  
  <?
include ("./spojeni_databaze.php");
$databaze=bazar;
$q = mysql_query("SELECT * FROM inzerat  ORDER BY adresa LIMIT 3") or die(mysql_error());

echo "Seznam všech článků <ul>";
while($data=mysql_fetch_array($q)){ 
echo "<br>";
?>

<script>
var data = <? echo json_encode($data) ?>;
document.write(data["jmeno"]);
document.write(data["adresa"]);
</script>

<?
}
   

?>
     
  </body>
</html>

Jinak zatím to mám vložené zde http://bazar.4fan.cz/test.php

Sir Tom: PHPkem bych už to měl 4x bez problémů :D Ale nutně to potřebuji to JS a v tom se nějak neorientuji.
Amunak
Profil
tmvitek:
v PHP si prvně sestav celý objekt, který pak předáš do JS, nedávej ten JS do (PHP) cyklu přímo. Tedy něco jako:

<?php
header('Content-Type: text/html; charset=utf-8');

/* spojení s databází, dostanu třeba $res (jako resource) */

$data = array();
while($row = mysql_fetch_array($res))
  $data[$row['jmeno']] = $row['adresa'];

/* v $data mám teď pole ve tvaru:
        'Jan' => 'Praha',
        'Martin' => 'Brno'
*/

?>
<!doctype html>
<script>
var data = <? echo json_encode($data) ?>;
var jmeno;
for(jmeno in data)
  document.write( jmeno + ': ' + data[jmeno] + '<br>\n' );
</script>
Výstup pak pude:
Jan: Praha<br>
Martin: Brno<br>

Ale nechápu, proč to nemůžeš vypsat jen v PHP.
tmvitek
Profil
Amunak:
tak toto řešení bohužel fungovalo úplně stejně.

ALE teď jsem zjistil v čem je problém. A to v tom, že data v databázi mám s diakritikou a to mi nějak javascript nechce spolknout. KDyž vložím data do MYSQL bez diakritiky, tak funguje bez problému. Takže na co jsem prosím já blbec zapomněl?
Jan Tvrdík
Profil
tmvitek:
Funkce json_encode očekává řetězec v UTF-8 kódování. Máš-li data v databázi v jiném kódování, je nezbytné je před voláním json_encode do UTF-8 převést, např. pomocí funkce iconv.
tmvitek
Profil
Tak díky moc všem! Už mě to fachá. Chyba byla pouze v kódování.
Amunak
Profil
tmvitek:
jsem si jistý, že fungovalo efektivněji, rychleji a s menším množstvím dat posílaných ke klientovi.

Kdyby ses chtěl úplně zbavit JSONu, můžeš do toho PHP while cyklu dát rovnou jen document.write. ale to se pak můžeš zbavit i toho JS. To zadání prostě pořád nedává smysl.
tmvitek
Profil
Amunak:
položky potřebuji do javascriptu, protože plánuji pomocí nic vkládat data do mapy. Mohu se ještě zeptat, jak bych měl tento kód upravit, tak abych měl přeřazeno k 'Jan' => 'Praha', a k tomu ještě jeden příp. více sloupců? Např. sloupce jméno, adresa, telefon tj JAN - Praha, - 604604604 Nevím kolik sloupců se mi bude ještě hodit, ale aspoň jeden nebo dva přidat by se mě hodily.

<?php
header('Content-Type: text/html; charset=utf-8');
 
/* spojení s databází, dostanu třeba $res (jako resource) */
 
$data = array();
while($row = mysql_fetch_array($res))
  $data[$row['jmeno']] = $row['adresa'];
 
/* v $data mám teď pole ve tvaru:
        'Jan' => 'Praha',
        'Martin' => 'Brno'
*/
 
?>
<!doctype html>
<script>
var data = <? echo json_encode($data) ?>;
var jmeno;
for(jmeno in data)
  document.write( jmeno + ': ' + data[jmeno] + '<br>\n' );
</script>
Amunak
Profil
tmvitek:
Udělat z toho dvourozměrné pole, v JS z toho pak bude objekt obsahující další objekty...

Bude to pak vypadat takto:
$data = array();
while($row = mysql_fetch_array($res))
  $data[$row['jmeno']] = array(
      'adresa' => $row['adresa'],
      'tel' => $row['telefon']
  );
 
/* v $data mám teď pole ve tvaru:
'Jan' => array(
    'adresa'=>'Praha',
    'tel'=>123546
),
'Martin' => array(
    'adresa'=>'Brno',
    'tel'=>456446
)
*/

v JS bude něco takového:
for(jmeno in data) //v data je {"Jan":{"adresa":"Praha","tel":123546},"Martin":{"adresa":"Brno","tel":456446}}
  document.write( jmeno + ': ' + data[jmeno].adresa + ', ' + data[jmeno].tel + '<br>\n' );

A výsledek:
Jan: Praha, 123456<br>
Martin: Brno, 456446<br>

Opraven Javascript.
tmvitek
Profil
Bohužel nemůžu to nějak rozchodit, Vypíše mi to jméno a pak už jenom undefined. Zde je http://bazar.4fan.cz/test4.php
a zde je kód
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  
 
  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <meta name="generator" content="PSPad editor, www.pspad.com">
  <title></title>
  </head>
<body>
  
  <?
include ("./spojeni_databaze.php");
$databaze=bazar;
$q = mysql_query("SELECT * FROM inzerat") or die(mysql_error());


$data = array();
while($row = mysql_fetch_array($q))
  $data[$row['jmeno']] = array(
      'adresa' => $row['adresa'],
      'tel' => $row['telefon']
  );


?>



<script>

var data = <? echo json_encode($data) ?>;

var jmeno;
for(jmeno in data) //v data je {"Jan":{"adresa":"Praha","tel":123546},"Martin":{"adresa":"Brno","tel":456446}}
  document.write( jmeno + ': ' + data[jmeno.adresa] + ', ' + data[jmeno.tel] + '<br>\n' );           
                   
  </script>     
  </body>
</html>
Chamurappi
Profil
Reaguji na tmvitka:
Dej data[jmeno].adresa místo data[jmeno.adresa] a obdobně uprav i telefon. V proměnné jmeno je řetězec, takže jmeno.adresa je undefined a pak data["undefined"] je také undefined.
tmvitek
Profil
Díky chlapy, už to běží! :)

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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