Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kirjautuneen käyttäjän varmistus

Sivun loppuun

Sopetus [08.10.2019 12:27:05]

#

Tarvitsen apua. Projektissani on kirjautuminen ja pitäisi saada session avulla postaukset listattua kyseiselltä käyttäjältä, kun käyttäjä kirjautuu.

Tässä on tietokantaa:

Posts
-id, title, user_id...

Users
-id, username...


Toinen ongelma on kun käyttäjä avaa postauksen esim. posts.php?id=1234.
Sitä pääsee kuka tahansa lukemaan. Millä tavalla tämä estetään?

Eli siis, että tietyn käyttäjän id täsmää postauksessa olevaan user_id.?
Ja jos käyttäjä on väärä se ilmoittaisi ettei ole lukuoikeutta.
Tätä tarvitsen myös siihen, että käyttäjä haluaa muokata postaustaan ettei sitä pääse kuka tahansa tekemään.

Voisinko saada apuanne PDO:lla kiitos!

Grez [08.10.2019 12:46:47]

#

Jos sessiossa on käyttäjäID vaikkapa avaimella 'UserId' niin

(En osaa sanoa vatiiko käyttämäsi tietokanta taulujen ja kenttien nimien ympärille jotain, kun en tiedä mikä kanta on kyseessä. Jotkut vaatii jos esim nimissä on isoja kirjaimia yms.)

Ensimmäinen:

	$kysely = $db->prepare("select * from Posts WHERE user_id=?");
    $kysely->execute([$_SESSION['UserId']]);

Toinen:

//Näytettävä postaus on luettu muuttujaan $post
if ($post['user_id'] != $_SESSSION['UserId']) { die('ettei ole lukuoikeutta.'); }

Sopetus [08.10.2019 13:09:39]

#

Kiitos paljon avusta. Sain toimimaan tuon ensimmäisen kyselyn.

Voisitko auttaa vielä tuossa toisessa?
Eli siis minkä sisälle tulee sisältö, joka näkyy vain tietylle käyttäjälle.

Teuro [08.10.2019 13:20:32]

#

Posts sivulle ilmeisesti saa itse syöttää sellaisen id-numeron, kun vain haluaa. Esimerkissäsi posts.php?id=1234. Tällöin tarkistat onko $_SESSION['UserId'] sama kuin $post['id'] mikäli ne ovat samat, niin näytät käyttäjän postaukset. Mikäli ne eivät täsmää, niin näytät virheilmoituksen.

Grezin esimerkissä se on toteutettu die-funktiolla, mutta yhtä lailla voit näyttää tyylikkään virheilmoituksen kirjoittamalla sopivan virheilmoituksen else-haaraan.

EDIT $_GET -> $post

if ($post['user_id'] == $_SESSSION['UserId']) {
	/** Näytä postaukset **/
} else {
	/** Näytä virheilmoitus **/
}

Sopetus [08.10.2019 13:37:04]

#

Kiitos Teuro, mutta en osaa hyödyntää koodiasi projektissani.

Teuro [08.10.2019 14:02:16]

#

Tuota $_GET-muuttujaa ei varmasti tarvita mihinkään, koska sen pitäisi olla tismallenen sama kuin $_SESSION['UserId']. Tai siis millä muulla id-numerolla pitäisi saada jotakin muuta kuin virheilmoitus? Oikeastaan laitat vain sivun nykyisen postauksien tulostusosan tuohon /** Näytä postaukset **/ paikalle, niin asian pitäisi olla kunnossa. /** Näytä virheilmoitus **/ kohtaan voit kirjoittaa sopivan virheilmoituksen samaan tapaan kuin muunkin sivun html-koodin.

Tuntematta sivun totetustapaa on toki hankala antaa tämän parempaa ohjetta. Jos kuitenkin posts.php sivu tulostaa oikeat postaukset, niin ei tämän muutoksen pitäisi olla kovin hankala toteuttaa.

Sopetus [08.10.2019 14:15:21]

#

Kiitos kun olet yrittänyt auttaa.

vesikuusi [08.10.2019 14:32:40]

#

Sopetus kirjoitti:

Jos mahdollista niin voisitko tehdä valmiin koodin, jossa tietokantayhteys ja tietokantakysely ja muu tarpeellinen niin pääsisin vähän testailemaan.

Lähettäisitkö tänne keskusteluun sen koodin (posts.php), minkä olet tähän mennessä kirjoittanut niin voimme yhdessä pohtia mihin väliin muutokset tulee sijoittaa?

Sopetus [08.10.2019 14:41:42]

#

Minulla ei ole varsinaista posts.php koodia.

No jos koodi olisi vaikka tälläinen. Saako tästä tehtyä?

<?php
include("yhteys.php");

$kysely = $yhteys->prepare("SELECT * FROM posts WHERE id = ?");
$kysely->execute(array($_GET["id"]));

$tulos = $kysely->fetch();

?>

Jos tähän saisi jonkinlaisen tietokantakyselyn posts-tietokantaan?

if ($post['user_id'] == $_SESSSION['UserId']) {
	/** Näytä postaukset **/
} else {
	/** Näytä virheilmoitus **/
}

Teuro [08.10.2019 15:20:30]

#

Olisiko silti järkevämpi hakea tuolla sessiossa olevalla käyttäjän id-numerolla, eikä satunnaisella käyttäjän antamalla syötteellä. Tällä tekniikalla pääsisit eroon mahdollisesti epävarmasti muuttujasta ja voisit luottaa sessiossa olevan sen id-numeron, jonka olet sinne kirjautumisen yhteydessä laittanut.

<?php
include("yhteys.php");

$kysely = $yhteys->prepare("SELECT * FROM posts WHERE id = ?");
$kysely->execute(array($_SESSION["UserId"]));

$tulos = $kysely->fetch();
?>

Nyt sinulla olisi iterointia varten valmis taulukollinen postauksia, jotka liittyvät juuri tähän käyttäjään.

Grez [08.10.2019 15:24:20]

#

Teuro kirjoitti:

$kysely = $yhteys->prepare("SELECT * FROM posts WHERE id = ?");

Tuossa tosin pitäisi varmaan olla id tilalla user_id

Sopetus [08.10.2019 15:25:47]

#

En tiedä mikä on järkevää, mutta miten voida lukea postausta siten, ettei sitä näe muut kuin tietty käyttäjä. posts.php?id=1234

if ($post['user_id'] == $_SESSSION['UserId']) {
	/** Näytä postaukset **/
} else {
	/** Näytä virheilmoitus **/
}

Teuro [08.10.2019 15:31:24]

#

Se onnistuu vallan hyvin vertaamalla annettua syötettä kirjatumisen yhteydessä haettuun käyttäjän id-numeroon. Vertaaminen onnistuu helposti vaikkapa näin:

<?php

if ($_SESSION['UserId'] == $_GET['id'])

Toki $_GET-muuttujan sisältö on syytä varmistaa ja selvittää onko sitä ylipäätään asetettu. En kuitenkaan oikein ymmärrä mihin tuota $_GET-muuttujaa tarvitaan, kun meillä on jo tiedossa oikea id-numero. Tällöin kaikki käyttäjät katselevat postauksiaan sivulta posts.php.

Sopetus [08.10.2019 15:41:17]

#

En minäkään ymmärrä tätä.

Kun käyttäjä avaa postauksen: post.php?id=1234 ja posts taulussa on user_id eli tietty postaus kuuluu tietylle käyttäjälle. Jollain tavalla se on sieltä posts-taulusta tarkaatettava.??
Ja jos avaa post.php?id=1235 ja se kuuluu toiselle käyttäjä se ilmoittaa ettei siihen ole lukuoikeutta...

Grez [08.10.2019 15:53:55]

#

Niin siis tee sen postauksen lukeminen aivan kuten tekisit sen ilman käyttäjätarkistusta, ja sen jälkeen lisää siihen tuo käyttäjätarkistus, esim. kuten minun viestissäni [08.10.2019 12:46:47] tai kuten Teuron viestissä [08.10.2019 13:20:32].

The Alchemist [08.10.2019 16:06:07]

#

Teuro on kyllä nyt ihan pihalla. Luonnollisesti se url-muuttuja esittää postauksen ID-numeroa eikä suinkaan käyttäjän tunnistetta.

Jos lukuoikeus on rajoitettu vain postauksen omistavalle käyttäjälle, niin silloin pitää joko hakea kannasta avainparilla (post_id, user_id) tai ensin hakea postauksen tiedot ja sitten vertailla, onko sen omistava käyttäjä sama kuin kirjautuneena oleva käyttäjä, joka yrittää postausta avata.

Ensin mainittu tapa on suorituskyvyltään hieman parempi mutta silloin ei voi erottaa sitä, onko postausta ollenkaan olemassa vai kuuluuko se eri käyttäjälle. Jos kyse on "supersalaisesta" tiedosta, jonka olemassaoloa ei haluta paljastaa muille käyttäjille, niin silloin tällä ei ole väliä.

Usein on kuitenkin havainnollisempaa kertoa käyttäjälle, ettei hänellä vain ole pääsyoikeutta tietoihin, jolloin autentikointi tulee tehdä hakemalla postaus ensin ja sitten varmistamalla sen omistajuus, jolloin voidaan antaa täsmällisempi virheilmoitus todellisen virheen mukaisesti.

Sopetus [08.10.2019 16:12:49]

#

Yritin tehdä sitä tällä tavalla. En saanut toimimaan. Antoi Virheen. Onko tässä koodissa jotain vikaa?

<?php
include("yhteys.php");

$kysely = $yhteys->prepare("SELECT * FROM posts WHERE id = ?");
$kysely->execute(array($_GET["id"]));

$tulos = $kysely->fetch();

if ($tulos['user_id'] == $_SESSSION['UserId']) {
	/** Näytä postaukset **/

	echo "<p>Tuotteen nimi: " . htmlspecialchars($tulos["nimi"]) . "</p>";
	echo "<p>Tuotteen hinta: " . htmlspecialchars($tulos["hinta"]) . "</p>";

} else {
	/** Näytä virheilmoitus **/
	echo "<p>Virhe</p>";
}
?>

Voisiko joku auttaa miten saa toimivan systeemin?

The Alchemist [08.10.2019 16:14:44]

#

Laita virheraportointi päälle. Aloita siitä. Sen jälkeen voit opetella korjaamaan itse komentotulkin ilmoittamat virheet.

Sinun täytyy myös tajuta se, että on todella epäkunnioittavaa tulla tänne selvästi rikkinäisen koodin kanssa ja sanoa vain: ei toimi, missä vika. Kerro nyt helvetti aluksi, että minkä virheen se antoi. Luitko itse sen virheviestin? Miten yritit korjata sitä ensin itse?

Edit: niin, ilmeisesti se vain tulosti "Virhe", koska käskit sen tulostaa niin. Php:n virheilmoituksia et ole nähnyt, koska yrität koodata tuotantotilassa. Laita php näyttämään virheviestit kuten kuuluisi.

Teuro [08.10.2019 16:18:47]

#

The Alchemist kirjoitti:

Teuro on kyllä nyt ihan pihalla. Luonnollisesti se url-muuttuja esittää postauksen ID-numeroa eikä suinkaan käyttäjän tunnistetta.

Olen kyllä aavistuksen eri mieltä, kun sivun nimi on posts.php, eli monikossa postaukset. Tällöin GET-muuttujassa oleva id-numero on syytä olettaa olevan nimenomaan käyttäjän id-numero.

Lisäys:

Sopetus kirjoitti:

Voisiko joku auttaa miten saa toimivan systeemin?

Sinun pitäisi ajaa tuo koodi silmukassa, jotta käsittelisit koko tulosjoukon. Tuo koodi ottaa tulosjoukon ensimmäisen ja jos tulosjoukossa oleva kirjoittajan tunnus ei ole sama kuin sessioon tallennettu käyttäjän tunnus, niin koodi tulostaa sanan Virhe.

Nyt olisi varmasti syytä varmistua siitä, että tuolta tietokannasta tulee jotakin dataa ulos ja että sessiomuuttujassa on tallennettu jotakin. Lisäksi pitää opetella iteroimaan kannasta tullútta tulosjoukkoa jollakin sopivalla silmukalla. Tässä tapauksessa while olisi varmasti mukavin.

Grez [08.10.2019 16:33:01]

#

Teuro kirjoitti:

Olen kyllä aavistuksen eri mieltä, kun sivun nimi on posts.php, eli monikossa postaukset.

Aika pitkälle menevä johtopäätös aloittavan koodarin sivujen nimeämiskäytännöstä :D

Mut joo, loogisempi nimi olisi varmaan post.php ja jos tosiaan on tarkoitus näyttää käyttäjän kaikki viestit niin vaikka my_posts.php (tai jos se olisi pelkkä posts.php niin sitten voisi ajatella että parametrina voisi olla esim. user_id tai author_id eikä vaan pelkkä id)

Sopetus [08.10.2019 16:44:51]

#

Tälläisellä tulee dataa ulos tietokannasta.

<?php
include("yhteys.php");

$kysely = $yhteys->prepare("SELECT * FROM posts WHERE id = ?");
$kysely->execute(array($_GET["id"]));

$tulos = $kysely->fetch();

echo "<p>Tuotteen nimi: " . htmlspecialchars($tulos["nimi"]) . "</p>";
echo "<p>Tuotteen hinta: " . htmlspecialchars($tulos["hinta"]) . "</p>";
?>

Miten saada se niin, ettei muut käyttäjät pääse lukemaan postausta??
Tähän olen hakenut vastausta jo pidemmän aikaa täällä.

Miten tällä saa toimimaan?

if ($post['user_id'] == $_SESSSION['UserId']) {
	/** Näytä postaukset **/
} else {
	/** Näytä virheilmoitus **/
    echo "<p>Virhe</p>";
}

Grez [08.10.2019 16:47:23]

#

<?php
include("yhteys.php");

$kysely = $yhteys->prepare("SELECT * FROM posts WHERE id = ?");
$kysely->execute(array($_GET["id"]));

$tulos = $kysely->fetch();

if ($tulos['user_id'] == $_SESSSION['UserId']) {
    echo "<p>Tuotteen nimi: " . htmlspecialchars($tulos["nimi"]) . "</p>";
    echo "<p>Tuotteen hinta: " . htmlspecialchars($tulos["hinta"]) . "</p>";
} else {
	/** Näytä virheilmoitus **/
    echo "<p>Virhe</p>";
}
?>

Sopetus [08.10.2019 16:58:35]

#

Grez, tuolla koodilla tulee virheilmoitus.
Voiko olla mahdollista, että tietokannassa on joku vika ettei tämä toimi?
Mikä on hyvä user_id ? minulla on nyt siellä tyyppinä text ja vaihdoin int(8) mutta ei siltikään toimi..

Onko tähän mitään ratkaisua?

Grez [08.10.2019 17:10:15]

#

No tuossahan se "Virhe" -ilmoitus tulee jos tietokantarivin user_id on eri kuin $_SESSION:ssa oleva UserId. Eli looginen etenemistapa olisi varmaankin varmistaa kumpi näistä on jotain muuta kuin mitä kuvittelet.

Sopetus [08.10.2019 17:17:14]

#

No tulostin sivulle session ID:n ja user_id ja sama numero sieltä tulee.
Ja session UserId nimi on sama kuin käyttäjät tietokanta taulussa id..

Metabolix [08.10.2019 17:20:28]

#

Tässä varmaan auttaisi huomattavasti, jos koodiin kirjoittaisi _SESSION eikä _SESSSION. Kannattaa koodia kirjoittaessa myös laittaa käyttöön PHP:n virheilmoitukset, niin tällaisista virheistä tulee selvä viesti.

Grez [08.10.2019 17:21:22]

#

Heh, melkoista. Näköjään olin typottanut tuon ekaan vastaukseen ja kaikki sen jälkeen copy&pastennut sen virheellisenä :D

Nää on just sellaisia virheitä joiden kanssa ei koskaan joudu itse "tappelemaan" koska osaa laittaa virheilmoitukset näkyville ja ymmärtää mitä ilmoituksissa sanotaan.

Sopetus [08.10.2019 17:24:15]

#

Kiitos Metabolix. Nyt toimii.

The Alchemist [09.10.2019 04:45:03]

#

Teuro kirjoitti:

The Alchemist kirjoitti:

Teuro on kyllä nyt ihan pihalla. Luonnollisesti se url-muuttuja esittää postauksen ID-numeroa eikä suinkaan käyttäjän tunnistetta.

Olen kyllä aavistuksen eri mieltä, kun sivun nimi on posts.php, eli monikossa postaukset. Tällöin GET-muuttujassa oleva id-numero on syytä olettaa olevan nimenomaan käyttäjän id-numero.

Ihan hullua. Kuka tahansa mitään koskaan koodannut osaa nähdä suoraan sen olevan postauksen ID-numero. Kooditiedostossa voi olla ja pitäisikin olla useampia eri käsittelijöitä / endpointteja sen sijaan, että jokaiselle nettiin ilmestyvälle sivulle olisi myös oma php-tiedostonsa.

Alkeellinen esimerkki:

if (isset($_GET['id'])) {
    show_post($_GET['id']);
} else {
    list_all_posts();
}

Sopetus [10.10.2019 09:08:01]

#

En avaa uutta keskustelua tähän kysymykseen.

<?php
include("yhteys.php");

$kysely = $yhteys->prepare("SELECT * FROM posts WHERE id = ?");
$kysely->execute(array($_GET["id"]));

$tulos = $kysely->fetch();

if ($tulos['user_id'] == $_SESSION['UserId']) {
    echo "<p>Tuotteen nimi: " . htmlspecialchars($tulos["nimi"]) . "</p>";
    echo "<p>Tuotteen hinta: " . htmlspecialchars($tulos["hinta"]) . "</p>";
} else {
	/** Näytä virheilmoitus **/
    echo "<p>Virhe</p>";
}
?>

Miten tätä koodia voisi muuttaa siten, että kyselyssä on vaikka esimerkiksi active = '1' ja jos se on jotain muuta se antaisi tuon virheen. (Tähän ei tarvitse session.)

Toinen on, että kun käyttää: htmlspecialchars. Tekstissä ei pysty käyttämään esimerkiksi <br>...

Grez [10.10.2019 09:29:21]

#

Saanko kysyä että miksi sinä ylipäätään teet tuota projektia, jos et aio tehdä yksinkertaisimpiakaan asioita itse. (Ja ei, copy-pasteamista en nyt laske yksinkertaiseksi asiaksi jonka itse tekemisestä antaisin kunniaa)

Opiskele vaikka SQL-perusteet (en osaa suositella mitään mutta nopealla googletuksella löysin tämän http://webd.savonia.fi/home/ktrasse/muut/visbas/kappale16.htm , joku muu suositelkoon parempaa jos tietää), niin tiedät miten kyselyyn lisätään active='1'

Sopetus kirjoitti:

Toinen on, että kun käyttää: htmlspecialchars. Tekstissä ei pysty käyttämään esimerkiksi <br>...

Tähän pätee ihan sama, eli jos ymmärtäisit yhtään PHP:stä, niin saisit tuon htmlspecialchars -funktion itse poistettua (mikäli siis haluat näyttää tietokannassa olevan html-koodin sellaisenaan). Täältä putkastakin löytyy PHP-opas, joskin se on 8 vuotta vanha. Mutta ehkä sen käymällä läpi ymmärtäisi mitä PHP tekee ja miten sitä käytetään. https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=php_01 Joku muu voi taas suositella parempaa jos tietää.

Sopetus [10.10.2019 09:43:16]

#

Kyselyn olen tehnyt näin:

$kysely = $yhteys->prepare("SELECT * FROM posts WHERE active = '1' AND id = ?");

Sen haluasin tietää miten saa tuon virheen otettua käyttöön?

if ($tulos['user_id'] == $_SESSION['UserId']) {
    echo "<p>Sisältö, joka näkyy kun active='1'</p>";

} else {
	/** Näytä virheilmoitus **/
    echo "<p>Virhe</p>";
}

Olen poistanut htmlspecialchars käytöstä, mutta tuolla suositellaan sen käyttöä.
https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=php_13

Grez [10.10.2019 11:33:13]

#

No niin, kysely näyttää ihan järkevältä, hienosti sait sen itsekin tehtyä!

Tällä hetkellä tuo kysely ei välttämättä palauta yhtään riviä (eli jos annettu id ei ole tietokannassa tai se ei ole aktiivinen). Eli voisit muuttaa tuon if-rivin seuraavaan muotoon, niin se antaisi "Virhe" -ilmoituksen myös noissa tapauksissa:

if ($tulos!==false && $tulos['user_id'] == $_SESSION['UserId']) {

Eli jos katsot tuon PDO fetch() -funktion dokumentaatiota, siellä kerrotaan että se palauttaa arvon false, jos riviä ei ole luettavissa.

Lisäys:

Sopetus kirjoitti:

Olen poistanut htmlspecialchars käytöstä, mutta tuolla suositellaan sen käyttöä.
https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=php_13

Niin, jos työnnät tietokannassa olevaa HTML:ää käyttäjälle sellaisenaan, niin sinun täytyy tietenkin huolehtia siitä että tietokantaan tallennettu html on turvallista.

Jos tietokantaan voi tallentaa noita arvoja esimerkiksi vain ylläpitäjät (jotka voisivat muutenkin muuttaa sivuston koodia) niin silloin tietenkin asia on kunnossa. Jos taas sivuston loppukäyttäjät voivat syöttää noita arvoja, niin silloin täytyy palvelinpäässä suodattaa sieltä pois kaikki tuhmuudet ja tämän tekeminen aukottoman tietoturvallisesti on vaikeaa. Sen takia oppaassa suositellaan käyttämään htmlspecialcharsia, koska useinkaan tuon oppaan lukijoilla ei ole kompetenssia toteuttaa kunnolla toimivaa suodattamista.

Jos loppukäyttäjät voivat syöttää muille käyttäjille näkyvää html-koodia ilman suodatusta, niin pahantahtoinen käyttäjä voi työntää joukkoon esimerkiksi javascriptiä, joka sitten ajetaan toisen käyttäjän selaimessa kuin se olisi osa sivustoasi. Tämä taas voi mahdollistaa esimerkiksi toisen käyttäjän istunnon kaappaamisen, eli hakkeri voisi suht helposti päästä käyttämään järjestelmääsi muiden käyttäjien tunnuksilla.

Sopetus [10.10.2019 12:03:44]

#

Miten tuota if-riviä voi muuttaa?

if ($tulos!==false && $tulos['user_id'] == $_SESSION['UserId']) {

Grez [10.10.2019 12:30:57]

#

Sopetus kirjoitti:

Miten tuota if-riviä voi muuttaa?

Sitähän voi muuttaa ihan miten tarpeelliseksi katsoo. Jos kopioit jotain koodia jostain, niin silloin pitäisi ymmärtää mitä se tekee.

Eli jos nyt sitten muuttaisit if-rivin tällaiseen muotoon:

if ($tulos!==false) {

niin se ei tekisi user_id ja SESSION vertailua. Huomaatko, että ihan vaan yksinkertaisesti poistin sen user_id ja SESSION -vertailun? Vai kopioitko vain tuon valmiiksi muokkaamani rivin koodiisi ja olet tyytyväinen kun se toimii etkä opi mitään?

vesikuusi [10.10.2019 13:21:29]

#

Putkan MySQL ja PHP opas on varmasi ihan hyvä myös alkuun, vaikka onkin aika vanha. Perusteet oppii ja pitää mielessä että MySQL ja PHP on hieman päivittynyt eli manuaalien tarkistaminen voi välillä olla hyvä idea. Kannattaa myös etsiä netistä jotain tyyliin "MySQL PHP forum|blog tutorial"

The Alchemist [11.10.2019 05:04:45]

#

"Blogitutoriaaleja" googlettamalla ei löydä kuin paskaa valitettavasti. Oikeaan web-devaukseen liittyy niin paljon oheisteknologioita ja php:n vakiokirjaston ulkopuolisia abstraktioita, ettei niitä voi pusertaa yhteen tutoriaaliin.

Ei sillä ole mitään väliä, onko koodaamassa blogia, foorumia vai kissakuvagalleriaa, kun ne kaikki toimivat hyvin pitkälti samanlaisella koodilla. Alle vaan joku valmis framework ja sen käyttöä opiskelemaan.

En ole varma, kannattaako mitään pdo:ta edes oppia tuntemaan, koska hyvin helposti homma menee sitten siihen, että käyttäjä ei oikein löydä oikeaa tapaa tehdä asiaa valitun freimiksen puitteissa mutta tietää, kuinka se tehdään "vanilla php:llä", jolloin hän ohittaa freimiksen ja kirjoittaa sitä surkeaa paskaa freimiksen koodin kylkeen ja sotkee koko homman.

vesikuusi [11.10.2019 12:26:09]

#

The Alchemist kirjoitti:

Alle vaan joku valmis framework ja sen käyttöä opiskelemaan.

No voihan tuokin toimia perusteiden opettelussa. Tässä on kuitenkin selvää, että OP:lle olisi tärkeintä oppia ohjelmoinnin perusteita ja en ole varma, kuinka paljon joku valmis framework auttaa siinä. Toki voidaan argumentoida myös että ovatko MySQL ja PHP siihen sopiva valinta myöskään, mutta tämä tuntuu olevan nyt se mitä OP haluaa tai on pakotettu koodaamaan. Parhaiten tietty oppii kun tekee jotain mikä on itsestä kiinnostavaa.

The Alchemist [11.10.2019 12:34:29]

#

Eipä siinä pahemmin auta sekään, että tuskaillaan miten joku $_SESSION-muuttuja pitäisi kirjoittaa tai että kuinka SQL-kyselyitä käytetään, kun niillä ei ole mitään tekemistä varsinaisen ohjelmoinnin kanssa. Ne eivät myöskään auta sen freimiksen opettelussa, koska juuri tuollaiset matalan tason / purkanomaiset jutut on abstrahoitu niissä piiloon.

Olen jo pariin kertaan meinannut kirjoittaa, että jostain syystä php-aloittelijat lähtevät aina ensimmäisenä räpläämään tietokantoja ja tuskailemaan tietokanta-arkkitehtuurien ja sql-kielen kanssa vaikka tarkoitus on ollut opetella php:tä.

Tätä voi verrata uimisen opetteluun. Jos ei ole malttia opetella kahluualtaassa php:n alkeita vaan haluaa suoraan syvään päähän, niin silloin on kaikista typerintä valita luonnonvarainen joki uimahallin sijaan, missä sentään valvottaisiin sinua viisaampien ihmisten toimesta.

Metabolix [11.10.2019 18:38:08]

#

Sopetus kirjoitti:

Tässä siis tarvitaan SESSION.

Nyt en ymmärrä ollenkaan, miten olet tullut tähän johtopäätökseen. Jos haluat tutkia H-kirjainta, tarvitset H-kirjainta etkä istuntoa. Eli koodin pitäisi näyttää esimerkiksi tältä:

$kysely = $yhteys->prepare("SELECT * FROM users WHERE user_type = 'H' ");
$kysely->execute();

$tulos = $kysely->fetch();

if ($tulos['user_type'] == 'H') {
    echo "<p>Toimii</p>";
}

Sinun pitäisi ihan oikeasti opetella jonkinlaiset alkeet ohjelmoinnista, jotta näissä kysymyksissä olisi edes jokin logiikka.

morderca [11.10.2019 18:41:00]

#

En nyt tarkemmin jaksa tutkia tahi antaa valmista koodia, mutta koita tuon virheen yhteydessä tulostaa user_type sekä UsersType ja selvittää itse, että mitä pielessä. Veikkaan, että sulla ei tietokannassa ole yhtään tulosta, missä user_type olisi "H"

Sopetus [11.10.2019 18:55:14]

#

Tässä kysyin sitä, että user_type sarakkeessa voi olla muitakin kirjaimia. Ja SESSION tulisi se kirjain ja jos se on vaikka H tulisi toimii ja on joku muu kirjan virhe. Tämä siis tapahtuu session.

The Alchemist [11.10.2019 19:30:38]

#

No ei siellä hemmetti voi olla muita kirjaimia, kun sql-kyselyssä olet juuri hakenut vain ne rivit, missä on H-kirjain. Tässä touhussa ei ole enää mitään järkeä, kun ilmeisesti keräilet koodinpalasia useilta eri foorumeilta ja yrität liimailla niitä yhteen jälleen muilta foorumeilta haettujen "vinkkien" mukaan. Ilmeisesti tässä ei ole sinun omaa panostasi ollenkaan enää mukana, koska mitä pidemmälle projekti etenee, sitä pahemmin näytät olevan pihalla sen toiminnasta.

Sitä paitsi usein näissä nyyppien ongelmissa pätee sellainen ohjenuora, että sen sijaan että kysyt miksi koodisi on rikki, sinun pitäisi kysyä, miten haluamasi asia on järkevää tehdä. Koska tuo tapa ainakin on kaikista typerin tapa siihen, mitä ikinä olet tekemässäkään. Perimmäistä tarkoitusta ei tarvitse edes tietää tämän sanomiseen.

Metabolix [11.10.2019 19:31:47]

#

Ei tuosta selityksestä saa mitään kokonaiskuvaa ongelmastasi.

Sopetus kirjoitti:

Tässä kysyin sitä, että user_type sarakkeessa voi olla muitakin kirjaimia.

Tämä on selvä.

Sopetus kirjoitti:

Ja SESSION tulisi se kirjain ja jos se on vaikka H tulisi toimii ja on joku muu kirjan virhe. Tämä siis tapahtuu session.

Tämäkin vaikuttaa selvältä:

if ($_SESSION["UsersType"] == "H") {
  echo "Toimii";
}

Mutta epäselväksi jäi, miten tämä asia sitten liittyi tietokantaan.

Jos nyt maagisesti H-kirjain oli täysin hämäystä ja tarkoitus oli sittenkin vertailla vain tietokantaa ja istunnossa olevaa arvoa, niin silloin H-kirjain pitää ottaa koodista pois ja pitää käyttää kyselyssä ?-merkkiä niin kuin aina ennenkin, eli user_type = ?. Kysely palauttaa kaikki käyttäjät, joilla on oikea kirjain.

Jos haluat tarkistaa, onko juuri tietyllä käyttäjällä juuri tietty kirjain, niin silloin pitää hakea sen käyttäjän tiedot vaikka id:n perusteella ja sitten verrata kirjainta. Eli koodi olisi täsmälleen samanlainen kuin tuolla aikaisemmin user_id:n kanssa, mutta tietokantaan liittyvän user_id:n tilalle tulisi user_type ja istuntoon liittyvän UserId:n tilalle UsersType, ja tietenkin myös tietokantakyselyssä haettaisiin se käyttäjä eikä postia.

Grez [11.10.2019 19:56:20]

#

Jos olisin huonommalla tuulella niin sanoisin että kannattaa vaan saman tien lyödä hanskat tiskiin, kun ei näytä olevan mitään kiinnostusta nähdä vaivaa asian opiskelemiseen.

Sopetus [11.10.2019 20:01:32]

#

Mistä voi opiskella?

Metabolix [11.10.2019 20:11:47]

#

Opiskelun voi aloittaa esimerkiksi Ohjelmointiputkan PHP-oppaasta. Oppaan asiat pitää ymmärtää hyvin, jos mielii tehdä toimivaa koodia. (Opas on vasta alku, lisäksi pitää ymmärtää myös paljon muuta.) Harjoituksena voi tehdä PHP-haasteen tehtäviä, joissa oppii ohjelmointia yleisesti. Tehtävillä ei ole suoraa yhteyttä nettisivujen tekemiseen, mutta samanlaisia loogisen ajattelun taitoja tarvitsee kaikessa ohjelmoinnissa.


Sivun alkuun

Vastaus

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

Tietoa sivustosta