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 !
2 réponses
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.
$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.
user_id
était un type de données lié à une chaîne (texte, varchar)
Questions connexes
De nouvelles questions
php
PHP est un langage de script largement utilisé, de haut niveau, dynamique, orienté objet et interprété, principalement conçu pour le développement Web côté serveur. Utilisé pour les questions sur le langage PHP.
mysqli_query()
ou autre chose réussissent ?( " .$userid . ",....
?