Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Cookie ongelma

Sivun loppuun

Tuomas213 [24.07.2011 12:18:09]

#

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'>&nbsp;</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();
?>

The Alchemist [24.07.2011 12:30:06]

#

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.

Tuomas213 [24.07.2011 21:13:03]

#

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

Macro [25.07.2011 08:33:36]

#

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.

The Alchemist [25.07.2011 09:10:26]

#

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.

Metabolix [25.07.2011 11:46:32]

#

Aivan ensiksi kannattaa laittaa koodin alkuun seuraavat rivit ja korjata kaikki niiden jälkeen näkyvät ilmoitukset:

ini_set("display_errors", 1);
ini_set("error_reporting", E_ALL | E_STRICT);

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:

setcookie("taulukko[1]", "a");
setcookie("taulukko[2]", "b");

/* Tulos:
$_COOKIE = array(
  "taulukko" => array(
    "1" => "a",
    "2" => "b"
  )
);
*/

Tuomas213 [25.07.2011 16:15:25]

#

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

$_COOKIE = array (
  'TestCookie' =>
  array (
    '\'2\'' => '2',
    '\'3\'' => '3',
  ),
  'PHPSESSID' => '89m59rsipsmacci4vtu3r7gkr5',
)

Metabolix [25.07.2011 16:28:55]

#

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.

Tuomas213 [25.07.2011 18:27:44]

#

Kiitos Metabolix nyt toimii!

En ajatellu,että tuon voi tehdä nuin yksinkertaisesti.

Kiitos vielä kerran.


Sivun alkuun

Vastaus

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

Tietoa sivustosta