Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Taulukon sisällöt eivät välity eteenpäin

Sivun loppuun

Macro [19.02.2010 20:40:40]

#

Haen MySQL tietokannasta settings taulusta tiedot, jotka asetan $asetukset[]-taulukkoon.

<?php
$haeasetukset = mysql_query("SELECT * FROM settings") or die(mysql_error());
$asetukset = mysql_fetch_array($haeasetukset);

Kun foreachilla käyn $asetukset[] läpi, niin saan ihan oikeat tulokset. Kun titleen koitan laittaa $asetukset["forum_title"], niin saan tulokseksi tyhjän otsikon. Missä vika?

Sen sijaan tämä toimii:

<?php echo mysql_result(mysql_query("SELECT * FROM settings WHERE asetus = 'forum_title'"), 0, "arvo"); ?>

Teuro [19.02.2010 21:14:28]

#

Millaisen foreach rakenteen olet laittanut? Lisäksi puhut yhtäällä 'forum_title' nimestä ja toisaalta 'arvo' nimestä kumpi on oikein? 'Asetus' ei kuulosta järkevälle nimelle, jos kysessä on sivun title-elementti.

Jokotai [19.02.2010 21:19:06]

#

Kertoisitko enemmän...

Macro [19.02.2010 21:19:30]

#

Teuro kirjoitti:

Millaisen foreach rakenteen olet laittanut?

Hyvin yksinkertainen rakenne, joka käy $asetukset[] taulukon läpi, ja tulostaa siitä jokaisen rivin asetusnimen ja arvon.

<?php
foreach($asetukset as $nimi => $arvo) {
	echo "$nimi => $arvo\n";
}

Teuro kirjoitti:

Lisäksi puhut yhtäällä 'forum_title' nimestä ja toisaalta 'arvo' nimestä kumpi on oikein?

Nyt et tainnut ymmärtää oikein. Lueppas manuaalista, mitä mysql_result tekee ja miten sitä käytetään. mysql_fetch_array() palauttaa taulukon array(nimi => arvo, nimi => arvo), joten $asetukset[..] idean tunnistatkin. arvo taas on sarakkeen otsikko, jonka alta löytyy rivin arvo-sarakkeen tieto.

Taulun rakenne on

asetusarvo
asetus 1arvo 1
asetus 2arvo 2

mysql_result palauttaa perjaatteessa saman kuin mysql_fetch_array, mutta tieto mikä halutaan tietää pitää kaivaa jo mysql_result funktiossa.

<?php
$tiedot = mysql_fetch_array(mysql_query("SELECT jokin FROM jostain WHERE jokin = jotain"));
echo $tiedot["jokin"];

on sama kuin

<?php
echo mysql_result(mysql_query("SELECT jokin FROM jostain WHERE jokin = jotain"), 0, "jokin");

Toivottavasti nyt tuli kaikkien ymmärrettyä, mitä haen takaa.

Varmaankin kaikkein asiaa sisältävin viesti, mitä olen Ohjelmointiputkaan lähettänyt.

Jokotai [19.02.2010 21:25:16]

#

Haetko siis merkkijolla taulukosta?

$asetukset["forum_title"]

Macro [19.02.2010 21:26:31]

#

Tätä koitin, ja siksi kysyin kun tämä palauttaa tyhjän vastauksen (""). mysql_resultin kanssa sen sijaan tulee arvo-sarakkeen tieto. Toivottavasti huomasit mitä muokkasin ylempään viestiin, tein selvennöksen.

Metabolix [19.02.2010 21:28:03]

#

Macro: mysql_fetch_array palauttaa yhden tulosrivin, ei suinkaan kaikkia tuloksia. Katsopa itse uudestaan sitä linkittämääsi PHP:n manuaalia.

Jokotai [19.02.2010 21:28:26]

#

Tietääkseni taulukon soluun voi viitata vain kokonaisluvulla.

Macro [19.02.2010 21:29:24]

#

Tiedän. Tarkoitin, että mysql_fetch_array:llä voi tarkastella kaikkia rivin sarakkeita, kun mysql_result palauttaa vain tietyn sarakkeen riviltä.

Jokotai kirjoitti:

Tietääkseni taulukon soluun voi viitata vain kokonaisluvulla.

Mielenkiintoinen teoria, sillä minulla tämä on aina ennen toiminut. Eikai se mysql_fetch_array palauta mitään erikoista taulukkoa, vaan ihan normaalisti tiedot rivistä taulukkoon?

Kyllähän $taulukko["solu"] toimii ihan hyvin.

Teuro [19.02.2010 21:30:34]

#

Ei kannata aliarvioida suoraan, sillä käyttämäsi nimet eivät ole selkeitä. Tuleeko foreach tulostuksesta kohta 'forum_title' => 'jotain fiksua', mikäli ei tule, niin tuollaista nimeä ei ole olemassakaan.

Metabolix [19.02.2010 21:32:01]

#

Mutta siis kuvaamallasi taulun rakenteella mysql_fetch_array palauttaa ensimmäisellä kutsukerralla taulukon array("asetus 1", "arvo 1") ja toisella kerralla array("asetus 2", "arvo 2"), parametreista riippuen numeerisilla indekseillä, sarakkeiden nimillä tai molemmilla. Missään tilanteessa se ei palauta taulukkoa array("asetus 1" => "arvo 1", "asetus 2" => "arvo 2").

Macro [19.02.2010 21:32:31]

#

Minusta nimet ovat hyvinkin selkeitä, mutta esitykseni asiasta ei välttämättä ollut niinkään.

Itse ainakin ajattelin asiaa siten, että taulun sarakkeet ovat asetus ja arvo. Tämä olisi minusta ollut kaikkein järkeenkäypä.

Kyllä, tälläinen löytyy tietokannasta, kuten mysql_result osoitti.

Metabolix kirjoitti:

Mutta siis kuvaamallasi taulun rakenteella mysql_fetch_array palauttaa ensimmäisellä kutsukerralla taulukon array("asetus 1", "arvo 1") ja toisella kerralla array("asetus 2", "arvo 2"), parametreista riippuen numeerisilla indekseillä, sarakkeiden nimillä tai molemmilla. Missään tilanteessa se ei palauta taulukkoa array("asetus 1" => "arvo 1", "asetus 2" => "arvo 2").

Se kylläkin palauttaa array("asetus 1" => "arvo 1", "asetus 2" => "arvo 2"). Sillä, jos muokataan foreach-rakennetta siten, että se näyttää tältä, niin kyllä minun käsityksen mukaan rakenne olisi seuraava.

<?php
foreach($asetukset as $asetus_sarake => $arvo_sarake) {
	echo "$asetus_sarake => $arvo_sarake => {$asetukset[$asetus_sarake]}\n";
}

$asetukset[$asetus_sarake] palauttaa siis saman kuin $arvo_sarake.

Metabolix [19.02.2010 21:39:33]

#

Mitä var_dump($asetukset) tulostaa?

Onko muuttuja $asetukset varmasti samalla näkyvyysalueella kuin paikka, jossa yrität käyttää sitä? Jos käytät funktioita (ja toivottavasti käytät), se pitää välittää parametrina tai merkitä globaaliksi.

Edit:

Macro kirjoitti:

Se kylläkin palauttaa array("asetus 1" => "arvo 1", "asetus 2" => "arvo 2").

Ei palauta. Seuraava haku on tehty taulusta hylly, jonka sarakkeet ovat koodi ja maara.

<?php
$r = mysql_query("SELECT * FROM hylly");
tulosta(mysql_fetch_array($r));
array(4) {
  [0]       => string(1) "3"
  ["koodi"] => string(1) "3"
  [1]       => string(2) "25"
  ["maara"] => string(2) "25"
}

Kuten näet, tuloksena on vain yksi rivi, ei suinkaan koodi-määrä-pareja sisältävää listaa.

Macro [19.02.2010 21:42:21]

#

Koitin juuri tuota var_dump funktiota, joka kyllä palauttaa tuloksen joka ei tue minua. Ihmettelen, miksi samalla rakenteella olevassa kyselyssä tämä toimii.

array(4) {
  [0]=>
  string(16) "database_address"
  ["asetus"]=>
  string(16) "database_address"
  [1]=>
  string(9) "localhost"
  ["arvo"]=>
  string(9) "localhost"
}

Näkyvyysalueiden kuuluisi olla kunnossa, koska $asetukset[] taulukkoa ei määritetä funktiossa, ja tulostuskaan ei siellä tapahdu.

Nyt kun luin uudestaan Metabolixin vietin, niin sain käsityksen että mysql_fetch_array taulukkoon tulisikin vain ensimmäinen rivi hakutuloksesta? Voisinhan väsätä funktion, joka palauttaa tämän:

array(
	array(asetus 1 => arvo 1),
	array(asetus 2 => arvo 2),
	array(asetus 3 => arvo 3)
);

Macro [19.02.2010 21:45:48]

#

Ratkaisin ongelmani tekemällä tuollaisen edellä mainitsemani funktion. Kiitos kumminkin.

Macro [20.02.2010 10:29:24]

#

<?php
function dar($query) {
	$result = array();

	for($i = 0; $i < mysql_num_rows($query); $i++) {
		$info = mysql_fetch_array($query);
		$result[] = array($info[0] => $info[1]);
	}

	return $result;
}

echo var_dump(dar(mysql_query("SELECT * FROM settings")));
array(5) {
  [0]=>
  array(1) {
    ["database_address"]=>
    string(9) "localhost"
  }
  [1]=>
  array(1) {
    ["database_user"]=>
    string(4) "root"
  }
  [2]=>
  array(1) {
    ["database_password"]=>
    string(8) "salasana"
  }
  [3]=>
  array(1) {
    ["database_table"]=>
    string(9) "mps_forum"
  }
  [4]=>
  array(1) {
    ["forum_title"]=>
    string(42) "Nimi"
  }
}

Nyt se toimii ihan ok, mutta sinä ei välttämättä tarvitsisi olla noin montaa arrayta. Koodissa laitan kyllä selvästi $result taulukkoon arrayta, mutta => ei toimi muuten. Miten voisin korjata sen?

Eli tulos olisi

array(
    asia 1 => arvo 2
    jne....

Metabolix [20.02.2010 12:21:55]

#

Katsopa riviä, jolla lisäät tiedon taulukkoon.

<?php
$result[] = array($info[0] => $info[1]);

Mitä rivi tekee? Miten sitä pitäisi muuttaa, jotta se ei lisäisi vanhan taulukon sisään uutta taulukkoa vaan lisäisikin $info[1]:n aiemman taulukon kohtaan $info[0]?

Macro [20.02.2010 12:34:31]

#

Kiitos Metabolix! Ajattelin asiaa liian mutkikkaasti.

<?php
function dar($query) {
	$result = array();

	for($i = 0; $i < mysql_num_rows($query); $i++) {
		$info = mysql_fetch_array($query);
		$result[$info[0]] = $info[1];
	}

	return $result;
}

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta