尝试从论坛中将记录插入我的数据库时遇到一些麻烦
创建线程时它的作用是进入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;
答案 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中使用@运算符,如果你想知道它为什么不好就谷歌吧。