Taas täällä.. Tarkoituksena on tarkistaa onko käyttäjän taulu arvo tyhjä vai onko siellä jotain tekstiä. Ja näin minä sen tarkistaisin mutta tällä koodilla se ohjaa jokaisen eteenpäin, joten jotain on nyt pielessä.
Mitäs tuo mysql_query() palauttikaan...?
Mitäs tällainen koodi sanoisi
Kantsii käyttää SELECT COUNT(*) ...
tuollaisissa tapauksissa. En nyt ole pitkään aikaan PHP:llä aktiivisesti koodaillut, mutta minusta tuo Teuron koodi tuottaa virheen (tarkemmin mysql_result()
), jos kysely ei palauta yhtään riviä. COUNT(*)
-kysely palauttaa aina yhden rivin (ilman grouppausta). Sitäpaitsi Teuron koodi tarkastaa onko taulussa riviä ja onko taulu-sarakkeen arvo ko. rivillä > 0.
Edit: oli tylsää. Tässä kapula-koodia melkein kaikkien taiteen sääntöjen mukaisesti :)
<?php $ollaan_debug_tilassa = true; $query = "SELECT COUNT(*) FROM `kayttajat` WHERE `tunnus` = '".mysql_real_escape_string($sisalla['tunnus'])."' AND `taulu` IS NOT NULL"; $rs = @mysql_query($query); if(!$rs && $ollaan_debug_tilassa){ echo '<p>Query failed ('. $query.')</p>'; die(mysql_error()); } if(mysql_result($rs, 0, 0) > 0) { // Location-otsaketieto ajaa saman asian header('Location: http://osoite.com/sivu.php'); // tämä voi toki jäädä tähän, jos selain ei jostain syystä tuota tottele echo "<meta http-equiv='Refresh' content='0; URL=sivu.php'/>"; // ja varmuuden vuoksi voi vielä tulostaa linkin, joka varmasti toimii :) echo '<a href="sivu.php">Kaikki OK!</a>'; }else{ echo 'Ei natsannu'; } ?>
ajv kirjoitti:
En nyt ole pitkään aikaan PHP:llä aktiivisesti koodaillut, mutta minusta tuo Teuron koodi tuottaa virheen (tarkemmin
mysql_result()
), jos kysely ei palauta yhtään riviä.
Ihan totta turiset muuten tuo oli täydelinen esitys huonosta tavasta tavasta tarkistaa tulokset. Oletin vain jotenkin, että sieltä tulisi aina tarkalleen yksi rivi, koska WHERE ehto oli minusta tulkittavissa siten, että se yksilöi rivin yhteen ainoaan.
Ikäväkseni voin kertoa, että eipä toiminut ajv:kaan koodi. Pienellä kikkailulla yritin mutta taas joko ohjaa kaikki tai ei ketään.
Ja on tainnut eksyä ylimääräinen '>)' mukaan koodiin.
Kantsii sit varmaan opetella debuggaamaan itse koodia, sillä enempää tässä ei voi ulkopuolinen noilla tiedoilla auttaa...
E: siivosin koodista tuon typon pois.
Jep, ei kai siinä muu auta kuin itse yrittää tehdä toimiva ratkaisu.
Itse lähtisin siitä, että tarkistaisin, mitä tuolta kannasta tulee. Siinä se ongelma mitä todennäköisemmin on.
$query = "SELECT...";
exit($query);
=> tarkistaa SQL-lauseen ja ajaa sen jossain query analyzerissa ja kattoo mitä se palauttaa
Oiskohan nyt sellainen ongelma, että käyttäjän taulu arvo = '' eikä NULL.. "Tyhjähän ei ole tyhjä vai miten sen asian ilmaisisi."
Ps. Korjatkaa viisaammat jos höpisen taas vaihteeksi.
Menee jankkaamisen puolelle, mutta tuossa Vasta_alkajan koodissa on taas kaikki ne aloitusviestin virheet, jotka tässä keskustelun kuluessa on saatu korjattua...
Nyt tuntuu tyhmältä kun en ennen tätä tajunnut mutta näinhän tämä ongelma ratkesi helposti:
Miten olisi
tesmu kirjoitti:
Miten olisi
Eikös mysql_affected_rows() tuota muutettujen rivien määrän, eli tässä tapauksessa 0:n? manuaali
mysql_num_rows() olisi ehkä parempi funktio selvittämään tehdyn kyselyn palauttaman rivien määrän.
Ihan niinku tääl tarkotuksel kettuiltas mulle :) Taas itseäni toistaen: jos halutaan tietää kuinka monta riviä taulussa täyttää tietyt ehdot, kannattaa kysyä sitä tietokannalta suoraan (SELECT COUNT(*) AS riveja...
), eikä hakea kaikkia niitä rivejä (SELECT *...
). Jälkimmäinen voi pahimmassa tapauksessa palauttaa koko taulun sisällön. Ja jos taulussa sattuu olemaan paljon dataa ja palvelussa paljon käyttäjiä samaan aikaan, niin soppa on valmis. Eri asia tietenkin on, jos noilla tiedoilla riveillä tehtäisiin jotain, mutta tässä tapauksessa riittää tieto, onko rivejä 0 vai enemmän.
Kun riittää tieto, onko rivejä vai ei, niin näkisin että ainoa järjellinen vaihtoehto kyselylle
select count(*) from Taulu
olisi joku tyyliin
select Id from Taulu limit 1
Niin paitsi LIMIT ei oo niin universaali kun COUNT(*) :) Siis ainakin MSSLQ:ssä pitäski sit kirjottaa SELECT TOP 1 FROM...
Jos nyt pysytään tässä threadissa, niin en usko tuon mysql_query() toimivan myöskään MSSQL:n kanssa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.