如何从“线程”表中相关线程的行中检索自动增量编号?

时间:2015-08-14 07:30:29

标签: php mysql sql database

我的数据库中有“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);
?>

2 tables

4 个答案:

答案 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

希望它有所帮助。 :)