Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Tarkistusongelma

Sivun loppuun

Smuliii [11.02.2009 20:30:52]

#

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ä.

<?php
$tarkistus = mysql_query("SELECT * FROM `kayttajat` WHERE `tunnus` = '$sisalla[tunnus]' AND `taulu` IS NOT NULL") or die(mysql_error());

if($tarkistus) {
	echo "<meta http-equiv='Refresh' content='0; URL=sivu.php'/>";
}
?>

ajv [11.02.2009 20:37:59]

#

Mitäs tuo mysql_query() palauttikaan...?

Teuro [11.02.2009 20:47:24]

#

Mitäs tällainen koodi sanoisi

<?php
$tarkistus = mysql_query("SELECT kayttajat.taulu FROM `kayttajat` WHERE `tunnus` = '$sisalla[tunnus]'") or die(mysql_error());

if(mysql_result($tarkistus, 0, 0) > 0){
    echo "<meta http-equiv='Refresh' content='0; URL=sivu.php'/>";
}else{
  echo"<p>Ei siellä kentässä ole mitään!</p>";
}
?>

ajv [11.02.2009 21:02:06]

#

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';
}
?>

Teuro [11.02.2009 21:16:12]

#

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.

Smuliii [12.02.2009 19:46:23]

#

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.

ajv [12.02.2009 20:01:12]

#

Kantsii sit varmaan opetella debuggaamaan itse koodia, sillä enempää tässä ei voi ulkopuolinen noilla tiedoilla auttaa...

E: siivosin koodista tuon typon pois.

Smuliii [12.02.2009 20:14:34]

#

Jep, ei kai siinä muu auta kuin itse yrittää tehdä toimiva ratkaisu.

ajv [12.02.2009 22:31:43]

#

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

Vasta_alkaja [14.02.2009 00:39:17]

#

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.

<?php
$tarkistus = mysql_query("SELECT * FROM `kayttajat` WHERE `tunnus` = '$sisalla[tunnus]' AND (`taulu` IS NOT NULL OR `taulu` != ``)") or die(mysql_error());

if($tarkistus) {
    echo "<meta http-equiv='Refresh' content='0; URL=sivu.php'/>";
}
?>

ajv [14.02.2009 01:01:45]

#

Menee jankkaamisen puolelle, mutta tuossa Vasta_alkajan koodissa on taas kaikki ne aloitusviestin virheet, jotka tässä keskustelun kuluessa on saatu korjattua...

Smuliii [14.02.2009 22:26:46]

#

Nyt tuntuu tyhmältä kun en ennen tätä tajunnut mutta näinhän tämä ongelma ratkesi helposti:

<?php
$taulun_pituus = $sisalla[taulu];

$tauluntarkistus = (strlen($taulun_pituus)>0);

if($tauluntarkistus ) {
	echo "<meta http-equiv='Refresh' content='0; URL=sivu.php'/>";
}
?>

tesmu [15.02.2009 20:06:46]

#

Miten olisi

<?php
   mysql_query("SELECT * FROM juttu WHERE a='sejuttu' b='toinenjuttu'");
   if (mysql_affected_rows() == 0) {
       echo "Tyhjää täynnä :(";
   }
   else {
     echo "Kyllä siellä jotakin on";
   }
?>

Teuro [15.02.2009 20:14:41]

#

tesmu kirjoitti:

Miten olisi

<?php
   mysql_query("SELECT * FROM juttu WHERE a='sejuttu' b='toinenjuttu'");
   if (mysql_affected_rows() == 0) {
       echo "Tyhjää täynnä :(";
   }
   else {
     echo "Kyllä siellä jotakin on";
   }
?>

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.

ajv [15.02.2009 20:30:09]

#

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.

Grez [15.02.2009 20:42:14]

#

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

ajv [15.02.2009 21:24:31]

#

Niin paitsi LIMIT ei oo niin universaali kun COUNT(*) :) Siis ainakin MSSLQ:ssä pitäski sit kirjottaa SELECT TOP 1 FROM...

Grez [15.02.2009 23:15:05]

#

Jos nyt pysytään tässä threadissa, niin en usko tuon mysql_query() toimivan myöskään MSSQL:n kanssa.


Sivun alkuun

Vastaus

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

Tietoa sivustosta