2010-11-03 101 views
2

嘗試從我的論壇插入記錄到我的數據庫時遇到了一些麻煩MySQL插入選擇

當您創建線程時,它會對2個表進行輸入。首先是forum_threads表,其中包含主題標題,說明,海報,發佈時間等信息。它將使用帶AUTO_INTEGER的thread_id生成線程ID。

然後,我需要從forum_threads中獲取該thread_id,然後將其作爲thread_id放入forum_posts表中。

我不確定無論如何,我可以根據它的ID選擇一行後我插入它。我只需要選擇最近的ID?這會留下一個錯誤的餘地嗎?我的其他想法是根據用戶名和帖子時間來選擇。

想法?

<?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); 
} 

?>

回答

3

MySqli_Insert_Id()將返回最後自動生成的ID。插入新線程後立即調用此函數。

1
INSERT 
INTO forum_threads (…) 
VALUES (…) 

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

使用MySQL的last_insert_id()功能的SQL代碼或者PHP腳本的PHP包裝它mysql_insert_id()。這些會爲您提供連接中生成的最後一個auto_increment編號。所以它是線程安全的。

1

您可以使用last_insert_id來獲取剛剛插入的行的ID;不要擔心其他人插入一行後,last_insert_id是每個連接,所以除非他們使用你的連接,否則你是安全的。

有一個API級的調用來檢索這個,所以你不需要特別的問服務器。

哦,是的,另外,不要在PHP中使用@操作符,如果你想知道爲什麼它不好,谷歌。

4

要直接回答您的問題,函數mysql_insert_id()將返回分配給最近插入的行的ID。沒有猜測涉及; MySQL會很高興地告訴你(通過它自己的內置LAST_INSERT_ID()函數)它分配了什麼ID。

在另一個筆記上,我看到您直接將$_POST中的值插入到您的SQL語句中。從來沒有,EVER做到了這一點。這會將您的應用程序暴露給SQL注入攻擊。

要麼使用mysql_real_escape_string()函數正確地轉義用於SQL語句的值,要麼因爲您已經在使用mysqli_函數,請使用佔位符(?值)來創建預準備語句。