6
votes

Variables PHP fabriquées avec foreach

J'ai plusieurs variables provenant d'une matrice en $ post _ ["tableau"] Je souhaite faire une sorte de boucle, par exemple pour acheter, pour chaque valeur de la variable un nom variable et attribue la valeur pour cela. .

Par exemple, si j'ai P>

$name = 'John';
$last = 'Doe';
$age = '32';
$sex = 'male';


1 commentaires

Si vous utilisez extrait , faites attention aux ramifications de sécurité potentielles détaillées dans le manuel PHP.


5 Réponses :


1
votes

Vous pouvez réellement utiliser la fonction intégrée appelée Extraire


3 commentaires

Ah bon? Comment quelqu'un pourrait-il en tirer parti? Peut-être envoyez-vous un message appelé "Logningin" => "vrai" ou quelque chose comme ça?


Ne pas profiter mais ce serait une mauvaise habitude d'entrer dans


@Peter: ils peuvent faire _post = haha ​​j'ai noué votre tableau _post! et id iditto pour le reste des superglobaux.



17
votes

Vous n'avez pas besoin d'une boucle, vous voulez : xxx pré >

p>

Précautions et meilleures pratiques h2>

Comme indiqué dans les commentaires strong> Cela force tous les paramètres dans le $ _ POST Code> Array dans l'espace de symbole actuel. P>

dans l'espace global h3> xxx pré>

Le code ci-dessus illustre le problème comme indiqué dans cette réponse - Certaines choses assez dangereuses peuvent être écrasées dans le global em > Espace. p>

à l'intérieur d'une fonction h3> xxx pré>

à l'intérieur d'une fonction, comme la première ligne, aucun préjudice fait. P>

Note importante: strong> vous pourriez penser em> car $ _ serveur code> est un Super Global , que cet exploit pourrait se produire à l'intérieur em> une fonction également. Cependant, dans mes tests, sur PHP version 5.3.4 forte>, il est sûr dans une fonction forte> - ni $ _ serveur code>, $ € code>, $ _ obtenez code>, _ session code> ou d'autres superglobaux, pouvant être écrasé. p>

avec des options h3>

Vous pouvez également utiliser Extrait avec des options d'extraction_TYPE qui ne remplacent pas .

La meilleure option à utiliser, à mon avis, est simplement de préfixer toutes les variables de l'extrait: p> xxx pré>

de cette façon, vous n'avez pas le problème d'écrasement , mais vous savez aussi que vous avez tout eu du tableau. P>

Alterné - Looping w / conditionnel H2>

Si vous vouliez le faire manuellement (mais toujours de manière dynamique), ou voulait extraire conditionnellement quelques-unes des variables, vous pouvez utiliser variable Variables : P>

foreach ($_POST as $key => $value) {
    if (isset($$key)) continue;

    $$key = $value;
}


7 commentaires

@jakenoble C'est bon si vous faites attention au manuel et utilisez une option autre que le comportement par défaut pour éviter les variables écrasantes.


@Jakenoble - Il serait utile d'expliquer pourquoi, au lieu de -1 et un commentaire sur chaque poste. En isolant, par exemple, si je sais ce que le contenu de $ _ POST est, quelle est la différence?


J'ai ajouté ma propre réponse bien que cela ait été voté sans commentaires. Je ne peux pas gagner. Vous pouvez écraser les variables que vous voulez, ce qui entraînerait un comportement imprévisible. Personne ne pouvait profiter, mais ce n'est qu'un exemple de quelque chose qui peut être utilisé puis mal utilisé par un nouvel utilisateur de PHP s'il n'est pas expliqué correctement. C'est pourquoi PHP a comme mauvais nom à cause de choses comme extrait () et leur utilisation abusive.


@Jakenoble: N'utilisez tout simplement pas de variables, que vous n'initialisez pas. Mettez extrait () au début de (disons) une fonction et il n'y a aucune variables, pouvant être accidentellement remplacée.


@KingCrunch @Renèse Tout cela va bien, mais assurez-vous de l'écrire dans votre réponse, vous ne pouvez pas supposer que l'OP ou quelqu'un d'autre lira entre les lignes ou même lire le manuel et utiliser la fonction car elle doit être utilisée. La solution rapide va bien, mais assurez-vous qu'il est expliqué comme une solution rapide.


@Jakakoble - Bien sûr, vous avez raison. Malheureusement, je ne peux pas vous conseiller de tout problème possible résultant d'un plan d'action décidé dans une question, mais être conscient de l'écrasement est une bonne idée (bien que vous deviez supposer que s'ils comprennent l'ordre d'exécution, ils seraient Réalisez cela, et s'ils ne le font pas, ils ont de plus gros problèmes). Aller à lire votre réponse maintenant ...


Il existe un lien vers le manuel dans le poteau, qui a clairement des options pour éviter toute écrasement, si la méthode est correctement utilisée, c'est tout à fait bien, et si vous savez ce qui va être dans le poste en premier lieu, vous devriez avoir une décente suffisamment de convention de dénomination pour ne pas écraser les variables déjà instanciées. Personnellement croit que cela vaut mieux qu'un pourach, juste parce que son nettoyant et vous oblige à avoir de meilleures normes de dénomination.



13
votes

Essayez de ne pas utiliser extrait () code> lorsque vous utilisez $ _ POST code>. Vous pouvez écraser les variables que vous voulez, ce qui entraînerait un comportement imprévisible. C'est une mauvaise habitude d'entrer dans et tandis que la dynamique peut ne pas être la meilleure solution.

Vous pouvez faire quelque chose comme ceci: P>

foreach($_POST as $key => $value)
{
    switch($key)
    {
        case "name":
            $name = $value;
        break;
        case "last":
            $last = $value;
        break;
    }
}


4 commentaires

C'est un excellent conseil. Les autres postes introduisent potentiellement la buggy et certainement un code non sécurisé.


@jake je viens de réaliser que je l'ai fait -1, cependant, vous devrez me croire que ce n'était pas une vengeance devote, car je n'ai même pas remarqué qui l'a affiché. Toutes mes excuses pour ne pas quitter un commentaire. La raison en est que ce n'est pas dynamique, est très verbose et le rend encore plus difficile à mettre à jour le code avec des noms neufs / modifiés. Peut-être qu'ils n'en ont pas besoin. Mais s'ils veulent une extraction dynamique, il existe d'autres moyens d'éviter toute écrasement. Si vous éditez votre réponse (mon vote est verrouillé en ce moment) avec un peu d'expansion à ce sujet, je vais certainement supprimer mon bowvote, aucun sentiment difficile.


@jakenoble - Fait et j'ai également étendu ma réponse basée sur cette discussion. Merci pour votre contribution.


J'ai fait un test. Son ne fonctionne pas. Il y a 10 valeurs de formulaire publiées, mais ce code renvoie uniquement les valeurs du dernier formulaire.



2
votes

Pourquoi ne pas utiliser un foreach ? XXX


2 commentaires

J'allais utiliser le forach mais la commande Extraction est incroyable. C'est vraiment le travail à la main.


J'ai fait un test. Son ne fonctionne pas. Il y a 10 valeurs de formulaire publiées, mais ce code renvoie uniquement les valeurs du dernier formulaire.



0
votes

Je veux juste mentionner que vous pouvez améliorer la technique de foreseach car nous avons en HTML la possibilité de nommer l'un de nos champs de formulaire à l'aide de la notation de support carré, et si nous le faisons, ce que HTML va faire est qu'il soumettra une série de Valeurs comme une matrice.

$args = $_POST['user'];


0 commentaires