我的数据库中有“threads”表和“comments”表。两个表都有一个自动增量ID列,时间戳等。还有一个“THREAD ID”列,我想在“comments”表中插入线程的ID。
我的问题是:如何从“threads”表中检索相关线程行的自动增量ID号,并在每次插入注释时将此号码插入“comments”表的“THREAD ID”列。所以我可以在“评论”和“线程”之间建立一个链接。
我在PHP方面有点初学者,我想学习代码的解释。喜欢哪个字符串用于什么,哪种方法适用于什么..
<?php
/*show error codes*/
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On'); //On or Off
/* database info*/
define('DB_NAME', 'imageboard');
define('DB_USER', 'root');
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost');
$link1 = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD);
if (!$link1) {
die('Could not connect: '.mysqli_error());
}
$db_selected = mysqli_select_db($link1, DB_NAME);
if (!$db_selected) {
die('Can\'t use' . DB_NAME . ': ' . mysqli_error());
}
//when pressed submit
if (isset($_POST['replySubmit'])) {
//buton ve textarea def
$deger = $_POST ['replyComments'];
$deger2 = $_POST ['replyNickName'];
$deger3 = $_FILES ['replyUserFile']['name'];
// WANT TO DEFINE THREAD ID HERE
//deger4 = $_POST [];
// SEND TO DATABASE
$sql1 = "INSERT INTO newReply (COMMENT, NAME, IMAGENAME) VALUES ('$deger', '$deger2', '$deger3')";
//connection check
if (!mysqli_query($link1, $sql1)) {
die('Error: ' . mysqli_error());
} else {
header('Location: ./thread.php');
}
}
?>
<?php
if(isset($_FILES['replyUserFile'])) {
$uploadName1 = $_FILES['replyUserFile']['name'];
$uploadTmp1 = $_FILES['replyUserFile']['tmp_name'];
$uploadType1 = $_FILES['replyUserFile']['type'];
// CORRECTION
$uploadName1 = preg_replace("#[^a-z0-9.,]#i", "_", $uploadName1);
// FILES TO directory
if(!$uploadTmp1) {
die("can't send...");
} else {
move_uploaded_file($uploadTmp1, "./images/$uploadName1");
}
$link1 = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD);
if (!$link1) {
die('Could not connect: '. mysqli_error());
}
$db_selected1 = mysqli_select_db($link1, DB_NAME);
if (!$db_selected1) {
die('Can\'t use' . DB_NAME . ': ' . mysqli_error());
}
//INSERT INTO tables
$sql1 = "INSERT INTO images (USERIMAGENAME) VALUES ('$uploadName1')";
//connection check
if (!mysqli_query($link1, $sql1)) {
die('Error: ' . mysqli_error());
} else {
// CHANGE THE NAME OF THE IMAGE FILE IN THE DIRECTORY TO DATABASE ID NUMBER
$last_id = mysqli_insert_id($link1);
$ext1 = pathinfo("./images/$uploadName1", PATHINFO_EXTENSION);
rename("./images/$uploadName1", "./images/$last_id".".".$ext1);
// GO BACK TO THREAD
header('Location: ./thread.php');
}
}
mysqli_close($link1);
?>
答案 0 :(得分:1)
//If the previous request triggered an auto increment
if (mysqli_insert_id($link)<>'') {
//retrieves the last ID
$lastID = mysqli_insert_id($link);
//do something
}
else {
//do something else...
}
请务必选择INNODB引擎以便能够处理外键
答案 1 :(得分:1)
我想知道为什么其他人建议您在想要获取thread_id时使用mysqli_insert_id()。据我所知,mysqli_insert_id()将返回最后一个mysql查询的成功插入的id。
但是在这里,当我检查你的代码时,你不是在这里创建线程。它已经创建了(早些时候)。
你想要完成的是(据我所知),你想要存储&#39; thread_id&#39;在你的评论&#39; table作为对此评论发布到哪个主题的引用,对吧?
我的建议是在评论表单中使用隐藏字段,并将thread_id传递给提交页面。
然后你可以检索&#39; thread_id&#39;同样,你得到了replyNickname,replyComment等。
然后,使用&#39; thread_id&#39;在您的查询中。
前:
//when pressed submit
if (isset($_POST['replySubmit'])) {
//buton ve textarea def
$deger = $_POST ['replyComments'];
$deger2 = $_POST ['replyNickName'];
$deger3 = $_FILES ['replyUserFile']['name'];
// WANT TO DEFINE THREAD ID HERE
$thread_id = $_POST ['thread_id']; // Note this line
//deger4 = $_POST [];
// SEND TO DATABASE
$sql1 = "INSERT INTO newReply (COMMENT, NAME, IMAGENAME, THREAD_ID) VALUES ('$deger', '$deger2', '$deger3', '$thread_id')";
//connection check
if (!mysqli_query($link1, $sql1)) {
die('Error: ' . mysqli_error());
} else {
header('Location: ./thread.php');
}
}
我希望我理解的是正确的。这只是一个粗略的想法,你可以随心所欲地传递thread_id。但是我没有看到在这里使用mysqli_insert_id()的任何意义。
答案 2 :(得分:0)
假设你正在使用MySQL:
PDO(其中$ pdoConn是您的PDO连接):
$yourlastID = $pdoConn->lastInsertId();
的mysqli:
$yourlastID = $mysqli->insert_id;
答案 3 :(得分:0)
如果您使用的是MSSQL,请使用SCOPE_IDENTITY()。阅读http://www.codeproject.com/Articles/103610/Difference-between-IDENTITY-SCOPE-IDENTITY-IDENT-C
create PROCEDURE [dbo].[spInsertIntoThreads]
(
@THREAD_ID int OUTPUT,
@Column1 varchar(50) = NULL,
)
AS
BEGIN
SET NOCOUNT ON;
Insert Into Threads(Column1)
values(@Column1);
SET @THREAD_ID=SCOPE_IDENTITY();
END
希望它有所帮助。 :)