INSERT INTO : valeur non respectée

Le problème exposé dans ce sujet a été résolu.

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.

+0 -0

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.

+0 -0

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);
?>

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. ;)

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 :)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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