Comment insérer dans plusieurs tables avec CodeIgniter
J'ai deux tables qui ont (1:1) la relation entre les uns des autres.
customers table:
- customerID (PK)(AI)
- customerName
- phone
addresses table:
- customerID (PK&FK)
- address
- city
- zipcode
J'ai essayé de mettre à jour dans la même CodeIgniter afficher le formulaire.
update_view.php
<th>Customer Name:</th>
<td><input type="text" name="customerName"/></td>
<tr>
<th>Customer Phone:</th>
<td><input type="text" name="phone"/></td>
<tr>
<th>Address:</th>
<td><input type="text" name="address"/></td>
<tr>
<th>City:</th>
<td><input type="text" name="city"/></td>
<tr>
<th>Zip Code:</th>
<td><input type="text" name="zipcode"/></td>
Cela fait partie de mon contrôleur code:
public function insert()
{
$this->load->database();
$this->load->model('my_model');
$this->my_model->insert_entry();
$custInsert=$this->my_model->get_all_customers();
$this->load->view('main_view',array('customer'=>$custInsert));
..
}
Remarque: jusqu'à présent tout fonctionnait pour le processus de la table (les clients).
C'est la partie de mon modèle fichier:
function insert_entry()
{
$this->customerName = $_POST['customerName'];
$this->phone = $_POST['phone'];
$this->db->insert('customers', $this); //up to here it was working
//$customerID=$db->insert_id;
$customerID=$this->db->query("SELECT MAX(customerID) FROM `customers`");
$this->customerID;
$this->address = $_POST['address'];
$this->city = $_POST['city'];
$this->zipcode = $_POST['zipcode'];
$this->db->insert('addresses', $this);
}
Que pour moi le problème est que les "adresses" de la table de besoin pour le code client, mais je n'ai pas l'insérer maniable (auto_increment). J'ai essayé de plusieurs façon pour l'obtenir après avoir inséré les clients table, mais je ne peux pas le faire. Est-ce que quelqu'un sait de manière différente ou que dois-je faire?
Une grande question, et une bonne amélioration sur la dernière question. Questions contenant le détail et les tentatives antérieures sont encouragés ici! +1
OriginalL'auteur thatway_3 | 2014-07-17
Vous devez vous connecter pour publier un commentaire.
Le faire, c'est une mauvaise idée... comment est votre application va gérer lorsque de nouveaux clients sont ajoutés à peu près au même moment exact?
Vous devriez vous débarrasser de cette ligne et de l'utilisation de la méthode qui est privilégiée et les œuvres. Si vous ne le faites pas, il peut et va inévitablement entraîner à aller chercher de l'enregistrement incorrect pour un client à un certain point dans le temps et dans l'association d'une adresse avec le mauvais client.
C'est parce que les deux clients de l'exécution du code (assez) en même temps peut rencontrer le
MAX()
au même point dans le temps, et ainsi, chacun pourrait faire la même valeur. Quand ils essaient de s'enregistrer, un seul réussit, et l'autre échoue en raison de la contrainte de clé primaire. Cette situation est connue comme une condition de course et doit être surveillé contre.Utiliser ce lieu:
également ceci:
devrait être:
il ne fonctionne pas aussi bien? pouvez-vous expliquer cela? c'est la méthode qui fonctionne toujours. votre remplacé façon de le faire est un piraté chemin qui va complètement à l'encontre de ce que vous devriez faire, et ce sera un échec si votre application obtient tout type de trafic décent jamais :/
je vous remercie pour votre intérêt. Il est d'essayer d'ajouter toutes les valeurs à la seconde table, et j'ai eu cette erreur. Une Base de données d'Erreur Numéro d'Erreur: 1054 Unknown column 'customerName' in 'field list' INSERT INTO
addresses
(customerName
,phone
,customerID
,address
,city
,zipcode
) VALUES ('sds', 'sds', 46, 'sd', '88', '99') nom de fichier: C:\wamp\www\CodeIgniter_2\system\database\DB_driver.php Numéro de Ligne: 330dans la table d'adresses, il est à seulement 3 champs, seul l'id,nom,prénom, téléphone
Merci. J'ai édité, principalement à expliquer les conditions de course; n'hésitez pas à ajuster comme vous le souhaitez. +1
OriginalL'auteur skrilled
D'une façon plus propre à atteindre ce que vous voulez est d'utiliser des tableaux au lieu de
$this
. Vous aurez toutes les informations dont vous avez besoin et rien de plus. Il y a beaucoup de choses dans votre$this
objet que vous n'avez pas besoin.Dans votre contrôleur
Dans votre modèle
Une bonne pratique est d'utiliser le L'entrée de la Classe de Codeigniter lorsque vous obtenez votre
$_POST
variables. Utilisez simplement le suivant :$this->input->post('VAR_NAME')
au lieu de$_POST['VAR_NAME']
downvoted depuis une mauvaise pratique de l'utilisation de poste au sein d'un modèle lui-même. L'architecture MVC recommande clairement "Les transformations du Contrôleur $_POST les données dans un Modèle objet et le passer uniquement l'objet de Modèle." Vous avez résolu OP répondre en lui enseignant à faire quelque chose de complètement contre les concepts qu'il convient de l'apprentissage (et vous l'a fait son travail pour lui au lieu de lui enseigner quoi que ce soit)
Adrian) n'est pas le code ici une manette plutôt qu'un modèle?
Non, c'est un modèle. Je n'ai pas eu le temps de rentrer dans hier, alors que je ne cherche à répondre à l'OP question d'origine (avant, il a édité) qui était de savoir comment insérer le lien.
Les possibilités d'insertion d'un utilisateur ne devrait pas être limitée à un $_POST demande et rien d'autre. Ce que l'OP n'est vaincre le but de l'utilisation d'un modèle pour commencer. stackoverflow.com/questions/13359818/... "Dans le MVC et MVC-inspiré des modèles de conception, le modèle devrait être au courant ni de l'interface utilisateur, ni de la couche de présentation. Le $_POST variable en PHP est une superglobale. Si vous l'utilisez avec le modèle de couche, votre code est lié à l'interface web et même la demande de la méthode."
OriginalL'auteur Adrian Tombu