2010-05-04 10 views
0

Dans la fonction show_commentbox() ci-dessous, je voudrais transmettre les variables $_SESSION['loginid'], $submissionid, $submission, $url, $submittor, $submissiondate, $countcomments, $dispurl. Avec la configuration ci-dessous, cela ne fonctionne pas. Comment pourrais-je le changer pour faire passer les variables le long de show_commentbox()?Variables passant le long d'une fonction

Merci à l'avance,

John

index.php:

<?php 

$submission = $_GET['submission']; 

require_once "header.php"; 

include "login.php"; 

include "comments.php"; 

include "commentformonoff.php"; 

?> 

En header.php:

require_once ("function.inc.php"); 

En comments.php:

$uid = $_SESSION['loginid']; 
$submissiondate = mysql_real_escape_string($_GET['submissiondate']); 
$submittor = mysql_real_escape_string($_GET['submittor']); 
$countcomments = mysql_real_escape_string($_GET['countcomments']); 
$dispurl = mysql_real_escape_string($_GET['dispurl']); 
$url = mysql_real_escape_string($_GET['url']); 
$submission = mysql_real_escape_string($_GET['submission']); 
$submissionid = mysql_real_escape_string($_GET['submissionid']); 

commentformonoff.php:

<?php 
if (!isLoggedIn()) 
{ 

    if (isset($_POST['cmdlogin'])) 
    { 

     if (checkLogin($_POST['username'], $_POST['password'])) 
     { 
      show_commentbox(); 
     } else 
     { 
      echo "Login to comment"; 

     } 
    } else 
    { 

     echo "Login to comment"; 
    } 

} else 
{ 

    show_commentbox(); 
} 
?> 

En display.functions.inc.php:

function show_commentbox() 
{ 
echo '<form action="http://www...com/sandbox/comments/comments2.php" method="post"> 
    <input type="hidden" value="'.$_SESSION['loginid'].'" name="uid"> 
    <input type="hidden" value="'.$submissionid.'" name="submissionid"> 
    <input type="hidden" value="'.$submission.'" name="submission"> 
    <input type="hidden" value="'.$url.'" name="url"> 
    <input type="hidden" value="'.$submittor.'" name="submittor"> 
    <input type="hidden" value="'.$submissiondate.'" name="submissiondate"> 
    <input type="hidden" value="'.$countcomments.'" name="countcomments"> 
    <input type="hidden" value="'.$dispurl.'" name="dispurl"> 



    <label class="addacomment" for="title">Add a comment:</label> 

    <textarea class="commentsubfield" name="comment" type="comment" id="comment" maxlength="1000"></textarea> 

    <div class="commentsubbutton"><input name="submit" type="submit" value="Submit"></div> 
</form> 
'; 
} 

Répondre

2

les arguments comme il suffit de passer:

function show_commentbox($submissionid, $submission, ...) { 
... 

show_commentbox($submissionid, ...); 

Notez que j'ai enlevé $_SESSION['loginid'], depuis il n'a pas besoin d'être transmis à travers le formulaire pour être disponible. En outre, il s'agit probablement d'informations sensibles et ne devrait donc pas être divulgué.

mysql_real_escape_string doit uniquement être utilisé pour préparer les données qui vont être envoyées à une base de données. Au lieu de cela, utilisez htmlspecialchars ou htmlentities pour préparer les données pour la sortie. Cela devrait être fait en show_commentbox, pas avant, puisque c'est là que la destination des valeurs est déterminée.

Bien sûr, de nombreux paramètres sont difficiles à manier. Pour une chose, comment vous souvenez-vous de leur commande? Une solution à ce problème particulier est aux arguments de mot clé, qui (en PHP), vous devez mettre en œuvre en passant un tableau associatif:

function show_commentbox($args) { 
... 

show_commentbox(array('submissionID' => $submissionid, ...)); 

La meilleure solution dans ce cas est d'utiliser des classes. Il peut être aussi simple que:

class CommentBox { 
    public $submissionid, ...; 
    function show() { 
     ?><form ...><?php 
     foreach ($this as $name => $val) { 
      $val = htmlspecialchars($val); 
      ?><input name="<?php echo $name; ?>" value="<?php echo $value; ?>" type="hidden"/><?php 
     } 
     ?></form><?php 
    } 
} 
... 
$cb = new CommentBox(); 
foreach ($cb as $name => $ign) { 
    // note: we don't want to loop over $_GET, as that introduces 
    // potential injection attacks 
    if (isset($_GET[$name])) { 
     $cb->$name = $_GET[$name]; 
    } 
} 

Ou vous pouvez commencer à utiliser un MVC architecture, séparant show dans une classe FormView.

Je suis intentionnellement en train de laisser de côté les globales, depuis globals are bad.

Questions connexes