2013-01-14 3 views
0

J'essaie d'exécuter une requête sur ma table pour créer une ligne et obtenir son numéro 'id' incrémenté automatiquement pour être ensuite attaché aux enregistrements associés. J'envoie la requête en utilisant php et je l'ai testé sur mon hôte local WAMP et mon hôte distant. Ceci est mon code:requête multiple non exécutée

$myemail = someEmailAddress 

$q = mysqli_query($cxn,"INSERT INTO `purchases`(`id`, `email`) 
VALUES (NULL , '$myemail'); 
SELECT LAST_INSERT_ID();") or die(mysql_error()); 

Si je prends ce bit:

SELECT LAST_INSERT_ID(); 

La requête fonctionne bien et je reçois un nouveau record brillant avec un correctement incrémentée « id » auto mais le remettre dans et rien ne se passe du tout. Incidemment, en exécutant la même requête dans la fenêtre SQL de phpMyAdmin pour mon serveur WAMP, j'obtiens le résultat que je cherchais.

Je pense que le problème est dans l'exécution de plusieurs requêtes dans la même chaîne. Pour autant que je puisse voir la syntaxe est correcte, est-ce un problème avec le serveur que je suis en train de tourner? Laissez-moi vous expliquer ce que je veux accomplir.

Je fais des affaires pour moi et je veux que les clients puissent faire des réservations en ligne. Je souhaite regrouper des événements individuels qu'un client peut vouloir réserver en même temps, en une seule facture. J'ai un tableau ($ _SESSION [panier]) qui collecte les données dans la session et au moment de la réservation je veux créer un nouvel enregistrement dans ma table 'achats' qui a une clé primaire d'incrément auto 'id', quand c'est J'ai besoin de connaître la valeur 'id' pour ce nouvel enregistrement afin que je puisse lier l'événement qu'ils réservent à l'achat via une troisième table avec une relation many-to-many.

Merci pour votre aide.

+0

pourquoi ne pas le faire une deuxième requête pour obtenir le dernier identifiant d'insertion au lieu de essayer de pousser tout cela en 1? – jefffan24

Répondre

1

pour obtenir l'identifiant automatiquement généré au large de la dernière utilisation sql ceci:

The mysqli_insert_id() function returns the ID generated by a query on a table with a 

column having the AUTO_INCREMENT attribute. If the last query wasn't an INSERT or UPDATE 

statement or if the modified table does not have a column with the AUTO_INCREMENT attribute 

, this function will return zero. 

il suffit d'appeler $mysqli->insert_id après la requête lorsque vous en avez besoin.

désolé que vous utilisez le style procédural vous appellerez comme ça

mysqli_insert_id($cxn)

+0

Cela semble fonctionner parfaitement pour ce que je veux atteindre, mais pouvez-vous dire si cette connexion spécifique? En d'autres termes, si deux personnes placent une réservation à une fraction de seconde d'intervalle, la requête de création de leurs deux numéros d'achat peut-elle être exécutée avant que le numéro d'achat de la première personne soit reçu par php, provoquant mysqli_insert_id ($ cxn) 'procédures pour retourner le même résultat, ou va-t-il seulement retourner le dernier identifiant créé par cette connexion indépendamment de l'autre activité sur la table? Si oui, cela résout complètement mon problème et merci beaucoup! – fanaticTwin

+0

@ user1978206 c'est pour la dernière requête de la connexion spécifique. Si ce que vous demandez, c'est que si deux personnes interrogent en même temps, cela peut-il mélanger les identifiants retournés? la réponse est non, il ne peut pas. et aussi si cela a fonctionné pour vous, s'il vous plaît accepter ma réponse. –

-1

utiliser cette fonction

function get_last_id() 
{ 
    $q_last = mysql_query("SELECT max(id) as 'id' FROM purchases ") or die(mysql_error()); 
    return mysql_fetch_assoc($fetch); 
} 
+0

Veuillez décrire ce que cette fonction fait pour une réponse complète. –

+0

Pensé à ce sujet mais la table ne pourrait-elle pas théoriquement être modifiée par un autre utilisateur entre la collecte de l'identifiant et la création du suivant? Peu probable, je sais mais je préférerais éliminer la possibilité si je peux. Merci quand même – fanaticTwin