2009-06-04 4 views
1

Quelle est la meilleure façon de transporter un ID incrémenté automatiquement d'un formulaire à un autre?Transporter des valeurs de ligne à partir de MYSQL après la soumission d'un formulaire

J'ai 3 tables (utilisateurs, résidences et user_residences). Je veux qu'un utilisateur s'inscrive, soit ajouté à la table des utilisateurs, soit redirigé vers un formulaire pour créer une résidence qui ajoutera une ligne à la table de résidence et ajoutera simultanément l'identifiant de la ligne tabe de la résidence et l'identifiant de la rangée des utilisateurs aux users_residences table.

J'ai joué avec des segments d'uri mais je ne peux pas penser à un moyen de stocker (ou d'appeler) l'identifiant de l'utilisateur nouvellement ajouté pour l'utiliser dans la seconde forme.

Je pourrais probablement utiliser des sessions pour stocker un ID de session dans la table des utilisateurs, puis trouver l'ID de ligne à partir de cela, mais il semble assez hacky. Je suis assez nouveau à la programmation alors n'hésitez pas à me dire que j'échoue, mais au moins pointez-moi dans la direction de l'endroit où je peux apprendre certains de ces concepts.

Merci
Al

Répondre

1

Je dirais que vous êtes mieux avec la clé de session dans la table des utilisateurs; c'est plus sécurisé (en supposant que vous le faites sur https).

Le stockage d'une valeur dans un champ masqué est facile à manipuler du point de vue de la sécurité. Si vos champs utilisent l'incrémentation automatique, il est également facile de deviner quel sera le prochain. Un utilisateur peut prétendre être le prochain utilisateur à s'inscrire et prendre les informations de cet utilisateur. Vous donnez également des informations sur les identifiants des autres utilisateurs, le nombre d'utilisateurs enregistrés sur votre site, etc.

De même, à moins que vous ne prévoyiez de faire quelque chose, je ne suis pas sûr que vous ayez le choix; l'utilisateur clique sur Soumettre, se redirige vers une autre page Web pendant que l'enregistrement est en cours, la seule information qui pourrait être transmise serait l'URL où vous les redirigerez vers une session. Vous pourriez le passer dans l'url, mais il aurait aussi les problèmes ci-dessus.

+0

Merci! Je suis assez nouveau à tout cela, mais à y penser, la clé de session sera probablement utile dans un tas d'autres endroits, donc ce n'est pas si hacky après tout. – Allansideas

0

Dans la deuxième forme vous pouvez inclure:

<input type='hidden' name='user_id' value='whatever' /> 
+0

Ouais, je l'ai vu dans le tutoriel de blog, mais mon problème est plus la valeur devient correcte (l'identifiant de l'utilisateur venez d'ajouter) dans cette entrée cachée. – Allansideas

0

Dans MySQL, vous pouvez obtenir l'identifiant de la dernière ligne insérée avec cette déclaration:

select LAST_INSERT_ID(); 

Ensuite, vous pouvez passer cette valeur autour de vos formulaires ou des séances pour vos futurs inserts.

+0

Ah oui, je me demandais à ce sujet. Le problème serait que si l'application commençait à se développer très rapidement, y aurait-il une chance que quelqu'un d'autre soumette un formulaire dans le temps que la requête prenait pour se terminer? – Allansideas

+0

Il suffit d'empiler la requête last_insert_id() avec l'insertion pour qu'ils s'exécutent de la manière suivante: Insérer dans les valeurs (nom) des utilisateurs ('taco'); sélectionnez last_insert_id(); – Hardwareguy

+0

Merci, en 30 minutes sur ce site, j'ai appris plus de 2 heures de googling, – Allansideas

0

Vous pouvez appeler

$id = mysql_insert_id(); 

immédiatement après l'exécution de l'instruction d'insertion pour obtenir le dernier identifiant généré par la base de données pour le champ autoincrement. Ceci renvoie 0 si l'instruction n'a pas généré d'identifiant. Ce page explique plus en détail.

Vous pouvez ensuite utiliser cet identifiant sur le formulaire suivant

<input type="hidden" value="<?= $id ?>"/> 
+0

Neat, merci! Si je lance la requête immédiatement après l'insertion alors il n'y a aucune chance qu'un autre enregistrement ait été inséré dans le temps qu'il faut pour exécuter (si deux personnes cliquent sur soumettre simultanément) ou est-ce que cela n'arrive jamais? – Allansideas

+0

Vous devrez tester cette hypothèse. C'est censé être sûr mais vous pourriez avoir malchance. La page qui est liée dans la réponse a une discussion sur la sécurité des threads. –

0

Eh bien, je pense que vous devriez d'abord utiliser des transactions de base de données au cours du processus. La deuxième chose à faire est d'obtenir le dernier id inséré dans la transaction avec:

comme:

$ this-> db-> trans_start();
.. (QUERIES) ...
$ this-> db-> insert_id();
.. (QUERIES) ...
$ this-> db-> trans_complete();

Cordialement,
@pcamacho

Questions connexes