requète INSERT

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonsoir :)

c'est étrange, car j'ai une requete INSERT, qui ne marche pas (ma table ne se modifie pas), mais le plus étrange, c'est que je n'ai pas d'erreurs o.O .

voici mon code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$req = $bdd->prepare('SELECT * FROM vues WHERE mail = :mail');
$req->bindValue(':mail', $mail,PDO::PARAM_STR);
$req->execute();

$nb = "";
while($enregistrement = $req->fetch())
{
    echo $mail . $site . $time;
    if ($enregistrement['time'] == $time)
    {
        echo $mail . $site . $time;
        if (empty($enregistrement['nb']))
        {
            //insert
            echo $mail . $site . $time;
            $rq = $bdd->prepare("INSERT INTO vues(mail, url, time) VALUES(:mail, :url, :time)");
            $rq->bindValue(':mail', $mail,PDO::PARAM_STR);
            $rq->bindValue(':url', $site,PDO::PARAM_STR);
            $rq->bindValue(':time', $time,PDO::PARAM_STR);
            $rq->execute();
        }
        else
        {
            //update
            $nb = $enregistrement['nb'];
            $nb++;

            $re = $bdd->prepare("UPDATE vues SET nb = :nb WHERE mail = :mail AND url = :url AND time = :time");
            $re->bindValue(':nb', $nb,PDO::PARAM_STR);
            $re->bindValue(':mail', $mail,PDO::PARAM_STR);
            $re->bindValue(':time', $time,PDO::PARAM_STR);
            $re->bindValue(':url', $site,PDO::PARAM_STR);
            $re->execute();
        }
    }
}

et autre étrangerie (ça se dit ? :p )

c'est les :

1
echo $mail . $site . $time;

celui dans le dernier if ne marche que si il y en a dans les if et while parent o.O savez vous résoudre ces bugs ? cordialement

(ಠ_ಠ) visite Drozor

+0 -0
Staff

echo $mail . $site . $time;

Pour débugger, je te conseille de faire deux choses :

  • lorsque tu crées ta connexion (new PDO), ajoute la ligne suivante : $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);, si erreur il y a, cela déclanchera une exception, te facilitant le travail
  • plutôt que d'utiliser des echo, utilise var_dump, ce qui donnerait, ce code :
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
$req = $bdd->prepare('SELECT * FROM vues WHERE mail = :mail');
$req->bindValue(':mail', $mail,PDO::PARAM_STR);
$req->execute();

$nb = "";
while($enregistrement = $req->fetch())
{
    var_dump( $mail, $site, $time, $enregistrement['time']) ;
    if ($enregistrement['time'] == $time)
    {
        if (empty($enregistrement['nb']))
        {
            //insert
            echo $mail . $site . $time;
            $rq = $bdd->prepare("INSERT INTO vues(mail, url, time) VALUES(:mail, :url, :time)");
            $rq->bindValue('mail', $mail,PDO::PARAM_STR);
            $rq->bindValue('url', $site,PDO::PARAM_STR);
            $rq->bindValue('time', $time,PDO::PARAM_STR);
            $rq->execute();
        }
        else
        {
            //update
            $nb = $enregistrement['nb'];
            $nb++;

            $re = $bdd->prepare("UPDATE vues SET nb = :nb WHERE mail = :mail AND url = :url AND time = :time");
            $re->bindValue('nb', $nb,PDO::PARAM_STR);
            $re->bindValue('mail', $mail,PDO::PARAM_STR);
            $re->bindValue('time', $time,PDO::PARAM_STR);
            $re->bindValue('url', $site,PDO::PARAM_STR);
            $re->execute();
        }
    }
}

Nota, j'ai enlevé les ":" dans les bindvalue car c'est considéré comme "salle" de les mettre.

+0 -0
Auteur du sujet

bonjour, merci de vos réponses ;) en fait, c'était du a une erreur algorithmique de ma part :p . en fait, j'attendait que le code du dernier if s’exécute, alors que c'est impossible :p finalement mon code est :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$req = $bdd->prepare('SELECT * FROM vues WHERE mail = :mail');
$req->bindValue(':mail', $mail,PDO::PARAM_STR);
$req->execute();

$nb = "";
$vue = 0;
while($enregistrement = $req->fetch())
{
    if ($enregistrement['time'] == $time)
    {
        $vue = 1;
        if (!empty($enregistrement['nb']))
        {
            //update
            $nb = $enregistrement['nb'];
            $nb++;

            $re = $bdd->prepare("UPDATE vues SET nb = :nb WHERE mail = :mail AND url = :url AND time = :time");
            $re->bindValue('nb', $nb,PDO::PARAM_STR);
            $re->bindValue('mail', $mail,PDO::PARAM_STR);
            $re->bindValue('time', $time,PDO::PARAM_STR);
            $re->bindValue('url', $site,PDO::PARAM_STR);
            $re->execute();
        }
    }
}

if ($vue == 0)
{
    //insert
    $rq = $bdd->prepare("INSERT INTO vues(mail, url, time) VALUES(:mail, :url, :time)");
    $rq->bindValue('mail', $mail,PDO::PARAM_STR);
    $rq->bindValue('url', $site,PDO::PARAM_STR);
    $rq->bindValue('time', $time,PDO::PARAM_STR);
    $rq->execute();
}

et j'utilisait déjà les erreurs ;) cordialement

(ಠ_ಠ) visite Drozor

+0 -0

Etant donné que le mail est unique avec ça, tu pouvais avantageusement remplacer ton while/if par un simple if/else :

1
2
3
4
5
if ($enregistrement = $req->fetch()) {
    // existant => update
} else {
    // inexistant => insert
}

MySQL ? Si mail est en contrainte unique, pouvait pas simplement faire ça en une requête (INSERT … ON DUPLICATE KEY UPDATE …) ?

HS : si c'est résolu, merci d'indiquer le sujet comme tel ;)

Édité par vibrice

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte