2013-03-08 6 views
0

J'ai une page PHP avec 2 instructions MySQL dans différentes parties du code. J'utilise les ensembles de résultats générés pour définir les valeurs de cookies, puis je les appelle plus tard. Cependant, lorsque j'appelle les données de cookie, il ne met pas à jour l'affichage des valeurs de cookie avant une deuxième actualisation. Pour mieux comprendre, Voici les 3 sections de code:PHP + MySQL + Cookies, pourquoi cela ne se charge pas correctement?

<?php 
include 'functions.php'; 
if($_SERVER['REQUEST_METHOD'] == 'POST') 
{ 
    $SqlStatement = "SELECT Deceased.PK_Deceased, Deceased.Date_Death, Personal_Info.First_Name, Personal_Info.Last_Name FROM Deceased INNER JOIN Personal_Info ON Personal_Info.PK_Personal_Info = Deceased.FK_Personal_Info WHERE Deceased.FK_Personal_Info = '".$_POST['cboDeceased']."'"; 

    $result = ExecuteSql($SqlStatement); 
    if(mysqli_num_rows($result) == 1) 
    { 
     $row = mysqli_fetch_array($result); 
     setcookie('deceasedID', $row['PK_Deceased'], time()+360000, '/'); 
     setcookie('deceasedName', ($row['First_Name']." ".$row['Last_Name']), time()+360000, '/'); 
     setcookie('deceasedDoD', $row['Date_Death'], time()+360000, '/'); 
    } 
} 
?> 

Ceci est le code qui extrait les données de la publication. Je pense que c'est la partie qui est incorrecte, mais je ne suis pas sûr.

<tr> 
<td width="25%" rowspan="2" align="center">Current User: <?php echo $_COOKIE['username']; ?> </td> 
<td width="25%" rowspan="2" align="center">Current Deceased: <?php if(isset($_COOKIE['deceasedName']))echo $_COOKIE['deceasedName']; ?></td> 
<td width="50%" rowspan="2" align="center">Deceased Date of Death: <?php if(isset($_COOKIE['deceasedDoD']))echo $_COOKIE['deceasedDoD']; ?></td> 

Ceci est le code pour charger les données de cookie dans les champs et la partie qui prend la deuxième actualisation pour afficher correctement.

<form action="<?php $_SERVER['PHP_SELF'];?>" method="post"> 
<table align="center" width="500" border="0.5"> 
<tr> 
<td width="176" align="right" style="font-weight:bold;">Please select deceased:</td> 
<td width="214"> 
    <select name="cboDeceased" id="cboDeceased"> 
    <option>Select...</option> 
    <?php 
    $SqlStatement = "SELECT Deceased.PK_Deceased , Personal_Info.First_Name, Personal_Info.Last_Name FROM Deceased INNER JOIN Personal_Info ON Personal_Info.PK_Personal_Info = Deceased.FK_Personal_Info"; 

    $res = ExecuteSQL($SqlStatement); 

    while($row = mysqli_fetch_array($res)) 
    { 
     echo "<option value='".$row['PK_Deceased']."'>".$row['First_Name']." ".$row['Last_Name']."</option>"; 
    } 
?> 

C'est le code qui transmet une variable basée sur l'ID au 1er bloc de code. Cette partie fonctionne bien.

function ExecuteSQL($SQL) 
{ 
$con = mysqli_connect("localhost", "root", "", "exec_support_db"); 
$res = mysqli_query($con, $SQL); 
mysqli_close($con); 
return $res; 
} 

Voici le code de la fonction ExecuteSQL. Je sais que ce n'est pas le problème.

Je pense que le problème est en haut dans le 1er bloc de code, mais je ne suis pas sûr. J'ai tout essayé et je n'ai plus d'idées. Toute aide serait appréciée.

+5

Vous avez un énorme trou d'injection SQL dans ce code. S'il vous plaît en savoir plus sur l'injection SQL, échapper les entrées de l'utilisateur et les instructions préparées. [Voici une bonne question de référence] (http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php). Notez également que les données de cookies ne seront pas disponibles dans le tableau '$ _COOKIE' tant que la page n'aura pas été actualisée, car c'est la nature des cookies. Il se peut que [sessions] (http://www.php.net/manual/fr/book.session.php) soit plus adapté à vos besoins. – DaveRandom

+0

Je ne suis pas inquiet à propos de l'injection, je veux juste que cela recharge les cookies sur le premier postback. Je l'ai fait travailler une fois avant, puis soit changé ou ajouté quelque chose et maintenant il ne fonctionne plus de cette façon. Toute aide que vous pouvez donner pour que cela se produise serait appréciée. – BlazeHeroic

+0

Vous n'avez également pas besoin de créer une nouvelle connexion pour chaque requête. Juste besoin de l'amorcer une fois. – datasage

Répondre

0

Au-delà de l'injection SQL mentionné ci-dessus par DaveRandom jeter un oeil au manuel php sur la façon dont setcookie fonctionne:

http://php.net/manual/en/function.setcookie.php

Il mentionne spécifiquement l'information est injectée dans les en-têtes, et celui-ci ne sont disponibles que votre charger la page suivante. Vous voulez probablement faire quelque chose comme

if(isset($_COOKIE['deceasedID'])) 
{ 
    $deceasedID = $_COOKIE['deceasedID']; 
} 
else 
{ 
    setcookie('deceasedID', $row['PK_Deceased'], time()+360000, '/'); 
    $deceasedId = $row['PK_Deceased']; 
} 
+0

Merci beaucoup !! Cela fonctionne parfaitement. Je pense que cela a dû être ce que j'ai fait est de tirer les données de la ligne, puis l'a changé pour utiliser les cookies par la suite. Merci encore beaucoup. – BlazeHeroic

+0

Aucun problème, vous voudrez peut-être envisager de répondre à la question si cela a réussi ce que vous cherchiez. – DaOgre

+0

Sauf que maintenant que je suis retourné dessus, ça ne marche pas. Je suis même revenu et j'ai encore essayé et ça ne marche toujours pas, donc je ne sais pas ce que j'ai fait pour le faire mais ça ne marche plus. – BlazeHeroic

Questions connexes