gpt4 book ai didi

php - 为什么 INSERT INTO 后跟 SELECT LAST_INSERT_ID() 不输出任何内容?

转载 作者:太空宇宙 更新时间:2023-11-03 11:52:13 24 4
gpt4 key购买 nike

我的 PHP 代码将前一页的 HTML 表单数据插入到数据库中,并在同一 SQL 语句中从插入的数据中返回 PostID。 PostID 列是 AUTO_INCREMENTING。我已经研究这个问题一两周了,但没有找到有效的解决方案。

<?php
include("dbconnect.php");
mysql_select_db("astral_database", $con);
session_start();

$username = $_SESSION['username'];
$forumtext = $_POST["forumtext"];
$forumsubject = $_POST["forumsubject"];

$postquery = 'INSERT INTO Forums (Creator, Subject, Content) VALUES ("$username", "$forumsubject", "$forumtext"); SELECT LAST_INSERT_ID()';
$result = mysql_query($postquery, $con);

if (!$con) {
echo "<b>If you are seeing this, please send the information below to astraldevgroup@gmail.com</b><br>Error (331: dbconnect experienced fatal errors while attempting to connect)";
die();
}

if ($username == null) {
echo "<b>If you are seeing this, please send the information below to astraldevgroup@gmail.com</b><br>Error (332: Username was not specified while attempting to send request)";
die();
}

if ($result != null) {
echo "last id: " . $result;

$fhandle = fopen("recentposts.txt", "r+");
$contents = file_get_contents("recentposts.txt");
fwrite($fhandle, json_encode(array("postid" => $result, "creator" => $username, "subject" => $forumsubject, "activity" => time())) . "\n" . $contents);
fclose($fhandle);
mysql_close($con);
header("location: http://astraldevgroup.com/forums");
die();
} else {
die("<b>If you are seeing this, please send the information below to astraldevgroup@gmail.com</b><br>Error (330: Unhandled exception occured while posting forum to website.)<br>");
echo mysql_error();
}

mysql_close($con);
?>

首先,mysql_query 不会从 SELECT 语句返回任何内容。我还没有找到任何可以在同一个查询中正确运行 SELECT 语句和 INSERT 语句的东西。如果我尝试在两个不同的语句中运行它们,它仍然不会返回任何内容。我尝试在 SQL 控制台中运行以下语句,它运行良好,没有错误。

INSERT INTO Forums (Creator, Subject, Content) VALUES ("Admin", "Test forum 15", "This is a forum that should give me the post id."); SELECT LAST_INSERT_ID();

最佳答案

mysql_query函数运行多个语句

引用:http://php.net/manual/en/function.mysql-query.php

mysql_query() sends a unique query (multiple queries are not supported) to the currently active database on the server ...

这就是您调用 mysql_query 的原因之一不返回结果集。

最明显的解决方法是不要尝试运行 SELECT在同一个查询中。您可以调用 mysql_insert_id相反。

引用:PHP: mysql_insert_id http://php.net/manual/en/function.mysql-insert-id.php


一些你没有问的问题的答案:

  • 是的,您的示例代码容易受到 SQL 注入(inject)的攻击。<​​/li>
  • 是的,mysql_接口(interface)一直deprecated很长一段时间。
  • 是的,您应该使用 PDOmysqli接口(interface)而不是已弃用的 mysql_功能。

跟进

重新访问我的答案,再次查看问题和示例代码。

我之前指出该代码容易受到 SQL 注入(inject)攻击,因为 SQL 文本中包含潜在的不安全值。这就是它在快速审查时的样子。

但是再看一遍,严格来说这并不正确,因为变量替换并没有真正发生,因为字符串文字包含在单引号中。考虑以下输出:

  $foo = "bar";
echo '$foo';
echo '"$foo"';

然后考虑分配给 $postquery 的内容通过这行代码:

$postquery = 'INSERT ... VALUES ("$username", "$forumsubject", "$forumtext")';

修复该问题 $username被认为是对变量的引用,而不是会引入 SQL 注入(inject)漏洞的文字字符(以获取分配给并入 SQL 文本的 $username 变量的)。

带有绑定(bind)占位符的准备好的语句真的没那么难

关于php - 为什么 INSERT INTO 后跟 SELECT LAST_INSERT_ID() 不输出任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34886518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com