2010-11-03 7 views
2

a rencontré un peu de mal en essayant d'insérer des enregistrements dans mon DB de mon forumMySQL Insert Select

Ce qu'il fait lorsque vous créez un thread est faire une entrée en 2 tables. D'abord, la table forum_threads avec des informations sur le titre du thread, la description, l'affiche, l'heure de publication, etc. Il utilisera thread_id avec AUTO_INTEGER pour générer l'identifiant des threads.

Je dois ensuite obtenir ce thread_id à partir de forum_threads et le mettre en tant que thread_id dans la table forum_posts.

Je ne suis pas sûr si theres de toute façon je peux sélectionner une ligne en fonction de son ID après que je l'ai inséré. Aurais-je juste à sélectionner l'identifiant le plus récent? Cela laisserait-il une marge d'erreur? Une autre idée que j'avais était de choisir en fonction du nom d'utilisateur et de l'heure de publication.

Pensées?

<?php 

if (isset($_POST['submit'])) { 
    $thread_sql = " 
     INSERT INTO forum_threads (
      user_id, 
      forum_id, 
      thread_postdate, 
      thread_title, 
      thread_description, 
      thread_icon 
     ) VALUES (
      '$_SESSION[user_id]', 
      '$_GET[f]', 
      '$date', 
      '$_POST[topictitle]', 
      '$_POST[topicdescription]', 
      '$_POST[posticon]' 
     ) 
    "; 
    $thread_query = @mysqli_query ($db_connect, $thread_sql); 

    $post_sql = " 
     INSERT INTO forum_posts (
      user_id, 
      thread_id, 
      post_message, 
      post_date 
     ) VALUES (
      '$_SESSION[user_id]', 
      '', 
      '$_POST[content]', 
      '$date' 
     ) 
    "; 
    $post_query = @mysqli_query ($db_connect, $post_sql); 
} 

?>

Répondre

3

MySqli_Insert_Id() retourne le dernier identifiant automatiquement généré. Appelez cette fonction immédiatement après avoir inséré votre nouveau thread.

1
INSERT 
INTO forum_threads (…) 
VALUES (…) 

INSERT 
INTO forum_posts (thread_id, …) 
VALUES (LAST_INSERT_ID(), …) 
1

fonction last_insert_id() Utiliser MySQL dans le code SQL ou l'emballage php pour elle mysql_insert_id() dans un script php. Ceux-ci vous donneront le dernier numéro auto_increment généré dans votre connexion. Donc, c'est thread safe.

1

Vous pouvez simplement utiliser last_insert_id pour obtenir l'ID de la ligne que vous venez d'insérer; ne vous inquiétez pas si quelqu'un d'autre insère une ligne juste après, last_insert_id est per-connection, donc à moins d'avoir utilisé votre connexion, vous êtes en sécurité.

Il existe un appel au niveau de l'API pour récupérer ceci, donc vous n'avez pas besoin de demander spécifiquement au serveur.

Oh oui, aussi, n'utilisez pas l'opérateur @ en PHP, jamais, google pour ça si vous voulez savoir pourquoi c'est mauvais.

4

Pour répondre directement à votre question, la fonction mysql_insert_id() retournera l'identifiant qui a été assigné à la dernière ligne insérée. Il n'y a pas de devinettes impliquées; MySQL vous dira volontiers (grâce à sa propre fonction intégrée LAST_INSERT_ID()) quel ID il a assigné.

Sur une note séparée, je vois que vous insérez directement des valeurs de $_POST dans votre instruction SQL. Jamais, jamais, JAMAIS faites cela. Cela expose votre application aux attaques par injection SQL.

Soit utiliser la fonction mysql_real_escape_string() pour échapper correctement les valeurs à utiliser dans une instruction SQL, ou, puisque vous utilisez déjà mysqli_ fonctions, l'utilisation des espaces réservés (? valeurs) pour créer une déclaration préparée.