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"); ?>
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.
Kertoisitko enemmän...
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.
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
asetus | arvo |
asetus 1 | arvo 1 |
asetus 2 | arvo 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.
Haetko siis merkkijolla taulukosta?
$asetukset["forum_title"]
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.
Macro: mysql_fetch_array palauttaa yhden tulosrivin, ei suinkaan kaikkia tuloksia. Katsopa itse uudestaan sitä linkittämääsi PHP:n manuaalia.
Tietääkseni taulukon soluun voi viitata vain kokonaisluvulla.
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.
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.
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" =>
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.
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.
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) );
Ratkaisin ongelmani tekemällä tuollaisen edellä mainitsemani funktion. Kiitos kumminkin.
<?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....
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]?
Kiitos Metabolix! Ajattelin asiaa liian mutkikkaasti.
Aihe on jo aika vanha, joten et voi enää vastata siihen.