Codeigniter Activerecord méthode de mise à jour refuse d'insérer la valeur NULL
Je suis en utilisant Codeigniters Active record de la bibliothèque pour effectuer une mise à jour sur une colonne sur ma DB.
Voici le code SQL de la table
CREATE TABLE `schedules` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`reservation_id` INT(11) NULL DEFAULT NULL,
`title` VARCHAR(255) NOT NULL,
`description` VARCHAR(512) NULL DEFAULT NULL,
`start_date` DATE NOT NULL,
`start_time` TIME NOT NULL,
`end_time` TIME NULL DEFAULT NULL,
`enabled` TINYINT(1) NULL DEFAULT '1',
`status` ENUM('OPEN','RESERVED') NULL DEFAULT 'OPEN',
PRIMARY KEY (`id`),
INDEX `fk_schedules_reservations` (`reservation_id`),
CONSTRAINT `fk_schedules_reservations` FOREIGN KEY (`reservation_id`) REFERENCES `reservations` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION
)
J'ai déclaré reservation_id comme nullable (reservation_id INT(11) NULL DEFAULT NULL
)
Le problème est que celui CI ne semble pas vouloir envoyer une valeur NULL lorsque je créer l'instruction.
$data['status'] = $this->Schedule->get_status_open();
$data['reservation_id'] = null;
$this->Schedule->update($s_id, $data);
Ce bout de code génère le message d'erreur suivant
Error Number: 1452
Cannot add or update a child row: a foreign key constraint fails (`ethyme/schedules`, CONSTRAINT `fk_schedules_reservations` FOREIGN KEY (`reservation_id`) REFERENCES `reservations` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
UPDATE `schedules` SET `status` = 'OPEN', `reservation_id` = '' WHERE `id` = '4'
De ce que je sais, tout ce que vous avez à faire est de définir la valeur NULL et AR, doit reprendre que c'est une valeur NULLE, mais qui ne semble pas être le cas ici. Juste continue à envoyer des valeurs vides.
Je suis nouveau sur CI, dois-je faire autre chose pour le faire fonctionner? des idées?
OriginalL'auteur JohnP | 2010-08-18
Vous devez vous connecter pour publier un commentaire.
Essayer:
Pourrait bien être le $data approche n'aime pas les valeurs Null.
fait un peu plus creuser, s'avère xss_clean était en grignotant mes données. Ajout d'une liste d'exclusion pour les types de données de sorte qu'il serait ignorer NULL, TRUE, FALSE. Ressemble à l'utilisation correcte après tout :/
Ouais j'ai pensé qu'il pourrait être un bug, mais je savais que le chemin du travail. Pouvez-vous présenter le bug de la CodeIgniter Problème de Tracker sur BitBucket et je vais essayer d'obtenir une correction dans la base. Aussi, vous pouvez mélanger des $données et d' ->set() autant que vous le souhaitez.
comment avez-vous ajouter à la liste d'exclusion?
J'ai juste modifié le valider() la méthode dans mon modèle de base. Cela s'applique uniquement si vous utilisez le même modèle de base si
OriginalL'auteur Phil Sturgeon
J'ai manipulé de cette façon: étendre la CI_Model classe avec cette méthode pour manipuler les valeurs null. Il faut l'appeler à chaque fois que vous vous attendez à une valeur null. Je n'utilise pas les valeurs null qui, souvent, de sorte que cette méthode est bien pour quand j'en ai besoin pour définir la valeur null. Il suffit de passer une chaîne de caractères 'NULL', à partir du tableau de données. Cette unsets le membre de la pile et la met dans le dossier cache.
OriginalL'auteur steampowered
Dans CI le mot-clé NULL doit toujours être en majuscule. Essayez ce simple changement et voir si cela fonctionne.
Voir les bits de la userguide ici.
C'est la partie du guide de style et ne fait aucune différence pour quoi que ce soit.
En doutais, mais vaut la peine d'essayer!
En fait, cela a fonctionné pour moi.
OriginalL'auteur musoNic80
Votre reservations_id les références de colonne une colonne id dans un tableau de réservations, droit? Avez-vous vérifié que la colonne dans la reservstions table est également permis d'avoir une valeur nulle? Si c'est la clé primaire et de l'auto-incrémenté alors qu'il pourrait bien être le problème. Je ne pense pas que vous pouvez avoir une colonne avec la valeur null dans une table si elle a désigné en tant que clé étrangère à une colonne qui ne peut pas être null dans la table référencée.
Ai-je expliqué clairement pour vous?
OriginalL'auteur musoNic80
À partir de CI 3.0.0 de la documentation:
set() aussi d'accepter un troisième paramètre facultatif ($échapper), qui permettra d'éviter que des données soient échappés si faux.
OriginalL'auteur Abdulqader Kapadia