Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Tietokantakysely viimeisemmästä kirjautumisesta

Sopetus [03.02.2019 12:22:22]

#

Osaisiko joku auttaa minkälaisella kyselyllä saisi käyttäjänimet ja avatar-kuvat listattua viimeisen kirjautumisen mukaan ja post-taulusta status sarake pitää olla aktiivinen jolloin käyttäjät näkyvät?

Tässä vähän havainnollistan tietokantaa.

CREATE TABLE useraccount (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    username TEXT NOT NULL,
    avatar text NOT NULL,
    last_visit datetime NOT NULL
) ENGINE=InnoDB;

CREATE TABLE post (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    userId INT NOT NULL,
    status TEXT NOT NULL,
    title TEXT NOT NULL,
    content TEXT NOT NULL,
    FOREIGN KEY (userId) REFERENCES useraccount (id)
) ENGINE=InnoDB;


INSERT INTO `useraccount` (`id`, `username`, `avatar`, `last_visit`) VALUES
(1, 'Antti', 'avatar9.jpg', '2019-02-03 11:34:15'),
(2, 'Abc', 'avatar5.jpg', '2019-02-03 11:26:09');

INSERT INTO `post` (`id`, `userId`, `status`, `title`, `content`) VALUES
(1, '1', 'active', 'mielipiteitä', 'höpöhöpö, höpönlöpön'),
(2, '2', 'inactive', 'mielipiteitä', 'höpöhöpö, höpönlöpön');

Onnistuuko tällä koodilla kyselyn suorittaa?

<?php
// muodostetaan yhteys tietokantaan
try {
    $yhteys = new PDO("mysql:host=localhost;dbname=testit", "antti", "abc");
} catch (PDOException $e) {
    die("VIRHE: " . $e->getMessage());
}
// virheenkäsittely: virheet aiheuttavat poikkeuksen
$yhteys->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// merkistö: käytetään latin1-merkistöä; toinen yleinen vaihtoehto on utf8.
$yhteys->exec("SET NAMES latin1");

// valmistetaan kysely
$kysely = $yhteys->prepare("SELECT * FROM tuotteet");
// suoritetaan kysely
$kysely->execute();

// näytetään kyselyn tulokset taulukossa
echo "<table>";
// käsitellään tulostaulun rivit yksi kerrallaan
while ($rivi = $kysely->fetch()) {
    // $rivi["nimi"] sisältää nimen
    // $rivi["hinta"] sisältää hinnan
    echo "<tr>";
    echo "<td>" . htmlspecialchars($rivi["nimi"]) . "</td>";
    echo "<td>" . htmlspecialchars($rivi["hinta"]) . "</td>";
    echo "</tr>";
}
echo "</table>";
?>

VNabokov [03.02.2019 15:09:42]

#

Vähän voisi kokeilla itsekin debugata näitä. Vai mitäpä luulet, että palauttaako "tuotteet" -taulusta hakeminen mitään "useraccount" -taulusta? Eli ensimmäinen vihje, vaihda kyselyksi "SELECT * FROM useraccout" ja katso mitä se palauttaa ja käytä vähän aikaasi ratkaisujen miettimiseen. Toinen vihje, älä copypastea valmista koodia ikinä, jollei sinulla ole aavistustakaan mitä se tekee.

Lisäksi: Mitä "post" -taulun active/inactive tarkoittaa? Millä perusteella jokin viesti on aktiivinen/inaktiivinen?

Metabolix [03.02.2019 15:34:07]

#

Tarkoitatko ehkä jotain tällaista kyselyä:

SELECT DISTINCT username, avatar
FROM useraccount
JOIN post ON post.userId = useraccount.id AND post.status = 'active'
WHERE last_visit > NOW() - INTERVAL 7 DAY
ORDER BY last_visit DESC

Tämän voi laittaa oppaasta kopioimaasi PHP-koodiin SELECT-kyselyksi. Silmukassa pitää tietenkin silloin nimen ja hinnan sijasta tulostaa käyttäjänimi ja avatar. Lisäksi koodiin pitää laittaa oikeat tiedot tietokantayhteyttä varten (käyttäjänimi, salasana, tietokannan nimi). Jos näissä kohdissa on jotain epäselvää, kannattaa varmaan opetella oppaista PHP-ohjelmoinnin ja SQL:n perusteet.

Sopetus [03.02.2019 16:32:47]

#

Metabolix kirjoitti:

Tarkoitatko ehkä jotain tällaista kyselyä:

SELECT DISTINCT username, avatar
FROM useraccount
JOIN post ON post.userId = useraccount.id AND post.status = 'active'
WHERE last_visit > NOW() - INTERVAL 7 DAY
ORDER BY last_visit DESC

Kiitos Metabolix avustasi. Antamasi kysely toimi, mutta en saanut useraccount taulusta id. Yritin lisätä sitä: "SELECT DISTINCT id, username, avatar
FROM useraccount......". Näin kun tein niin aukeaa vain valkoinen sivu.

Onko myös jotenkin mahdollista saada samaan kyselyyn post-taulusta esim. title liitettyä username ja avatar lisäksi?

(Post-taulun nimi oli vain esimerkki kun en keksinyt parempaakaan.)

Metabolix [03.02.2019 17:35:33]

#

Kyselyssä id voi tarkoittaa useraccountin tai postin id:tä, joten kyselyyn pitää kirjoittaa erikseen useraccount.id, tai sinänsä voisit hakea myös yksinkertaisemmin merkinnällä useraccount.* kaikki sarakkeet.

Sopetus [04.02.2019 09:31:51]

#

Kiitos vielä avustasi. Eilen jo sain id:n toimimaan.

Vastaus

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

Tietoa sivustosta