Moro
Teen varausjärjestelmää. Alla olevan sivun pitäisi näyttää onko esine varattavissa. Eli haluan että voi useita esineitä varata "varauskoriin" evästeitä käyttäen, joka toimii. Mutta sitten... sovelluksen vika on seuraava: sovellus vertaa jotenkin väärin if lauseella evästettä ja tietokannasta tulevaa id:tä. Arvelen että se vertaa kokoajan vain ensimmäistä evästettä. Olen yrittäny ratkasta tätä jo parin viikon ajan ilman tulosta. Voisiko joku auttaa?
varaa.inc
<?php require('sql_luokka.php'); $kysely=new SqlLuokka(); $kysely->avaa(); $sql="select * from item"; $tulos=$kysely->suorita($sql); //suorittaa sql-kyselyn echo "<table width='600' bgcolor='#ebebeb'>"; echo "<tr bgcolor='#0099ff'><th width='100' align='left'>name</th>"; echo "<th width='100' align='left'>manufacturer</th>"; echo "<th width='200' align='left'>model</th>"; echo "<th width='200' align='left'>info</th>"; echo "<th width='200' align='left'>include</th>"; echo "<th width='200' align='left'>location</th>"; echo "<th width='100'> </th></tr>"; while($rivi=$kysely->haerivi($tulos)){ echo '<td>'; echo $rivi['name']; echo '</td>'; echo '<td>'; echo $rivi['manufacturer']; echo '</td>'; echo '<td>'; echo $rivi['model']; echo '</td>'; echo '<td>'; echo $rivi['info']; echo '</td>'; echo '<td>'; echo $rivi['include']; echo '</td>'; echo '<td>'; echo $rivi['location']; echo '</td>'; echo '</td>'; echo '<td>'; $id = $rivi['id']; $sql1="select * from reservations where itemid ='$id'"; $tulos1=$kysely->suorita($sql1); //suorittaa sql-kyselyn if($rivi1=$kysely->haerivi($tulos1)){ echo "<p>Varattu</p>"; } else if (isset($_COOKIE['TestCookie'])){ foreach ($_COOKIE['TestCookie'] as $Name => $Value) { if($Value==$id){ echo 'Varauksessa'; } else echo "<a href='varauskori.php?itemid=".$id."'>Varaa1</a>"; }} echo '</td>'; echo '</tr>'; } echo '</table>'; $kysely->vapauta($tulos); $kysely->sulje(); ?>
Kuinkas olisi, jos vaikka luet manuaalista keksien käytöstä?
lainaus:
bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] )
Elikäs keksiin voi tallentaa vain stringejä. Taulukot voi muuttaa merkkijonoiksi sarjallistamalla ne funktiolla serialize().
Täysin oikeutettu kysymys: oletko kertaakaan katsonut, mikä tuon keksin arvo on selaimessa?
Laitahan myös virheraportointi päälle PHP:stä. Ilman sitä on ihan turha edes yrittää opetella PHP:tä.
Ja toinen vinkki: käytä PDO:ta tuon oman viritelmäsi sijaan.
Niin olen vasta aloittelija php:ssä.
Mun vika näyttäisi olevan ennemminki tuossa foreach:issa. Mulla esineen id-numero tallennetaan keksiin, eli joo olen käyny selaimessa katsomassa.
Ja mulla ei tule virheilmoituksia koska se näyttää ne vain väärin. Kun klikkaa jotakin "varaa"-linkkiä niin muut linkit häviävät ja siihen jota klikkasin tulee "varauksessa".
Mitä tuossa $rivi1-muuttujassa on? Sitä ei ole määritelty koodissasi.
Jos haluat taas käydä kaikki keksit läpi, niin muuta foreachin $_COOKIE['TestCookie'] $_COOKIE:ksi.
Tuomas213 kirjoitti:
Ja mulla ei tule virheilmoituksia koska se näyttää ne vain väärin.
Ei näytä. Laita ne päälle tai voit unohtaa oppimisen.
Aivan ensiksi kannattaa laittaa koodin alkuun seuraavat rivit ja korjata kaikki niiden jälkeen näkyvät ilmoitukset:
On aika epätodennäköistä, että aloittelija saisi aikaan evästeen, joka sisältää taulukon. Taulukkoa ei nimittäin voi suoraan sijoittaa evästeeksi, vaan siitä seuraa varoitus eikä evästettä tule. Uuden tekstin asettaminen evästeeksi taas korvaa vanhan eikä suinkaan tee maagisesti taulukkoa. Siksipä oletan, että evästeen sisältö on pielessä. Tämän voit selvittää helposti seuraavalla rivillä:
die('<pre>$_COOKIE = '. htmlspecialchars(var_export($_COOKIE, 1)). '</pre>');
Todellisen taulukon saa evästeeksi näin:
The Alchemist kirjoitti:
Tuomas213 kirjoitti:
Ja mulla ei tule virheilmoituksia koska se näyttää ne vain väärin.
Ei näytä. Laita ne päälle tai voit unohtaa oppimisen.
Koko ajan ne on ollu päällä. php.ini:stä kävin vielä tarkistamassa.
Laitoin koodiin nuo ini_setit. Eikä näyttäny erroreita.
Ja evästeet tallentuu oikein. Evästeen nimeksi ja sisällöksi tulee tietokannassa olevan esineen id-numero. Nimi:TestCookie[$id] ja sisältö: $id
Sittenhän kaiken pitäisi olla kunnossa – jos nyt tuo silmukkasi yleensäkään tekee sitä, mitä luulet sen tekevän. Jos sisennät koodisi kunnolla, näet varmaan itsekin, missä tilanteissa tulostuu mitäkin ja kuinka monta kertaa.
Ehkä kuitenkin haluaisit foreach-silmukan tilalle ihan tavallisen ehtolauseen?
if ($kysely->haerivi($tulos1)) { echo "Varattu (kannassa)"; } elseif (isset($_COOKIE["TestCookie"]) && in_array($id, $_COOKIE["TestCookie"])) { echo "Varattu (evästeessä)"; } else { echo "Vapaa"; }
Muuten, evästeessäsi on ylimääräisiä hipsuja. Voit laittaa numeron hakasulkuihin suoraankin.
Kiitos Metabolix nyt toimii!
En ajatellu,että tuon voi tehdä nuin yksinkertaisesti.
Kiitos vielä kerran.
Aihe on jo aika vanha, joten et voi enää vastata siihen.