Mikäs on vikana, kun yritän seuraavaa:
ORDER BY `lastonline`, `update` ASC
Tulee vaan virhe-ilmoituksia?
Eli supplied argument is not a valid MySQL result resource
Mod. siirsi aiheen MySQL ja PHP -oppaan kommenteista!
jessenic kirjoitti:
Mikäs on vikana, kun yritän seuraavaa:
ORDER BY `lastonline`, `update` ASC
Tulee vaan virhe-ilmoituksia?Eli supplied argument is not a valid MySQL result resource
No jos vaikka kertoisit ensin, mikä `lastonline` on ja mikä `update` on?
ORDER BY vaatii puolipisteen ; lauseen loppuun, koska sen tulee olla jonkin queryn osana:
SELECT column1, column2...columnN FROM table_name ORDER BY expression [ASC|DESC];
Kuten ystävä Google kertoo, "supplied argument is not a valid MySQL result resource" aiheutuu tyypillisesti siitä, että kyselyssä on virhe, mysql_query (jota ei muuten enää ole PHP:n nykyisissä versioissa) palauttaa tämän takia arvon false eikä MySQL-resurssia, ja sitten myöhemmässä kohdassa tulosten hakeminen tästä false-arvosta ei onnistu.
Yksi mahdollinen syy ongelmaan on se, että jos tosiaan on yritetty laittaa vain ORDER BY, tämä ei yksistään ole kokonainen SQL-lause. Jos kyselyssä on muitakin osia, mahdollisesti osat ovat väärässä järjestyksessä tai kyselyssä on jokin muu vika.
Voisi sanoa myös, että ”vikana” on puuttuva virheiden tarkastaminen. Proseduraalista rajapintaa käyttäessä pitäisi tarkastaa kyselyn onnistuminen:
$result = mysql_query("SELECT * FROM taulu ORDER BY x, y ASC"); if (!$result) { // TODO: Tallenna virhe lokiin. throw new Exception("Tietokantavirhe: " . mysql_error()); }
mavavilj kirjoitti:
mikä `lastonline` on ja mikä `update` on?
Melko epäolennaista ongelman kannalta. Varmasti voimme olettaa, että ne ovat MySQL-taulun kenttiä.
mavavilj kirjoitti:
ORDER BY vaatii puolipisteen
Ei se vaadi yhtään enempää puolipistettä kuin muutkaan. Puolipisteen tarve MySQL:ssä riippuu siitä, ajaako lauseita yksittäin tulkissa (jolloin puolipiste lopettaa lauseen) vai jollain ohjelmointikielellä (jolloin yleensä lause loppuu luontevasti merkkijonon loppuessa ihan ilmankin puolipistettä).
Sitten mavavilj voisit myös katsoa, montako (kymmentä) vuotta vanhaan viestiin vastaat jossain oppaiden kommenteissa. Esimerkiksi yli 1 vuosi on jo selkeästi raja, että kysyjä tuskin tulee enää jatkamaan keskustelua.
On mahdollista, että `lastonline` tai `update` eivät ole olemassa.
Puolipisteen puuttuminen kertoo aika paljon siitä, että kyseessä ei ole query. Sitä voisi käyttää myös, jotta kyselyt toimivat kaikkialla standardinmukaisesti.
(Joku muu voi löytää kysymyksen)
Sitten voisi moderaattori kanssa poistaa vastaamattomat viestit, jos ne ovat irrelevantteja.
mavavilj kirjoitti:
On mahdollista, että `lastonline` tai `update` eivät ole olemassa.
Yleisen elämänkokemuksen perusteella se on mahdollisista virheistä huomattavasti epätodennäköisempi kuin muuten syntaksiltaan virheellinen kysely.
mavavilj kirjoitti:
Puolipisteen puuttuminen kertoo aika paljon siitä, että kyseessä ei ole query.
Kun SQL-kyselyitä kirjoitetaan muun koodin sekaan (esim. PHP:ssä), yleensä ei ole tapana käyttää puolipistettä eikä sen käyttämisestä ole mitään hyötyä.
mavavilj kirjoitti:
(Joku muu voi löytää kysymyksen)
Totta, jos joku vaikka harrastaa uuden softan koodaamista 15 vuotta vanhalla PHP:n versiolla ja törmää tähän virheilmoitukseen, jota ei voi enää nykyisillä versioilla tulla.
Entä jos samoja kyselyitä käytetään eri ympäristöissä?
mavavilj kirjoitti:
Entä jos samoja kyselyitä käytetään eri ympäristöissä?
Voitko antaa jonkin esimerkin, missä näin tehtäisiin ja miksi? Mihin kyselyt olisi tallennettu ja miten ne sieltä haettaisiin, jotta todella sama kysely päättyisi eri ympäristöihin (eikä vain käsin kopioitu kysely, jossa puolipiste on pienimpiä muutostarpeita)? Millä tavalla puolipisteen lisääminen valmiiksi helpottaisi keksimääsi skenaariota? Pitäisikö johonkin silloin ohjelmoida tarkastus, ettei voi vahingossa tallentaa kyselyä ilman puolipistettä ja aiheuttaa bugia osassa ympäristöistä? Eikö samalla tai pienemmällä vaivalla voisi yksinkertaisesti lisätä ohjelmallisesti puolipisteen, jos tarvitsee?
Luultavasti jo tässä vaiheessa asian miettiminen on vienyt enemmän aikaa kuin koko elämän SQL-kyselyiden puolipisteiden lisäys tarvittaessa käsin. Ylipäänsä SQL:n kirjoittaminen käsin on nykyään harvinaisempaa kuin 2010, kun on kaikenlaisia frameworkkeja.
Jokin automatisoitu hakuohjelma, jossa ihminen tekee komennot SQL:llä ja joka käännetään koneellisesti upotetuksi SQL:ksi, koska on useita frontend:jä. Esim. eri valmistajilta tai eri kielillä.
mavavilj kirjoitti:
Jokin automatisoitu hakuohjelma, jossa ihminen tekee komennot SQL:llä ja joka käännetään koneellisesti upotetuksi SQL:ksi, koska on useita frontend:jä. Esim. eri valmistajilta tai eri kielillä.
Anna käytännön esimerkki. Älä keksi päästäsi täysin idioottimaisia skenaarioita, kun tuskin edes itse ymmärrät tuon sanaripulin merkitystä. Kirjoita koodi siitä asiasta, mitä yrität sanallisesti kuvailla.
No vaikka jos haluat ylläpitää samanaikaisesti PHP ja C++ codebasea ym. ja et halua kirjoittaa käsin uusia SQL-komentoja, kun laajennat järjestelmää.
Tai teet SQL:ää hyödyntävän systeemin vaikka 8th:illa tai Haxe:lla. Mutta testaat ja devaat SQL:llä.
Aivan huikea käyttötapaus. Kumma, kun ei tullut itselle mieleen.
Eiköhän suosiolla lopeteta keskustelu, ennen kuin lähtee taas lapasesta. Varsinaiseen virheilmoitukseen on jo näillä lähtötiedoilla relevantit kommentit annettu.
Aihe on lukittu, joten siihen ei voi vastata.