我想问一个关于创建表、更改表、更新/设置/位置的问题,因为我对在涉及主键时如何使用这些命令感到非常困惑,并且我从不同的人那里得到了不同的建议。最初,我建立与数据库的连接并在名为"creation.php"的文件中创建一个表:
$con=mysqli_connect("localhost","root","","Accommodation");
$sql="CREATE TABLE Hotels(Name CHAR(30),City CHAR(30))";
我的第二个文件名为"hoteldetails.php",它生成了一份问卷,询问酒店客人他们所住的酒店的名称以及他们的酒店位于哪个城市。来自"hoteldetails.php"的用户数据由"processhoteldetails.php"处理,此文件(未以完整形式给出)包含以下内容:
session_start();
$sessionID = $_SERVER['REMOTE_ADDR'] . " " .
date("Y-m-d H:i:s",time());
$_SESSION['sessionID']=$sessionID;
$sql = "ALTER TABLE Hotels
ADD COLUMN (
`Name` VARCHAR(30),
`City` VARCHAR(30));";
$sql="INSERT INTO Hotels (SessionID, Name, City)
VALUES ('$sessionID','$name', '$city')";
if (!mysqli_query($con,$sql)) {
die('Error: ' . mysqli_error($con));
数据处理后,用户连接到另一个网页,该网页由一个名为"hotelrecommendation.php"的文件生成,该网页询问用户是否会向其他人推荐该酒店并给出评级。"hotelrecommendation.php"由"processhotelrecommendation.php"处理,看起来像这样(这里给出的代码的一部分):
session_start();
$sessionID = $_SESSION['sessionID'];
if($sessionID == "") {
$sessionID = $_SERVER['REMOTE_ADDR'] . " " . date("Y-m-d H:i:s",time());
$_SESSION['sessionID']=$sessionID;
}
$sql = "ALTER TABLE Hotels
ADD COLUMN (
`Recommendation` VARCHAR(150),
`Rating` SMALLINT(5));";
mysqli_query($con,$sql);
$sql = "UPDATE Hotels
SET `Recommendation` = '$recommendation',
`Rating` = '$rating'
where sessionID = '$sessionID'";
当我回答"酒店详细信息.php"中的问题并单击"提交"时,我收到一条错误消息,指出"错误:字段列表中不存在列会话 ID"。(我什至无法回答"酒店推荐.php中的问题,因为此错误阻止我访问该页面)。但除此之外,我还想问以下几点:
1)我真的需要"进程酒店详细信息.php中的ALTER TABLE命令还是多余的?
2)在"流程酒店详细信息.php"中,我有"更改表酒店添加列"语句,该语句添加了两列。但是,在下一行中,我有"插入酒店价值"语句,该语句有三列(额外的列是主键 SessionID)。这让我感到困惑。如何要求 SQL 机器更改表以使其具有两列,然后将值插入到具有三个值的同一表中?这似乎完全不一致。这就是我收到错误消息说字段列表中不存在会话 ID 的原因吗?我真的希望你们中的一些SQL专家能够阐明这个原因,无论我做什么,错误消息不断出现,阻止我进入下一阶段。
-
您无法将
name
和city
添加到Hotels
,因为它们已在CREATE
语句的表中。 正如你推测的那样,这是多余的。 -
您的错误是有道理的,因为您尝试填充表中不存在的字段。您需要先添加
SessionID
字段,然后才能填充它,无论是在CREATE
中还是在ALTER
中。
目前还不清楚为什么你以这种方式进行这种设置,你可能应该CREATE
包含所有相关字段的表,并摆脱添加字段的多个ALTER
语句。