Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQLi_fetch_row ja for-silmukka

Sivun loppuun

Thalassa [01.03.2014 22:50:04]

#

function GetMessages($me,$i)
    {
	$connect = mysqli_connect("...","...", "...");
	mysqli_select_db($connect, "...");
	$search = mysqli_query($connect, "SELECT Messages FROM Users WHERE Name = '$me'");
    return mysqli_fetch_row($search)[$i];
    }

Jostain syystä num_rows löytää for-silmukassa kyllä kaikki rivit, mutta fetch_row näyttää vain rivin 0 tiedot. Ei tulosta muita tietoja, ei edes vaikka laittaa riviksi esim. 1, 2, 3.. Löytää siis vain rivin 0 tiedot. Yksinkertainen koodi, mutta missähän voisi olla vika? Onko mysqli_fetch_row oikea funktio tähän?

Metabolix [01.03.2014 22:53:27]

#

Mitähän ihmettä luulet tuossa tekeväsi? Jos haluat hakea kaikki rivit, käytä funktiota mysqli_fetch_all. Jos haluat vain yhden rivin, siirry oikealle riville funktiolla mysqli_data_seek tai muuta kyselyäsi sillä tavalla, että se palauttaa vain halutun rivin.

Thalassa [01.03.2014 22:57:53]

#

Nimenomaan luulen tekeväni jotain, lopputuloksen perusteella en tee sitä oikein - siksi tulin pyytämään tänne apua.

Mitä itse oikein luulet tekeväsi?

Metabolix [01.03.2014 23:03:16]

#

Thalassa kirjoitti:

Nimenomaan luulen tekeväni jotain,

Minkälaista apua ajattelit saavasi, jos et edes kerro, mitä yrität? En ymmärrä tavoitetta viestistäsi enkä koodistasi. Tuossa teet SELECT-kyselyn, haet ensimmäisen tulosrivin ja otat siitä sarakkeen $i arvon. Missään ei näy kohtaa, jossa ”laittaa riviksi esim. 1, 2, 3”, vaan koodissasi haet aina vain ensimmäisen rivin ja indeksillä siitä jonkin sarakkeen.

Thalassa kirjoitti:

Mitä itse oikein luulet tekeväsi?

Mielestäni melko yksiselitteisesti kysyin, mitä ajattelet koodisi tekevän. Jos et edelleenkään itse hahmota, mikä koodissasi on vikana, sinun täytyy selittää ongelmasi tarkemmin, jotta siihen voi antaa jonkin tarkan vastauksen. Aloita silloin seuraava viestisi vaikka sanoilla ”haluan tehdä funktion, joka”.

p99o [01.03.2014 23:12:46]

#

miksi Users-taulussa on sarake Messages. vaikuttaa oudolta.

(voi juku mikä lauantai...)

Thalassa [01.03.2014 23:19:09]

#

p99o kirjoitti:

miksi Users-taulussa on sarake Messages. vaikuttaa oudolta.

Se on vain nopea esimerkki, varsinaisella sisällöllä ei siis ole väliä.

The Alchemist [01.03.2014 23:25:52]

#

Thalassa kirjoitti:

p99o kirjoitti:

miksi Users-taulussa on sarake Messages. vaikuttaa oudolta.

(voi juku mikä lauantai...)

Se on vain nopea esimerkki, varsinaisella sisällöllä ei siis ole väliä.

No onhan sillä väliä. Tuossa kyselyssä tosiaan haet mitä sattuu ihan väärästä taulusta. Pakkohan sellaisesta on huomauttaa. Jos käytät pseudokoodia, niin tee selväksi, mikä osa on pseudoa ja mikä ei (ja tee järkevää pseudoa). Miten helvetissä niitä oikeita virheitä muuten voidaan korjata?

P.S. Lisäksi et näytä ymmärtävän, mitä ne parametrisoidut kyselyt ovat. On myös todella, todella huono idea avata uusi yhteys jokaisen funktion sisällä ja sitten vielä jättää ne roikkumaan. Tapahtukoot pellin alla mitä tapahtuukaan.

Ja nyt kun tuota koodinpätkää ajattelee ja huomioi sen ohessa kertomasi jutut. Ajatko todella for-silmukassa joka iteraatiolla saman kyselyn uusiksi ja palautat / yrität palauttaa tuloksena seuraavan rivin? Voi jessus miten typerää. Miksi funktion nimessä (GetMessages) väitetään palautettavan monta riviä mutta funktio ottaa selvästi parametrina rivin numeron ja palauttaakin vain yhden rivin?

Thalassa [01.03.2014 23:39:29]

#

Tosissanneko noin kirjoittelette vastauksia (selvästi aloittelijalle) avun pyytäjille? On kyllä ihan viho viimeinen kerta kun tänne kirjoittelen yhtään mitään. Sokerihumalako on päällä, ES-tölkkejä pöydällä?

Ihan vain pyysin apua, mutta näemmä ei ihan vielä ole puberteetti saavuttanut huippuaan kun pitää niin alkaa aloittelijoille tiuskimaan. Taidan pysytellä pois tältä palstalta. Aikuismaisempaa apua saa kyllä varmasti muualta - kiitos.

PS. Annan neuvon avun antajille: miettikää sitä itse ongelmaa. Funktion nimessä on monikkomuoto, mitä sitten? Mitä sitten, vaikka siinä lukisi GetBananas ja se palauttaa yhden päärynänsiivun?

The Alchemist [01.03.2014 23:43:00]

#

Tuossa ei ole vain yhtä ongelmaa vaan monia ongelmia. Ja ajattelemattomuuttasi kylvät vielä sekaan sellaisiakin virheitä, jotka todellisesta koodista luultavasti puuttuvat. Toisaalta et edes näytä kaikkea relevanttia koodia, joten etsitty virhe saattaa olla tuossa pätkässä koodia tai sitten se ei ole - mistäpä me tietäisimme. Ylimielinen äpärä saa ylimielisiä vastauksiakin, ei siinä sen ihmeempää.

Thalassa [01.03.2014 23:58:21]

#

The Alchemist kirjoitti:

Ylimielinen äpärä saa ylimielisiä vastauksiakin, ei siinä sen ihmeempää.

No siitä voidaan varmaan keskustella, että miltä osapuolelta tuli ensimmäisenä "äpärää" tekstiä. Käsittääkseni ihan kohteliaasti kysyin ja heti alkoi tulla tikkoja silmään. Tiedä sitten missä tein väärin. Siinä, että en osaa/taida kieliä yhtä taitavasti kuin te? Lainatakseni:

lainaus:

Mitä ihmettä luulet tekeväsi?

Olisiko ystävällinen tapa kysyä, "mihin pyrit"?

lainaus:

..jos et edelleenkään hahmota..

Suora vihje, että olen tyhmä. Onko kohteliasta?

lainaus:

..miten helvetissä..

Aggressiivista vai mukavaa ongelmanratkontaa?

Jos juttu lähtee näin käyntiin niin herne menee nenään saman tien, tietysti. Apua minä tulin hakemaan enkä mitään tiuskimista. Kuinka ammattimainen on oltava, että saa luvan pyytää Teiltä apua?

Metabolix [01.03.2014 23:59:07]

#

Thalassa kirjoitti:

PS. Annan neuvon avun antajille: miettikää sitä itse ongelmaa. Funktion nimessä on monikkomuoto, mitä sitten? Mitä sitten, vaikka siinä lukisi GetBananas ja se palauttaa yhden päärynänsiivun?

Toisaalta myös taulussasi sarakkeen nimi on Messages, jolloin loogisesti GetMessages-funktion pitää palauttaa vain tuon yhden sarakkeen arvo ja $i on turha. Eli jos todella olet sitä mieltä, että nimeäminen on loogista ja kertoo kaiken olennaisen, voit korjata funktiosi näin:

// GetMessages -> palautetaan käyttäjän riviltä tietokannasta sarake Messages.
function GetMessages($me) {
	$connect = mysqli_connect("...","...", "..."); // FIXME: yhdistä vain kerran!
	mysqli_select_db($connect, "..."); // FIXME: valitse kanta vain kerran!
	$tmp = mysqli_real_escape_string($connect, $me); // FIXME: tee parametrisoitu kysely!
	$search = mysqli_query($connect, "SELECT Messages FROM Users WHERE Name = '$tmp'");
	// Jos taulussa voi olla monta osumariviä, käytä tätä:
	return array_column(mysqli_fetch_all($search), 0);
	// Jos on vain yksi osumarivi, käytä tätä:
	return mysqli_fetch_row($search)[0];
}

Thalassa kirjoitti:

Metabolix kirjoitti:

..jos et edelleenkään hahmota..

Suora vihje, että olen tyhmä. Onko kohteliasta?

Olen pahoillani, että koet viestini loukkaavina, mutta kyse on kyllä omasta ylitulkinnastasi. En ole sanonut, että olet tyhmä. Tarkoitin vain, että olen mielestäni antanut jo monta vastausta: olen kertonut, mitä nykyinen koodisi tekee, mitä muita funktioita sinun kannattaisi kokeilla ja mitä lisätietoja sinun pitäisi antaa, jotta kysymyksesi olisi ymmärrettävä ja voisit saada paremman vastauksen. Siispä ihan rehellisesti ja hyvässä tarkoituksessa sanoin, että kysy lisää ja tarkemmin, jos et näistä neuvoista vielä löytänyt vastausta.

Mutta jos sinulla on noin paljon energiaa valittaa itse ylitulkitsemistasi sävyistä sen sijaan, että antaisit pyydettyjä lisätietoja, ehkä ongelmasi ei ole sinulle niin tärkeä, että sitä edes tarvitsisi ratkaista.

Aloittelijana sinun olisi syytä ymmärtää, että vaikka omassa mielessäsi on jotenkin aivan selvää, mitä koodisi pitäisi tehdä ja mitä yrität kysyä, muille ajatuksesi eivät todellakaan ole niin kirkkaita. Kun siis sanomme, että kysymys on epäselvä, se on aivan totta eikä mitään mielivaltaista vittuilua. On sinun osaltasi ylimielistä olettaa, että täällä voit heittää epämääräisen koodin ja sekavan kysymyksen ja saada siihen vastauksena tusinan erilaisia toimivia koodeja, joista jokin ehkä on sinulle ”se oikea”.

Ihan oikeasti en vieläkään tiedä, mitä haluat. Vielä entisestään hämmentää se, että ilmeisesti et halua kumpaakaan ensimmäisessä viestissäni mainitsemistani vaihtoehdoista, kun et ole ottanut niihin mitään kantaa. Pidin niitä epäselvän kysymyksesi perusteella kaikkein todennäköisimpinä tavoitteina.

Triton [02.03.2014 01:04:31]

#

Tuo pelkkä SQL-kysely antaa ymmärtää, että ap yrittää hakea kaikkia tietyn käyttäjän kirjoittamia viestejä. SQL:n perusteella pitäisi olettaa, että Users-taulussa on sarake "Messages", missä ei ole mitään järkeä, koska viesti-joukkoa ei voi tallettaa yhteen sarakkeeseen. Sen sijaan pitäisi olla toinen taulu nimeltään Messages, johon sitten sarakkeeseen tallennetaan viite Users-taulun yksittäiseen riviin, joka ilmaisee, että kenen kirjoittama kyseinen viesti on. Näin voidaan sitten hakea käyttäjä-id:n perusteella kaikki kirjoitetut viestit:

SELECT * FROM messages WHERE user_id = ?

tai jos nyt välttämättä halutaan hakea käyttäjätunnuksella/nimellä, niin voidaan tehdä liitos kahden taulun välille näin:

SELECT * FROM users, messages WHERE users.name = ? AND user_id = users.id

reca [02.03.2014 15:17:54]

#

En jaksanut ketjua kokonaan lukea kun puski niin negatiivista energiaa. Keskusteluun osallistuneet voisivat hieman miettiä agressiivisuuttaan. :/

The Alchemist [02.03.2014 18:43:11]

#

Noh, kaikkihan alkoi ap:n aggressioista, joten tarvinneeko meitä muita syyttää sen enempää. Kuten sanottua, niin vastausten laatu ja viba on suoraan verrannollinen kysyjän panostukseen.


Sivun alkuun

Vastaus

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

Tietoa sivustosta