J'ai un problème vraiment bizarre. je n'ai aucune idée pourquoi cela ne fonctionne pas. Je crée un utilisateur, j'obtiens l'identifiant et insère une ligne basée sur cet identifiant dans une autre table. la ligne est insérée avec cet identifiant mais les autres valeurs cependant pour cette ligne ne sont pas insérées !

 $user_id = mysqli_insert_id($this->connection);

 $query = "INSERT INTO selections 
 (user_id, language_id, country_id, region_id, city_id, gender_id, age_id, category_id)
 VALUES ($user_id, 1, 1, 0, 0, 0, 20, 0)";

Donc le user_id est inséré, mais pas les autres valeurs (elles sont toutes à 0 dans la table). J'ai vraiment vérifié les colonnes et supprimé toutes les clés étrangères pour déboguer ce problème. mais je n'en ai aucune idée.

Les colonnes sont toutes INT. la partie étrange est parfois lorsque je remplace $ user_id par un nombre littéral, cela fonctionne, parfois non. mais la ligne est toujours créée. et j'ai vérifié que $ user_id est un entier.

Je sais que c'est un problème difficile et qu'il peut être causé par beaucoup de choses, mais j'ai essayé de résoudre ce petit problème pendant 3 heures maintenant. ce serait donc bien si quelqu'un me donnait quelque chose que je pourrais faire pour déboguer ce problème.

MISE À JOUR : même lorsque j'ai défini des valeurs par défaut et que j'ai simplement inséré la première colonne (user_id), cela ne fonctionne pas. tous les autres champs sont à 0. Tellement bizarre !

| selections | CREATE TABLE `selections` (
  `user_id` int(11) NOT NULL,
  `language_id` int(11) NOT NULL DEFAULT '1',
  `country_id` int(11) NOT NULL DEFAULT '1',
  `region_id` int(11) NOT NULL DEFAULT '0',
  `city_id` int(11) NOT NULL DEFAULT '0',
  `gender_id` int(11) NOT NULL DEFAULT '0',
  `age_id` int(11) NOT NULL DEFAULT '0',
  `category_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |


  $query = "INSERT INTO selections
        (user_id)
        VALUES ('$user_id')";

Le user_id affiche 178 et les autres champs sont 0 :(

MISE À JOUR:

Cela a fonctionné dans la ligne de commande sql. mais pas en php. mais mysqli n'a généré aucune erreur et la ligne a bien été insérée mais pourquoi les autres champs sont-ils à 0 ?

RÉPONSE : Ma faute. j'avais un script jquery qui l'a ramené à 0 0 0 0 0 0 0. Il y a beaucoup d'AJAX sur ma page donc c'était difficile de le trouver... désolé mon mauvais !

0
ajsie 5 janv. 2010 à 19:27
Pouvez-vous nous obtenir le résultat des sélections SHOW CREATE TABLE ? dans MySQL ?
 – 
Emil Vikström
5 janv. 2010 à 19:29
Avez-vous vérifié que les appels mysqli_query() ou autre chose réussissent ?
 – 
Ignacio Vazquez-Abrams
5 janv. 2010 à 19:31
Avez-vous essayé d'ajouter l'ID utilisateur via ( " .$userid . ",.... ?
 – 
Anthony Forloney
5 janv. 2010 à 19:32
La table contient-elle déjà une ligne avec cet user_id ?
 – 
Emil Vikström
5 janv. 2010 à 19:33
Donc bizarre. Même quand j'ai des valeurs par défaut, puis insérez simplement l'identifiant utilisateur, cela ne fonctionne pas. chaque champ est 0.
 – 
ajsie
5 janv. 2010 à 19:46

2 réponses

Meilleure réponse

Lorsque vous rencontrez des situations comme celle-ci, imprimez la requête à l'écran avant qu'elle ne soit exécutée :

$query = "INSERT INTO ...";
echo $query

Essayer:

$query = "INSERT INTO selections 
            (user_id, language_id, country_id, region_id, city_id, gender_id, age_id, category_id)
          VALUES 
            ({$user_id}, 1, 1, 0, 0, 0, 20, 0)";

Vous devez envelopper les variables PHP dans {} lorsque vous les référencez dans des instructions de chaîne SQL.

Utilisez vos contraintes par défaut


Si vous avez des valeurs par défaut, vous n'avez pas besoin de définir les valeurs dans votre instruction INSERT :

INSERT INTO selections 
  (user_id)
VALUES 
  ({$user_id})

Intégrité référentielle


Vous obtenez le dernier identifiant inséré et l'utilisez dans une insertion ultérieure dans une autre table, mais vous n'avez pas de clé étrangère définie sur la colonne user_id pour vous assurer que la valeur entrant dans cette colonne existe réellement dans le autre tableau. Si vous fournissez le nom de la table et de la colonne que vous obtenez pour votre dernier identifiant d'insertion, je fournirai la instruction ALTER TABLE.

4
OMG Ponies 5 janv. 2010 à 20:21
1
Oui, faites définitivement écho à la requête $, puis essayez de charger une console MySQL et d'exécuter cette requête et voyez ce qui se passe. Une autre chose que je suggérerais est de définir votre mode SQL sur Strict, MySQL a différents modes, certains insèreront 0 dans une variable en cas d'erreur et donneront un avertissement, d'autres arrêteront l'insertion tous ensemble s'il y a une erreur, vous voulez probablement un régime strict.
 – 
MindStalker
5 janv. 2010 à 19:45
$query = "INSERT INTO selections 
(user_id, language_id, country_id, region_id, city_id, gender_id, age_id, category_id)
VALUES ('$user_id', 1, 1, 0, 0, 0, 20, 0)";

Les guillemets simples autour de $user_id pourraient le faire.

1
EpicDewd 5 janv. 2010 à 19:30
1
Ce serait correct si la colonne user_id était un type de données lié à une chaîne (texte, varchar)
 – 
OMG Ponies
5 janv. 2010 à 19:34