8710 sujets

Développement web côté serveur, CMS


<?php
session_start();
include("../connec/connexion.php");
 if (isset($_SESSION['pseudo']) AND isset($_SESSION['mdpasse']))
{
    // On détermine la variable issue de la case à cocher pour l'affichage de la news
    if (isset($_POST['case']))
    {
        $affichage='oui';
    }
    else
    {
        $affichage='non';
    }
    
    // On vérifie s'il y a des entrées
    $reponse=$bdd->prepare('SELECT COUNT(*) FROM une_news');
    $reponse->execute();
    $donnees=$reponse->fetchColumn();
    $nb=$donnees['entrees'];
    
    if ($nb == 0)
    {
         $req = $bdd->prepare('INSERT INTO une_news (titre, message, affichage) VALUES(?, ?, ?)');
        $req->execute(array(
                $_POST['titre'],
                $_POST['message'],
                $affichage
                            ));
        ?>
        <h4>Ajouter une news</h4>

        <?php
    }
   
         else // déja une entrée, on la modifie
    {
        $req = $bdd->prepare('UPDATE une_news SET titre = :nvtitre, message = :nvmessage, affichage = :nvaffichage');
        $req->execute(array(
            'nvtitre' => $_POST['titre'],
            'nvmessage' => $_POST['message'],
            'nvaffichage'=> $affichage
                        ));
        ?>
        <h4>Modifier une news</h4>

        <?php
    }
    
    ?>
   ici le formulaire
}

else {header("Location: ../index.php");}
      

Bonjour,
J'ai fait ce petit script pour un simple système de news. En fait dans le cas présent, une seule news. Donc quand elle existe, on fait un update. Sinon on créé (insert) la news.
Tout fonctionne (modulo des optimisations) sauf lorsque j'ouvre cette page alors qu'il y a déjà une news et donc que nous sommes dans le cas d'un update. En effet à l'ouverture de la page, les champs de la table sont effacés et affichent donc des blancs.

Merci de votre aide.
bonjour,


$reponse=$bdd->prepare('SELECT COUNT(*) FROM une_news');
    $reponse->execute();
    $donnees=$reponse->fetchColumn();
    $nb=$donnees['entrees'];


"entrees" vient d'ou ?

essai :
$reponse = $bdd->prepare('SELECT COUNT(*) FROM une_news')->execute();
$nb = $reponse->fetchColumn(0);

Modifié par kenor (02 Feb 2015 - 12:53)
Le
ON DUPLICATE KEY UPDATE
semble en effet une bonne solution pour gérer insert et update.

Mais bon j'ai potassé tout l'aprem et je m'en sors pas. En gros comment insérer cet commande dans la requête? J'ai essayé ceci mais ça me retourne une page blanche...


<?php
session_start();
include("../connec/connexion.php");
 
if (isset($_SESSION['pseudo']) AND isset($_SESSION['mdpasse']))
{
    // On détermine la variable issue de la case à cocher pour l'affichage de la news
    if (isset($_POST['case']))
    {
        $affichage='oui';
    }
    else
    {
        $affichage='non';
    }
    
    if (isset($_POST['titre']) AND isset ($_POST['message']))
 
    {$req = $bdd->prepare('INSERT INTO une_news(titre, message, affichage) VALUES(:titre, :message, :affichage)');
    ON DUPLICATE KEY UPDATE id=id+1;

    $req->execute(array(

    'titre' => $_POST['titre'],

    'message' => $_POST['message'],

    'affichage' => $affichage

    ));
      
     
     
    }
    
    else{
       echo 'bon non';
    }
    include("../includes/header.php"); 
    ?>
    <body>
    <form method="post" action="debug1.php">

        <p>
            <input type="text" name="titre" value="whalou"/><br/>
            <input type="text" name="message" value="yahla" /><br/>
              <input type="checkbox" name="case" checked="checked" /> <label for="case">Afficher</label><br/>
            <input type="submit" value="Envoyer" />
        </p>
    </form>
        
        <?php
       
        // Affichage des messages
        $reponse = $bdd->query('SELECT titre, message FROM une_news WHERE affichage=\'oui\'');
        while ($donnees = $reponse->fetch())
            {
            ?>
            <h2>A l'affiche</h2>
            <h3><?php echo htmlspecialchars($donnees['titre']) ?></h3>
            <p><?php echo htmlspecialchars($donnees['message']) ?></p>
	            <input type="submit" value="Suprimer" />  
            <?php
            }
            $reponse->closeCursor();
       
    
    ?>
        
         <a href="../index.php">Accueil</a>
</body>
</html>

<?php
}

else {header("Location: ../index.php");}


?>                      
ça fait partie de ta requete SQL, donc elle doit être dans le prepare, ce n'est pas du PHP :

{$req = $bdd->prepare('INSERT INTO une_news(titre, message, affichage) VALUES(:titre, :message, :affichage)  ON DUPLICATE KEY UPDATE id=id+1;');


Mais clairement, ce n'est pas non plus ce qu'il faut faire.

Je n'ai pas d'ailleurs pas trop compris ton objectif.

Ta table ne doit contenir qu'une seule et unique news ?
Modifié par kenor (03 Feb 2015 - 16:52)
Du coup, question bete, mais pourquoi utiliser une table qui est sensé contenir plusieurs lignes ?

Un simple fichier pourrai tout a fait suffire ?

Maintenant, par rapport à ton problème, même si je ne comprends pas pourquoi tu fais ça de la sorte, en sachant ce qu'il contient, il te suffirait de faire un REPLACE, au moins, une requete et plus de soucis.

REPLACE INTO une_news (id_champ_unique, titre, message, affichage) VALUES (1, ....);

comme tu n'as qu'une seule ligne, tu forces à 1 dans ta requete (au moins, si un jour tu as besoin de 2 news, c'est possible Smiley lol )

Tu mets bien id_champ_unique en PRIMARY KEY

Quand il voudra REPLACE, si existe pas > equivalent de INSERT, si existe > equivalent de UPDATE.

(donc, plus besoin de SELECT count(), plus besoin de INSERT et de UPDATE).

http://dev.mysql.com/doc/refman/5.0/en/replace.html

Mais encore une fois, un fichier suffirait largement.
Qu'entends-tu par un simple fichier?

Ta remarque est tout sauf bête. Je suis parti du cas le plus "commun", une table avec plusieurs lignes (plusieurs news). Et là je commençais par me pencher sur le cas particulier, celui ou il y aurait qu'une seule ligne (news) qui changerait régulièrement.

Donc là je suis intéressé par ton fichier unique... mais je vois pas à quoi tu fais référence.
Et sinon, je vais aussi me pencher sur ta piste du Replace, parce que qd même mon but c'est de comprendre le max de possibilité offerte par les requêtes... Smiley biggrin

(merci)
Encore désolé, mais je ne comprends toujours pas ton objectif Smiley smile

Apprendre ?

Le fait d'afficher une seule news ne signifie pas forcement que tu dois avoir qu'une seule ligne dans ta table. LIMIT est fait pour ça.

Concernant le fichier, je disais juste que si l'objectif n'est d'avoir qu'une seule ligne, modifier un fichier est tout aussi efficace (file_put_contents($monfichier, 'mon contenu') < insertion de la news / file_get_contents($monfichier) < lecture de la news)
Ok je crois comprendre le malentendu.
Je suis là dans le cas d'une seule news avec un champ titre, un champ message et un champ affichage.
Dois-je comprendre que lorsque tu évoques une seule ligne, tu veux dire un seul champ ('mon contenu')?

Dans ce cas, donc non. Ma news comporte plusieurs champs (ligne?).

J'avoue que là ça devient un poil confus.
Non non ça, j'avais bien compris.

"mon contenu" était un exemple ... Il fallait le remplacer par, par exemple, un tableau serializer

$contenuAMettreDansFichier = serialize(array('titre' => 'mon titre', 'message' => 'mon contenu', 'affichage' => 'oui'));
file_put_contents($nom_fichier,$contenuAMettreDansFichier);

// pour le lire
$contenuDuFichier = file_get_contents($nom_fichier);
$tableau = unserialize($contenuDuFichier);
$montitre = $tableau['titre'];
$monmessage = $tableau['message'];

etc.
 
Ok merci.
Cela étant, ça nous éloigne de la table ça. Et c'est le couple requete interrogeant une table qui m'intéresse.
Bon après moults arrachage de cheveux, je suis parvenu à mes fins.


 {$req = $bdd->prepare('INSERT INTO une_news (id, titre, message, affichage) VALUES(:id, :titre, :message, :affichage) ON DUPLICATE KEY UPDATE titre=:titre, message=:message, affichage=:affichage' );

    $req->execute(array(
     'id'=>1,    
    'titre' => $_POST['titre'],
    'message' => $_POST['message'],
    'affichage' => $affichage
    ));  
    }


Merci à ceux qui ont pris le temps pour me répondre.