MySQL插入选择

时间:2010-11-03 15:54:07

标签: 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);
}

&GT;

5 个答案:

答案 0 :(得分:4)

要首先直接回答您的问题,函数mysql_insert_id()将返回分配给最近插入的行的ID。没有猜测; MySQL很乐意告诉你(通过它自己的内置LAST_INSERT_ID()函数)它分配了什么ID。

另外,我看到您正在将$_POST中的值直接插入到SQL语句中。从来没有 EVER 这样做。这会将您的应用程序暴露给SQL注入攻击。

使用mysql_real_escape_string()函数正确转义值以便在SQL语句中使用,或者,因为您已经在使用mysqli_函数,所以使用占位符(?值)来创建一个准备好的声明。

答案 1 :(得分:3)

MySqli_Insert_Id ()将返回上次自动生成的ID。插入新线程后立即调用此函数。

答案 2 :(得分:1)

INSERT
INTO    forum_threads (…)
VALUES  (…)

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

答案 3 :(得分:1)

在php脚本中使用sql代码中的MySQL last_insert_id()函数或者mysql_insert_id()中的php包装器。这些将为您提供连接中生成的最后一个auto_increment编号。所以这是线程安全的。

答案 4 :(得分:1)

您可以使用last_insert_id获取刚刚插入的行的ID;不要担心其他人刚刚插入行,last_insert_id是每个连接,所以除非他们使用你的连接,否则你是安全的。

有一个API级别的调用来检索它,因此您无需专门询问服务器。

哦,是的,同样,不要在PHP中使用@运算符,如果你想知道它为什么不好就谷歌吧。