INSERT INTO : valeur non respectée

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

Bonjour, je travaille sur un site site web en PHP et SQL, et je suis actuellement confronté à un problème assez curieux.

J'ai une table nf(id, msg, msg_link, date, id_member, new). Le problème est lorsque je souhaite insérer une nouvelle rangée la valeur du champ new n'est pas respectée. Je ne comprend pas d'autant plus que j'ai un autre bout de code concernant une autre table qui est assez semblable et qui fonctionne correctement.

Le code qui ne fonctionne pas :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
function nf_create($msg, $link, $id_member) 
{
    $date = date('Y-m-d H:i:s');
    $db = db_connect();
    $query = mysqli_prepare($db, '
    INSERT INTO nf(id, msg, msg_link, date, id_member, new)
    VALUES(NULL, ?, ?, ?, ?, 1)');
    $stmt = mysqli_stmt_bind_param($query, 'sssd', $msg, $link, $date, 
            $id_member);
    $stmt = mysqli_stmt_execute($query);
}
?>

J'aimerais ici que new ait la valeur 1, mais suite à l’exécution il vaut toujours 0. Comment faire pour résoudre ce problème ? Merci.

Édité par Halarp27

+0 -0
Auteur du sujet

J’appelle cette fonction dans une autre fonction :

 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
<?php
function msg_nf($id, $type)
{
  $db = db_connect();
  $id_array[] = NULL;

  if($type == 'forum')
  {
      $query = mysqli_prepare($db, '
      SELECT  id_member
      FROM    comments_forums
      WHERE   id_forum = ? AND id_member != ?');
      $stmt = mysqli_stmt_bind_param($query, 'dd', $id, 
              $_SESSION['usr_id']);
      $msg = 'Il y a un ou plusieurs nouveaux messages au sujet : ' . 
              get_content_title('forum', $id);
      $link = 'forums/topic.php?id=' . $id;
  }

  $stmt = mysqli_stmt_execute($query);
  $stmt = mysqli_stmt_bind_result($query, $id_member);

  while(mysqli_stmt_fetch($query))
  {
      if(!in_array($id_member, $id_array))
      {
          nf_create($msg, $link, $id_member);
          $id_array[] = $id_member;
      }
  }
}
?>

Finalement je me suis rendu compte que ça ne marche pas lorsque j'appelle nf_create() en passant comme argument les variables msg, link, et id_member, alors que si je fait par exemple nf_create('Message', 'Lien', 5) ça fonctionne, mais ça n'a alors aucun intérêt.

Édité par Halarp27

+0 -0
Auteur du sujet

La structure de la table nf :

Champ Propriétés
id Clé primaire, int(11)
msg text
msg_link varchar(255)
date datetime
id_member int(11)
new tinyint(1)

Je ne vois pas vraiment pourquoi le new devrait poser problème, j'ai une autre table assez semblable, mais pourtant j'ai ce bout de code la concernant qui fonctionne :

1
2
3
4
5
6
7
8
<?php
$query3 = mysqli_prepare($db3, '
INSERT INTO   privates_nf(id, member_id, member_id2, private_id, new)
VALUES(NULL, ?, ?, ?, 1)');
$stmt3 = mysqli_stmt_bind_param($query3, 'ddd', $_SESSION['usr_id'], 
         $id, $private_id);
$stmt3 = mysqli_stmt_execute($query3);
?>

+0 -0
Staff

Parce que new est un mot-clé dans certains SGBDR (et date aussi d'ailleurs). Pour être sûr que ton code est portable il vaut mieux donc échapper ce genre de nom avec des backticks (`). Mais ce n'est pas le problème principal si ça fonctionne ailleurs.


Je ne vois pas vraiment d'erreur dans la requête SQL, ou alors mon cerveau est encore en week-end, donc je ne saurais pas trop t'aider. As-tu essayé d'exécuter la requête manuellement (directement sur ta BDD), avec éventuellement un EXPLAIN devant ?


Soit dit en passant, tu n'es pas obligé d'indiquer le champ ID s'il est rempli automatiquement : tu peux donc le supprimer de la requête et de la liste de valeurs. ;)

Auteur du sujet

J'ai essayé d'exécuter la requête avec l'interface phpmyadmin et ça fonctionne. Par contre là je viens d’apporter quelques modifications à la fonction msg_nf(id, type), et je crois comprendre d'où vient le problème.

 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
<?php
function msg_nf($id, $type)
{
  $db = db_connect();
  $id_array[] = NULL;

  if($type == 'forum')
  {
      $query = mysqli_prepare($db, '
      SELECT  id_member
      FROM    comments_forums
      WHERE   id_forum = ? AND id_member != ?');
      $stmt = mysqli_stmt_bind_param($query, 'dd', $id, 
              $_SESSION['usr_id']);
      $msg = 'Il y a un ou plusieurs nouveaux messages au sujet : ';
      $link = 'forums/topic.php?id=';
  }

  $msg .= get_content_title($type, $id);
  $link .= $id;
  $stmt = mysqli_stmt_execute($query);
  $stmt = mysqli_stmt_bind_result($query, $id_member);

  while(mysqli_stmt_fetch($query))
  {
      if(!in_array($id_member, $id_array))
      {
          nf_create($msg, 'Lien', $id_member);
          $id_array[] = $id_member;
      }
  }
}
?>

Il y a juste deux modifications au niveau de la concaténation des variables msg et link. C'est le caractère / dans la variable link qui pose problème. Ici j'appelle nf_create(msg, 'Lien', 5), et ça fonctionne, par contre si j'appelle nf_create(msg, link, id_member) ça ne fonctione pas.C'est seulement quand j'enlève le / lorsque je déclare link que cela fonctionne comme je le souhaite. Le problème maintenant c'est que je dois pouvoir ajouter ce /, alors comment faire ?

Sinon, je préfère continuer à indiquer le champ id :)

Édité par Halarp27

+0 -0
Auteur du sujet

Bon j'ai préféré modifier ma table nf(id, msg, msg_link, date, id_member, new) à nf(id, msg, content_type, date, id_content, id_member, new). Au moins maintenant je n'ai plus de problèmes.

+0 -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