8768 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai un souci avec mes 2 formulaires que j'ai créé sur une seule page.
Bien entendu j'ai cherché des réponse sur ce forum et d'autres, mais malheureusement en vain.
Pouvez-vous m'aider SVPL, voici le souci :
Je souhaite afficher une page nommée "subscription_dbl" si SubscriptionID est = à 2 ou 4 ou 6, dans le cas contraire il doit s'afficher la page nommée "subscription_sgl".
J'ai bien nommé mes 2 tables d'un nom différent mais lorsque je clique sur submit de l'un ou l'autre des formulaire, j'arrive toujours sur la page nommée "subscription_sgl".
Donc, si je clique sur le formulaire qui devrait me renvoyer vers "subscription_dbl" j'arrive tout de même sur "subscription_sgl" et si je fais un var_dump sur cette page, s'affiche bien l'ID qui correspond à ma page "subscription_dbl" soit 2 soit 4 ou 6.
J'espère que j'ai été assez clair, il n'est pas toujours facile d'expliquer le problème Smiley confus .
Bref voici mon code :

<?php
$statement = $bdd->prepare("SELECT * FROM subscriptions");
$statement->execute();
$item = $statement->fetch();
if ($item['SubscriptionID'] == 2 || $item['SubscriptionID'] == 4 || $item['SubscriptionID'] == 6) {
    $statement = $bdd->prepare("SELECT * FROM subscriptions");
    $statement->execute();
    while ($item = $statement->fetch()) {
        echo '<tr>';
        echo '<td>' . $item['subscription_name'] . '</td>';
        echo '<td>';
        echo '<form method="post" name="subscription_dbl" action="subscription_dbl.php" role="form">';
        echo '<input id"SubscriptionID" type="text" name="SubscriptionID" value="' . $item['SubscriptionID'] . '"> ';
        echo '<input type="submit" class="btn btn-primary" value="' . $item['subscription_price'] . ' € ">';
        echo '</form>';
        echo '</td>';
        echo '</tr>';
    }
} else {
    $statement = $bdd->prepare("SELECT * FROM subscriptions");
    $statement->execute();
    while ($item = $statement->fetch()) {
        echo '<tr>';
        echo '<td>' . $item['subscription_name'] . '</td>';
        echo '<td>';
        echo '<form method="post" name="subscription_sgl" action="subscription_sgl.php" role="form">';
        echo '<input id"SubscriptionID" type="text" name="SubscriptionID" value="' . $item['SubscriptionID'] . '"> ';
        echo '<input type="submit" class="btn btn-primary" value="' . $item['subscription_price'] . ' € ">';
        echo '</form>';
        echo '</td>';
        echo '</tr>';
    }
}
?>

D'avance merci de votre aide.
Bonjour,
Pourquoi relis tu la table `subscriptions` dans le if. Il me semble que tu lis toujours la même ligne de BD.
Bonjour phiper,

Merci de m'avoir mis sur la voie, effectivement mon if n'était pas bien pensé.
Voici mon code qui fonction, encore merci excellente journée ++

                            <?php
$statement = $bdd->prepare("SELECT * FROM subscriptions");
$statement->execute();
while ($item = $statement->fetch()) {
if ($item['SubscriptionID'] == 2 || $item['SubscriptionID'] == 4 || $item['SubscriptionID'] == 6) {
        echo '<tr>';
        echo '<td>' . $item['subscription_name'] . '</td>';
        echo '<td>';
        echo '<form method="post" name="subscription_dbl" action="subscription_dbl.php" role="form">';
        echo '<input id"SubscriptionID" type="text" name="SubscriptionID" value="' . $item['SubscriptionID'] . '"> ';
        echo '<input type="submit" class="btn btn-primary" value="' . $item['subscription_price'] . ' € ">';
        echo '</form>';
        echo '</td>';
        echo '</tr>';
    } else {
        echo '<tr>';
        echo '<td>' . $item['subscription_name'] . '</td>';
        echo '<td>';
        echo '<form method="post" name="subscription_sgl" action="subscription_sgl.php" role="form">';
        echo '<input id"SubscriptionID" type="text" name="SubscriptionID" value="' . $item['SubscriptionID'] . '"> ';
        echo '<input type="submit" class="btn btn-primary" value="' . $item['subscription_price'] . ' € ">';
        echo '</form>';
        echo '</td>';
        echo '</tr>';
    }
}
?>
Modérateur
Salut Loutschi,

- DRY[^1]
- coder proprement (pas lu, mais entendu tellement de bien de ce bouquin....)

ton code remanié [^2][^3] :

<?php
$statement = $bdd->prepare("SELECT * FROM subscriptions");
$statement->execute();
while ($item = $statement->fetch()) {
      $action = $item['SubscriptionID'] == 2 || $item['SubscriptionID'] == 4 || $item['SubscriptionID'] == 6? 'subscription_dbl' : 'subscription_sgl';
      $tpl = <<<TPL
      <tr>
            <td>$item['subscription_name']</td>
            <td>
                  <form method="post" name="subscription_dbl" action="$action.php" role="form">
                        <input id"SubscriptionID" type="text" name="SubscriptionID" value="$item['SubscriptionID']">
                        <input type="submit" class="btn btn-primary" value="$item['subscription_price'] € ">
                  </form>
            </td>

      </tr>
TPL;
      echo $tpl;
}
?>

[^1]: syntaxe heredoc, opérateur ternaire
[^2]: sur cette expression ( $item['SubscriptionID'] == 2 || $item['SubscriptionID'] == 4 || $item['SubscriptionID'] == 6 ), on peut mieux faire. Parce que là encore DRY. Mais j'ai préféré laisser tel quel pour que tu puisses comprendre
[^3]: code fait de tête. Je pense que je n'ai pas fait d'erreur. Mais... le souci, je ne fais plus de php depuis des années maintenant.
Modifié par niuxe (19 Dec 2022 - 22:14)
Bonsoir Niuxe,
Que dire .... Wahoo !!
Je ne connais pas le principe DRY, mais l'article Wikipedia est bien explicte là-dessus. Je ne connais pas non plus la syntaxe Heredoc pour afficher une chaine de caractère et encore moins la possibilité d'utiliser l'opérateur ternaire ( ? ) dans un code.
Ceci dit avec tes quelques lignes de code tu remplaces plus du double de ligne par rapport à ce que j'ai fait.
Tout cela m'intéresse beaucoup et je vais donc m'y plonger pour bien comprendre le principe de tout cela.
En attendant merci mille fois de me permettre d'apprendre cette nouvelle façon de coder.
J'ai donc testé ton code tel que, mais j'ai des erreurs à l'affichage, voir ci-dessous). Si tu as une idée pour corriger ce serait sympa, car jusqu'à ce que j'aurai terminé mon apprentissage là-dessus, ça va faire bout de temps. Sinon pas grave je ferai comme j'ai prévu et je pourrai toujours modifier plus tard.

<?php
$statement = $bdd->prepare("SELECT * FROM subscriptions");
$statement->execute();
while ($item = $statement->fetch()) {
    $action = $item['SubscriptionID'] == 2 || $item['SubscriptionID'] == 4 || $item['SubscriptionID'] == 6? 'subscription_dbl' : 'subscription_sgl';
    $tpl = <<<TPL
    <tr>
            <td>$item['subscription_name']</td> // là cette ligne est surlignée en tant qu'erreur, je ne sais pas pourquoi. Il ne s'agit pas de double cote non plus, j'ai essayé !
            <td>
                <form method="post" name="subscription_dbl" action="$action.php" role="form">
                        <input id"SubscriptionID" type="text" name="SubscriptionID" value="$item['SubscriptionID']"> // Là aussi juste la cote de 'SubscriptionID est surlignée ...
                        <input type="submit" class="btn btn-primary" value=" '. $item['subscription_price'] € ">  // Idem ...
                </form>
            </td>

    </tr>
TPL;
    echo $tpl;
}
?>

En tout cas, encore merci pour ton aide et je pense que je vais acheter ce bouquin si tu dit qu'il en vaut la peine.
Excellente soirée ++
Modérateur
Salut Loutschi,

Loutschi a écrit :

En attendant merci mille fois de me permettre d'apprendre cette nouvelle façon de coder.


Le forum Alsacreations est avant tout une communauté de partage de connaissances. Quand un membre poste un sujet suite à un problème qu'il a, les autres lui viennent en aide. Ce fameux membre peut lui à son tour aider (même s'il a de maigres connaissances). Aussi, ce membre peut dire des bètises. Et là encore, il va apprendre par les autres membres !

Loutschi a écrit :

J'ai donc testé ton code tel que, mais j'ai des erreurs à l'affichage, voir ci-dessous). Si tu as une idée pour corriger ce serait sympa,


Au temps pour moi pour cette erreur. Rallala, ma perte de connaissance de PHP ... Smiley confused
Pour afficher la valeur d'une variable avec la syntaxe heredoc, tu dois encadrer la variable entre une paire d'accolade. Ceci dit, lorsque tu souhaites afficher une paire d'accolades au sein de ton texte, tu dois échapper en doublant le symbole :


<?php 
$item = [
    "subscription_name" => 'quelque chose',
    "SubscriptionID" => 'un id',
    "subscription_price" => '123'
];
$output = <<<EOF
    Lorem ipsum, <strong>{$item['subscription_name']}</strong> dolor <strong>{$item['subscription_price']}</strong> sit <strong>{{ double accolade }}</strong> amet consectetur adipisicing elit.
EOF;
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p>
        <?= $output ?>
    </p>    
</body>
</html>

Pour ton souci initial (code redondant), je pense même que tu puisses délimiter le "template" par des doubles guillemets au lieu d'utiliser la syntaxe heredoc. Une variable incluse dans une chaîne de caractères délimité par des double guillemets sera interprété (le désavantage sera que le code de sorti ne sera pas indenté). C'est peut être à tester.
Loutschi a écrit :

En tout cas, encore merci pour ton aide


Je t'en prie
Loutschi a écrit :
et je pense que je vais acheter ce bouquin si tu dit qu'il en vaut la peine.


Oui je t'invite à le lire. J'ai remarqué d'autres soucis notamment la cohérence de ton écriture.
Modifié par niuxe (20 Dec 2022 - 14:56)