Elikkäs, tämän koodin olisi tarkoitus hakea tietokannasta $tunnus nimisestä taulusta salasana (md5-kryptattu), mutta jostain syystä tulee seuraavanlainen virheilmoitus: Warning: mysql_result(): supplied argument is not a valid MySQL result resource.
$yhteys = mysql_connect('db.arkku.net', '890_Rasenger', '********') or die("Ei saatu yhteyttä tietokantapalvelimeen."); mysql_select_db('890_shadow125', $yhteys); $haku = mysql_query('SELECT salasana FROM $tunnus'); $result = mysql_result($haku, 1); mysql_close($yhteys);
Virheilmoitus viittaisi siihen että $haku on "viallinen" mutta minusta mysql_query()-funkkarissakaan ei ole vikaa. :/ Onko mahdollista että vika olisi tietokannassa?
Jos tarkoitus on hakea muuttujassa $tunnus ilmoitetusta taulusta, kirjoita SQL-kysely lainausmerkkeihin, jotta sen sisällä olevat muuttujat saavat oikeat arvonsa.
Antti Laaksonen kirjoitti:
Jos tarkoitus on hakea muuttujassa $tunnus ilmoitetusta taulusta, kirjoita SQL-kysely lainausmerkkeihin, jotta sen sisällä olevat muuttujat saavat oikeat arvonsa.
Ei auttanut.
Onko muuttujassa $haku oikea kysely ennen mysql_result-riviä? Toimiiko tämä kysely, jos koetat sitä muuten kuin PHP:n kautta? Toimiiko jokin muu kysely tavallisesti?
Antti Laaksonen kirjoitti:
Toimiiko tämä kysely, jos koetat sitä muuten kuin PHP:n kautta?
Tämä ratkaisi ongelman, kokeilin kyselyä Arkku.netin kautta ja siellä antoi niinkin selkeän virheilmoituksen kuin "table doesn't exist". Elikkä minulla on rekisteröitymisosiossa jotain hämärää (tuo oli kirjautumisosiosta).
Millaista järjestelmää olet tekemässä? Jos kyseessä on tavallinen sivusto, johon kirjaudutaan sisään tunnuksella ja salasanalla, jokainen käyttäjä ei tarvitse omaa taulua, vaan kaikki käyttäjät voidaan tallentaa samaan tauluun. Tällöin taulun yksi rivi on yksi käyttäjä, josta ilmoitetaan ainakin tunnus ja salasana.
Antti Laaksonen kirjoitti:
Millaista järjestelmää olet tekemässä? Jos kyseessä on tavallinen sivusto, johon kirjaudutaan sisään tunnuksella ja salasanalla, jokainen käyttäjä ei tarvitse omaa taulua, vaan kaikki käyttäjät voidaan tallentaa samaan tauluun. Tällöin taulun yksi rivi on yksi käyttäjä, josta ilmoitetaan ainakin tunnus ja salasana.
Niin, onkos tuosta jotain etua sitten että käyttää samaa taulua kaikille käyttäjille? Sivustolle tulee keskustelupalsta ja artikkelien ja kuvien lisäysominaisuudet jotka vaativat kirjautumisen. Ei mitään isoa ja mahtavaa.
Tumpelo kirjoitti:
Sivustolle tulee keskustelupalsta ja artikkelien ja kuvien lisäysominaisuudet jotka vaativat kirjautumisen. Ei mitään isoa ja mahtavaa.
Kannattaa varmankin muuttaa yhteyden muodostamista siten, että salasana ja ktunnukset yms.. ei ole kirjoitettuna koodiin suoraan, vaan että ne haetaan jostain muualta.
Samoin SQL-kyselyt kannattaa kirjoittaa siten, että käytät placeholdereita, eli et käytä muuttujia suoraan SQL-lauseessa.
Tumpelo kirjoitti:
Niin, onkos tuosta jotain etua sitten että käyttää samaa taulua kaikille käyttäjille?
Samanlaiset asiat kannattaa ilman muuta koota samaan tauluun. Esim. koko Ohjelmointiputkan keskustelussa on vain kolme taulua, joista yhdessä on kaikki käyttäjät. Jos jokainen käyttäjä saa oman taulun, tilanne on suunnilleen sama, kuin että jokainen Helsingin asukas saisi oman puhelinluettelon.
Vähän aiheeseen liittyen:
for ($i=0;$i<count($nimet);$i++) { $idt = mysql_query("SELECT id FROM asiakas WHERE nimi = '$nimet[$i]' "); $id = mysql_result($idt, $i); }
Eli tuo haku ei pelitä. Jos tuohon nimet[$i]-kohtaan laittaa kannassa olevan nimen suoraan, niin haku toimii.
Vaihda muotoon:
$idt = mysql_query("SELECT id FROM asiakas WHERE nimi = '{$nimet[$i]}' ");
Niin eiköhän toimi. Taulukon soluihin viitatessa lainausmerkkien sisällä tulee käyttää {} merkintää.
Perskule, vieläki tulee Unable to jump to row 0...
Apina kirjoitti:
for ($i=0;$i<count($nimet);$i++) { $idt = mysql_query("SELECT id FROM asiakas WHERE nimi = '$nimet[$i]' "); $id = mysql_result($idt, $i); }
Vähän aiheesta ohi, mutta optimimpi voisi silmukan sijaa nolla:
<?php $nimet = implode("','", $nimet); $sql = "SELECT id FROM asiakas WHERE nimi IN ('".$nimet."') " $idt = mysql_query($sql) or die(mysql_error() . " SQL: ".$sql); ?>
Edit: virheenkäsittely kyselyyn...
Hmm, mitä teen väärin kun tämä koodi ei luokaan kayttajat tauluun yhtään mitään:
mysql_select_db("890_shadow125", $yhteys); mysql_query("INSERT INTO kayttajat (tunnus, salasana, status) VALUES ($tunnus, $mdhash, '1')"); mysql_close($yhteys);
Tarkista onnistuuko kyselyn suoritus, ja jos ei niin tulosta virheilmoitus:
<?php if (mysql_query("INSERT INTO kayttajat (tunnus, salasana, status) VALUES ($tunnus, $mdhash, '1')") == false) { exit(mysql_error()); } ?>
Voisin kuvitella että vika on lainausmerkkien käytössä. Merkkijonoissa tulee käyttää niitä lainausmerkkejä, numeroissa ei:
<?php if (mysql_query("INSERT INTO kayttajat (tunnus, salasana, status) VALUES ('$tunnus', '$mdhash', 1)") == false) { exit(mysql_error()); } ?>
Muistathan myös sql-injektion vaaran, eli sinulla pitää escapettaa ' merkit jotta ne eivät sotke kyselyä.
JTS kirjoitti:
Voisin kuvitella että vika on lainausmerkkien käytössä. Merkkijonoissa tulee käyttää niitä lainausmerkkejä, numeroissa ei:
Joo tuossa vika oli. Täytynee huomauttaa että Ohjelmointiputkan PHP-oppaan MySQL-kohdassa lienee virhe, sillä siellä neuvotaan käyttämään ' merkkiä myös numeroiden ympärillä. Antin kannattaisi korjata tuo, jos se siis on virhe, ettei se aiheuttaisi enempää harmaita hiuksia. :)
' merkkejä voi käyttää numeroiden ympärillä (toimii ainakin mysql:ssä), mutta se ei ole pakollista. Merkkijonot sen sijaan on pakko laittaa ' merkkien sisään.
[#Siilisoftware @ QuakeNet]
<Rasenger> Voi kyynel, luulin jo saaneeni Laaksosen Antin kiinni koodivirheestä mutta ei. :(
Siis nyt on muodossa:
$idt = mysql_query("SELECT id FROM asiakas WHERE nimi = '{$nimet[$i]}' ");
Ja eikö paukkaa "Unable to jump to row 0..." -erroria. Ja edelleen jos laittaa jonkun nimet-taulukossa olevan datan suoraan stringinä hakuun, niin eiköhän haku onnistu. Samoin jos kokeilee yhteen muuttujaan heittää jotain varmasti kannassa olevaa id:tä, ei mene läpi.
Mikähän helevata tässä voi olla pielessä?
Toisaalta toisessa skriptissä samanlainen haku onnistuu :D
Onkohan tuossa nimet taulukossa varmasti tavaraa juuri i:n kohdalla? Tulosta se lauseke ja tarkasta.
Jos itse haku epäonnistuu niin sen saa selville näin:
if (($idt = mysql_query("SELECT id FROM asiakas WHERE nimi = '{$nimet[$i]}' ")) == false) { exit(mysql_error()); }
Tieten nuo mysql_error lauseet pitää poistaa näkyvistä ennen lopullista julkistamista käyttäjälle, ne usein muodostavat tietoturvariskin kertoessaan käyttäjälle liikaa.
Taulukossa on tavaraa oikeassa kohdassa. Haku onnistuu ja mysql_query() palauttaa Resource id:n. mysql_result()-funktioon se pomppaa. Nyt kyllä täytyy jo sanoa, että pölisee yli hilseen.
Mistä ihmeestä tommonen voi johtua?
No vaikka siinä että mysql_result-funktiolle annetaan väärä muuttuja. Paha sanoa, kristallipallokin on epäkunnossa ;)
Hehe, kyllä sinne ihan oikea muuttuja menee
$id = mysql_result($idt, $i);
Ja olen tainnut käyttää tossa toisena parametrina kaikkia kokonaislukuja 0 - N-1 :D
Tämä olla kovin mystistä.
Ongelmana taitaapi olla se, että kun dumppaa yhden $nimi-muuttujan sisällön, tulos on seuraava:
array(1){[0]=> string(7) " Veikko" }
Jostain tulee tuo ylimääräinen välilyönti ennen nimeä, ja siihenhän se töksähtää.
Miten taulukko on alun perin luotu? Sieltä paljastuu myös syy ylimääräiseen välilyöntiin. Merkkijonon alussa olevat välit voi poistaa ltrim-funktiolla, mutta jos merkkijonossa voi joskus todella olla välilyönti alussa, tämä temppu ei toimi.
Taulukko on luotu ihan
$taulukko [];
Vois tietysti array-funkkaria käyttää...
Ja stringin alussa ei tarvitse olla välilyöntiä, joten viimeistään vois vaikka tolla ltrim-funkkarilla fiksata. Pitää tässä ensin vähän tsekkailla, mistä se nykäsee ton välilyönnin tohon.
Nyt poistin ne välilyönnit nimien alusta ja tolla nyt mennään:
for ($i=0;$i<count($nimet);$i++) { $idt = mysql_query("SELECT id FROM asiakas WHERE nimi = '{$nimet[$i]}' "); $id = mysql_result($idt, $i);
Jos taulukossa on yksi nimi, kaikki menee OK, mutta jos useampia, tapahtuu töktök. Eli "Unable to jump to row 1" tulee.
Muuta viimeisen rivin $i nollaksi. Teet joka forin kierroksella uuden kyselyn (joka palauttaa vain yhden tiedon), ja täten tulos on aina paikassa 0.
Niinpä tietysti! On sitä nikkinsä mukainen... Kiitoksia!
Aihe on jo aika vanha, joten et voi enää vastata siihen.