Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Tiedon poistaminen tietokannasta

Sivun loppuun

latenleffahylly [21.04.2012 09:25:31]

#

Hei,

Viimeinen tehtäväni koskien työvuoronvaraus ohjelmaa olisi sen tarkistaminen perusteellisesti. En tullut ajatelleeksi että pelkkä tapahtuman poistaminen ei riitä vaan pitäisi poistaa myös varaus rivit (kyseinen tapahtuma)

else if($toiminto == "Poista" )
{
        $sql_lauseke = "DELETE FROM Tapahtuma WHERE T_Id = '" . $T_Id . "'";
        if( !$kysely = mysql_query($sql_lauseke))
    {
        echo "Virhe!";
    }
else
    {
        echo "Tiedot poistettu";
    }
}

Nyt SQL-lauseessa viitataan vain Tapahtuma tauluun, mutta voiko tehdä näin..

$sql_lauseke = "DELETE FROM Tapahtuma, Varaus WHERE T_Id = '" . $T_Id . "'";

Metabolix [21.04.2012 09:39:03]

#

Ei voi tehdä noin.

latenleffahylly [21.04.2012 09:48:19]

#

ok.. netistä tästä saa ristiriitaista tietoa (join)...

Tuota, miten saisin 2 muuttujaa tuonne sulkujen sisään (mielestäni pilkku ei riitä). if( !$kysely = mysql_query($sql_lauseke TOINEN MUUTTUJA ))

Metabolix [21.04.2012 10:11:58]

#

Et voi ajaa kahta kyselyä yhdellä mysql_querylla. Tarvitset kaksi mysql_querya.

Lisäys:

latenleffahylly kirjoitti:

ok.. netistä tästä saa ristiriitaista tietoa (join)...

No kysymyksessäsi et kysynyt, voiko käyttää JOINia, vaan länttäsit virheellisen kyselyn ja kysyit, toimiiko se. Monen taulun poistosta on esimerkkejä MySQL:n dokumentaatiossa. Tässä tapauksessa ei kuitenkaan ole mitään hyötyä käyttää monen taulun poistoa.

jukkah [21.04.2012 10:12:55]

#

http://dev.mysql.com/doc/refman/5.5/en/delete.html

latenleffahylly [21.04.2012 10:21:14]

#

Kiitos linkistä, olen toki tuon ennenkin nähnyt, mutta ymmärtäminen on sitten aivan eri juttu.. tutkitaan..

Lisäys:

-------------------------------------------------------------------------------
For the first multiple-table syntax, only matching rows from the tables listed before the FROM clause are deleted.

The effect is that you can delete rows from many tables at the same time and have additional tables that are used only for searching:
-------------------------------------------------------------------------------

- Onko tähän touhuun pakko ottaa mukaan tuo 3-taulu? Jotenkin itse tekisin niin että poistaisin tietoa taulusta 1 ja 2 jossa sama id-numero!?


DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

jukkah [21.04.2012 10:44:11]

#

Ei sillä kolmannella taululla tehdä mitään, kun on vain kaksi taulua. :)

Ota pois ylimääräiset osat ihan huoletta.

latenleffahylly [21.04.2012 10:56:15]

#

..mutta hetkinen, eikö Metabolix juuri kertonut, että 1 sql-lausetta ei voi tehdä jossa poistetaan tietoa 2 taulusta.. hmm..

no aloitan jotenkin näin:

DELETE t1, t2 FROM t1 INNER JOIN t2
WHERE t1.id=t2.id;

dartvaneri [21.04.2012 11:02:46]

#

Ja samalla kuin muokkaat tuota koodia, laita sisennykset kuntoon.

latenleffahylly [21.04.2012 11:05:56]

#

..luulin jo laittaneeni sisennykset kuntoon, onko jossain virallista mallia miten sisentää koodia oikein? (mielellään opettelisin)

dartvaneri [21.04.2012 11:12:11]

#

Jos itse sisentäisin tuon, sisentäisin sen näin:

else if($toiminto == "Poista" ){
	$sql_lauseke = "DELETE FROM Tapahtuma WHERE T_Id = '" . $T_Id . "'";
	if( !$kysely = mysql_query($sql_lauseke)){
		echo "Virhe!";
	}
	else{
        	echo "Tiedot poistettu";
	}
}

Elikkäs samaan if lauseseen tuleva else samalle kohtaa kuin if:kin, myös sulkeet samalle johdalle. Itse suosin sitä tyyliä, että laittaa tuon eka sulun tuon if lauseen perään, mutta se toki on miten tykkäät.

Ps. On tuo jo parempi kuin ne edelliset.

latenleffahylly [21.04.2012 11:17:56]

#

heh, juu.. voisin ottaa tuon sinun tyylin käyttöön. Nyt teen juuri 2 testitaulua, joissa kokeilen tuota SQL-lausettani, jolla yritän poistaa tapahtuman 1 ja tapahtuman 1 kaikki varaukset.

thänks dartvaneri!

dartvaneri [21.04.2012 11:24:05]

#

http://www.youtube.com/watch?v=lT8N85DRzZQ Katos tuo, tuosta voi olla vähän apua.

latenleffahylly [21.04.2012 11:43:33]

#

..katson myöhemmin, dankke!
----------------------------------------------------------

NYT:

DELETE Varaus, Tapahtuma FROM Varaus INNER JOIN Tapahtuma
WHERE Varaus.Tapahtuma_Id = 1;

- Miten saisin tuohon loppuun = Tapahtuma.T_Id <-sillä tavalla että tuo T_Id on 1. Tämä siis ihan testitarkoituksessa kun testaan phpMyAdminissa SQL-lauseen toimivuutta.

Metabolix [21.04.2012 11:49:47]

#

Oletkohan koskaan käyttänyt kyselyissä sanaa AND?

latenleffahylly [21.04.2012 12:00:34]

#

Noniin.. AND selkeytti asiaa kummasti.


Olen päätynyt seuraavaan koodin pätkään:

Tapahtuma_Id (1)
T_Id (1)

-------------------------------------------------------------------------------

$sql_lauseke = "DELETE Varaus, Tapahtuma FROM Varaus INNER JOIN Tapahtuma
WHERE Varaus.Tapahtuma_Id = Tapahtuma.T_Id AND Tapahtuma.T_Id = " . $T_Id . "";

Ainakin testauksessa toimii, uskaltaako laittaa valmiiseen ohjelmaan, mielestäni kyllä.

jukkah [21.04.2012 12:28:48]

#

Toinen "parempi" vaihtoehto on

INNER JOIN Tapahtuma
ON Varaus.Tapahtuma_Id = Tapahtuma.T_Id
WHERE Tapahtuma.T_Id = ...

Se ajaa ihan saman asian (en ole testannut).

latenleffahylly kirjoitti:

Ainakin testauksessa toimii, uskaltaako laittaa valmiiseen ohjelmaan...

Uskaltaa, kun testit on mennyt läpi... :)

latenleffahylly [21.04.2012 12:37:31]

#

PAHA ONGELMA JÄRJESTELMÄSSÄ!!!
---------------------------------------------------------------------------

Hei tuli se VIHO VIIMEINEN paha ongelma eteen! Eli kun halusin näyttää tapahtuman yhteydessä varattujen työvuorojen määrän niin ONGELMA!

Tapahtuma 1 ------------------tarve 5---------varattu 5
Tapahtuma 2 ------------------tarve 2---------varattu 1
Tapahtuma 3 ------------------tarve 10--------varattu 9


- Jos tapahtumaan ei ole vielä varattu työvuoroa -> tapahtuma ei näy listalla

$sql_lauseke = "SELECT Varaus.Tapahtuma_Id, COUNT(Varaus.Tapahtuma_Id), Tapahtuma.tStatus, Tapahtuma.T_Id, Tapahtuma.tNimi, Tapahtuma.tVuosi, Tapahtuma.tKuukausi, Tapahtuma.tPaiva, Tapahtuma.tViikonpaiva, Tapahtuma.tTarve, Tapahtuma.tAlkaa, Tapahtuma.tLoppuu, Tapahtuma.tSijainti
FROM Varaus
INNER JOIN Tapahtuma ON Varaus.Tapahtuma_Id = Tapahtuma.T_Id
WHERE Tapahtuma.tStatus = 'Tapahtumat'
GROUP BY Varaus.Tapahtuma_Id
ORDER BY tVuosi, tKuukausi, tPaiva, tNimi";

..Olen pulassa. Jaksatteko katsoa miten muutan SQL-lausetta? Onko se edes mahdollista!?

dartvaneri [21.04.2012 12:46:56]

#

latenleffahylly kirjoitti:

//..
"...AND Tapahtuma.T_Id = " . $T_Id . "";

Oothan varmasti tarkistanur $T_Id muuttujan oikeellisuuden(numerisuuden?), kun uskallat laitaa sen suoraan kyselyyn?

latenleffahylly [21.04.2012 12:53:04]

#

Harmittaa pahasti kun varausohjelma jo LIVEnä ja nyt sitten tuli tällanen ongelma. En osaa vastata dartvaneri sun kysymykseen. Luultavasti en??

Laitan koko koodin:

<?php
MUODOSTETAAN TIETOKANTAYHTEYS...

$sql_lauseke = "SELECT Varaus.Tapahtuma_Id, COUNT(Varaus.Tapahtuma_Id), Tapahtuma.tStatus, Tapahtuma.T_Id, Tapahtuma.tNimi, Tapahtuma.tVuosi,
Tapahtuma.tKuukausi, Tapahtuma.tPaiva, Tapahtuma.tViikonpaiva, Tapahtuma.tTarve, Tapahtuma.tAlkaa, Tapahtuma.tLoppuu, Tapahtuma.tSijainti
FROM Varaus
INNER JOIN Tapahtuma ON Varaus.Tapahtuma_Id = Tapahtuma.T_Id
WHERE Tapahtuma.tStatus = 'Tapahtumat'
GROUP BY Varaus.Tapahtuma_Id
ORDER BY tVuosi, tKuukausi, tPaiva, tNimi";

$kysely = mysql_query($sql_lauseke) or die(mysql_error());

echo '<table>
<tr><th>tapahtuma</th><th>pvm</th><th>klo</th><th>sijainti</th><th>tarve</th><th></th><th></th></tr>
<tr><td colspan="6"><div class="hrFull3"></div></td></tr>';

while($rivi = mysql_fetch_row($kysely)){

echo '<tr>';
echo "<td style='padding:3px 0px;'><a href='http://X.fi/?page_id=42&amp;T_Id=" . $rivi[0] . "'>" . $rivi[4] . "</a></td>
<td>" . $rivi[8] . " " . $rivi[7] . "." . $rivi[6] . "." . $rivi[5] . "</td>
<td>" . $rivi[10] . "-" . $rivi[11] . "</td>
<td>" . $rivi[12] . "</td>
<td><strong>" . $rivi[9] . "</strong></td>
<td><span class='red'><strong>" . $rivi[1] . "</strong></span></td>
<td><a href='http://X.fi/?page_id=40&amp;T_Id=" . $rivi[0] . "'><img src='http://X.fi/kuvat/info13.gif' alt='img' width='13' height='13' border='0' title='Avaa tapahtumainfo'></a></td>
";

echo '</tr>';
}
echo '</table>';

?>

ONGELMA ON ERITTÄIN PAHA JA KIIREINEN KIITOS KAIKILLE AVUSTA!

Lisäys:

---------------------------------------------------------------------

Huom!

Varauksen poistaminen ok!

-> Nyt tuli paha ongelma kun yritän näyttää kaikki tapahtumat. Ei näy sellainen tapahtuma jossa varauksia 0 kpl

Lisäys:

------------------------------------------------------------------

Voisiko tässä kohtaan käyttää OR <- arvoa

WHERE Tapahtuma.tStatus = 'Tapahtumat'


WHERE Tapahtuma.tStatus = 'Tapahtumat' OR "Tapahtumien määrä 0"

Lisäys:

$sql_lauseke = "SELECT Varaus.Tapahtuma_Id, COUNT(Varaus.Tapahtuma_Id), Tapahtuma.tStatus, Tapahtuma.T_Id, Tapahtuma.tNimi, Tapahtuma.tVuosi,
Tapahtuma.tKuukausi, Tapahtuma.tPaiva, Tapahtuma.tViikonpaiva, Tapahtuma.tTarve, Tapahtuma.tAlkaa, Tapahtuma.tLoppuu, Tapahtuma.tSijainti
FROM Varaus
INNER JOIN Tapahtuma ON Varaus.Tapahtuma_Id = Tapahtuma.T_Id
WHERE Tapahtuma.tStatus = 'Tapahtumat'
GROUP BY Varaus.Tapahtuma_Id
ORDER BY tVuosi, tKuukausi, tPaiva, tNimi";

Lisäys:
Tästä SQL-lauseesta johtuen myöskään tapahtumaa ei voida poistaa - kun varauksia 0 kpl. Jos joku ehtisi tätä katsoa. Ongelma se että koko muu TYÖVUORON VARAUS Sovellus täysin kunnossa, mutta tähän SQL-lauseeseen pitäisi saada apua.


ONGELMAT:

- Kun varausten määrä 0 -> tapahtuma ei näy Tapahtumat-sivulla
- Tapahtumaa ei voi poistaa kun varausten määrä 0 kpl

huoh.. mikä avuksi. (sanon sen vielä että en halua kuormittaa teitä, mutta kun tässä lopputarkistuksessa eilen tekemäni päivitys aiheuttaakin tämän niin huh)

- luulin että tänään ei tarvitsisi koodata yöhön saakka.

jaketsu [21.04.2012 13:32:27]

#

Sinulla on nyt niin monta eri viestiketjua tästä samasta projektista, että ainakaan minä en ole kärryillä tietokantasi rakenteesta. Muistaakseni tuo "Tapahtuma.tStatus = 'Tapahtumat' " tarkoittaa tulossa olevaa tapahtumaa, johon voi vielä varata paikan. Halunnet siis kannasta ulos ne tapahtumat, joihin voi varata paikan ja joissa on varauksia tällä hetkellä nolla tai enemmän. Mikä ja missä tuo "Tapahtumien määrä" on, ja mitä se sisältää milläkin hetkellä? Oletko kokeillut INNER JOINin tilalla LEFT tai RIGHT JOIN? Noiden vaikutus tapauksessasi on tietokannan rakenteesta kiinni.

Et ole muistaakseni vieläkään lukenut mitään oppaita tähän liittyen. Ohjelmointiputkalla on aika hyvä perusopas, joka kyllä kannattaa sinunkin käydä läpi.

ohjelmointiputka kirjoitti:

Ongelmana on, että jos tuote ei esiinny lainkaan taulussa tarjoukset, sitä ei valita koskaan mukaan tauluista tuotteet ja tarjoukset muodostettaviin rivipareihin.
Ratkaisu on käyttää merkintää JOIN, joka on vaihtoehtoinen tapa yhdistää tietoa eri tauluista. Siinä voi käyttää lisämerkintöjä LEFT ja RIGHT, jotka tarkoittavat, että vasemmasta tai oikeasta taulusta otetaan mukaan myös rivit, joilla ei ole vastinetta toisessa taulussa.

MySQL ja PHP

latenleffahylly [21.04.2012 15:37:02]

#

Hei jaketsu aloitin uuden, TOIVOTTAVASTI viimeisen ketjun koskien ohjelmaani.. Kokeilin Joinit läpi, ei muutosta.. luin ja luen putkan opasta, mutta tämä ongelma on tähtitiedettä minulle..

Lisäys: Valoa tunnelin päässä kiitos RIGHT JOIN -parametrin...


Sivun alkuun

Vastaus

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

Tietoa sivustosta