检索最后插入的iD,然后上载到MySQL#PDO#PHP
我有一个表单,可以将Textarea信息和图像同时上传到MySQL 文本区域检索最后插入的iD,然后上载到MySQL#PDO#PHP,php,mysql,pdo,Php,Mysql,Pdo,我有一个表单,可以将Textarea信息和图像同时上传到MySQL 文本区域iD是AUTO_INCREMENT,而图像iD必须是文本区域的副本。我已经在$\u POST中尝试获取lastInsertId();返回致命错误:调用未定义的函数lastInsertId() 这是我当前用于将信息上载到函数和/或查询的isset的代码: if(isset($_POST['update']) && isset($_FILES['photo1'])){ $update = $_POST
iD
是AUTO_INCREMENT
,而图像iD
必须是文本区域的副本。我已经在$\u POST
中尝试获取lastInsertId()
;返回致命错误:调用未定义的函数lastInsertId()
这是我当前用于将信息上载到函数和/或查询的isset的代码:
if(isset($_POST['update']) && isset($_FILES['photo1'])){
$update = $_POST['update'];
$data = $Wall->Insert_Update( $uiD, $update);
$name = $_FILES['photo1']['name'];
$tmp_name = $_FILES['photo1']['tmp_name'];
$target = "uploads/". $_FILES['photo1']['name'];
if (move_uploaded_file($tmp_name,$target)) {
$sth = $db->prepare("SELECT post_iD FROM posts WHERE uid_fk = :uiD");
$sth->execute(array(':uiD' => $uiD));
$post_iD = lastInsertId();
$sth = $db->prepare('INSERT INTO user_uploads (image_path, uid_fk, image_id_fk) VALUES (:image_path, :uiD, :image_id_fk)');
$sth->execute(array(':image_path' => $target, ':uiD' => $uiD, ':image_id_fk' => $post_iD));
}
}
以下是正在上载文本区域的Insert_更新:
PUBLIC FUNCTION Insert_Update( $uiD, $update){
$sth = $this->db->prepare("SELECT post_iD,message FROM posts WHERE uid_fk = :uiD ORDER by post_iD DESC LIMIT 1");
$sth->execute(array(':uiD' => $uiD));
$result = $sth->fetch();
if ($update!=$result['message']){
$sth = $this->db->prepare("INSERT INTO posts ( message, uid_fk, ip, created) VALUES ( :update, :id, :ip, :time)");
$sth->execute(array(':update' => $update, ':id' => $uiD, ':ip' => $_SERVER['REMOTE_ADDR'], ':time' => time()));
$sth = $this->db->prepare("
SELECT M.post_iD, M.uid_fk, M.message, M.created, U.username
FROM Posts M, users U
WHERE M.uid_fk=U.uiD
AND M.uid_fk = ?
ORDER by M.post_iD DESC LIMIT 1");
$sth->execute(array($uiD));
$result = $sth->fetchAll();
return $result;
} else {
return false;
}
}
表格:
数据库中的更多信息,我怀疑它是否有用
posts表格
:文本区域信息的位置
*已创建post|iD|消息| uid|fk | ip ||*
用户上传表
:图像位置的位置
*图像|图像|路径| uid | fk |图像| iD | fk*
注意:image\u id\u fk
应该等于post\u id
(这很明显)
lastInsertId()如何使用;假设要使用
编辑1:上载完成后,图像的插入值\u id\u fk等于0,而不是post\u id值。出于这个原因,您有什么想法吗?您以错误的方式访问。它需要数据库连接对象
$post_iD = lastInsertId();
应该是
$post_iD = $db->lastInsertId();
您正在以错误的方式访问。它需要数据库连接对象
$post_iD = lastInsertId();
应该是
$post_iD = $db->lastInsertId();
它可以在成功执行INSERT
语句后立即使用。但是,您必须始终检查执行是否成功(或者是否有受影响的行),因为可以从以前执行的语句中找到最后一个insert ID
$sth = $this->db->prepare("INSERT INTO posts ( message, uid_fk, ip, created) VALUES ( :update, :id, :ip, :time)");
$sth->execute(array(':update' => $update, ':id' => $uiD, ':ip' => $_SERVER['REMOTE_ADDR'], ':time' => time()));
$this->db->lastInsertId(); //Upon success, is available
例如:
您有一个创建新帖子的函数。此函数在成功时可以返回最后一个插入ID值,因此您可以向用户显示该值。比如:
if (isset($_GET['id'])){
$id = $manager->createPost($_GET['id']) ;
if (is_numeric($id)){
echo "Your article has been created. ID: {$id}" ; //Or link to it.
}
}
更新:
以下是我对您的问题的建议:lastInsertId始终重新运行0
:
插入值的表必须有主键自动递增
字段,最好是类型为int
它可以在成功执行插入
语句后立即使用。但是,您必须始终检查执行是否成功(或者是否有受影响的行),因为可以从以前执行的语句中找到最后一个insert ID
$sth = $this->db->prepare("INSERT INTO posts ( message, uid_fk, ip, created) VALUES ( :update, :id, :ip, :time)");
$sth->execute(array(':update' => $update, ':id' => $uiD, ':ip' => $_SERVER['REMOTE_ADDR'], ':time' => time()));
$this->db->lastInsertId(); //Upon success, is available
例如:
您有一个创建新帖子的函数。此函数在成功时可以返回最后一个插入ID值,因此您可以向用户显示该值。比如:
if (isset($_GET['id'])){
$id = $manager->createPost($_GET['id']) ;
if (is_numeric($id)){
echo "Your article has been created. ID: {$id}" ; //Or link to it.
}
}
更新:
以下是我对您的问题的建议:lastInsertId始终重新运行0
:
您插入值的表必须有主键自动递增
字段,最好是键入int
您是对的,我的好人。我忘了提到当它上传时,它总是输入一个0的值,而不是最后插入的值。@iBrazilian你能澄清一下吗?当然。而不是插入lastInsertId();它上载0的值。好像lastInsertId();根本没有检索任何值。在MySQL数据库上,image\u id\u fk=0而不是ex:post\u id=344,而image\u id\u fk=0。这可以理解吗?@iBrazilian在使用lastInsertId()
之前,您使用的是select语句。那么您想要select语句的id吗?是的。这就是重点,因为我有一个表单,我正在上传一个文件和文本信息,我希望它们都有相同的iD,这样我就可以把信息放在一起。或者我希望LastInsertId()返回与Insert\u Update函数正在上载的post\u iD相同的post\u iD。我忘了提到当它上传时,它总是输入一个0的值,而不是最后插入的值。@iBrazilian你能澄清一下吗?当然。而不是插入lastInsertId();它上载0的值。好像lastInsertId();根本没有检索任何值。在MySQL数据库上,image\u id\u fk=0而不是ex:post\u id=344,而image\u id\u fk=0。这可以理解吗?@iBrazilian在使用lastInsertId()
之前,您使用的是select语句。那么您想要select语句的id吗?是的。这就是重点,因为我有一个表单,我正在上传一个文件和文本信息,我希望它们都有相同的iD,这样我就可以把信息放在一起。或者我希望LastInsertId()返回与Insert\u Update函数上载的post\u iD相同的post\u iD。感谢您对该函数的详细介绍。如果lastInsertId()发生了什么;是否根本没有检索任何值,并将0的值上载到数据库?因为这就是它目前正在做的事情!您的数据库中是否有一个自动增量
字段?对于必须等于具有自动增量的post\u id的image\u id\u fk,您的表中的每个项都必须有一个唯一的自动增量
id。正如我在线程本身中提到的那样。image_id_fk应等于最后插入的id,以便我可以在循环中检索图像。textarea=post\u iD.image=image\u iD\u fk=post\u iD.所以它们需要匹配,因为它们是一起上传的。即使这样,如果我对图像id fk进行自动增量,它的id值会不同吗?编辑:你说得对,它确实有自动递增功能,但我只是想匹配两个id,这样我就可以把数据放在一个循环中。谢谢你对这个函数的详细介绍。如果lastInsertId()发生了什么;是否根本没有检索任何值,并将0的值上载到数据库?因为这就是它目前正在做的事情!您的数据库中是否有一个自动增量
字段?对于必须等于具有自动增量的post\u id的image\u id\u fk,您必须具有唯一的自动增量