2

我正在尝试设置一个简单的多页表单,并使用会话稍后将其存储在多个表中的数据库中。

但是,我似乎遇到了问题。虽然最后一页的值被发布到数据库,但会话变量不会。

请记住.. 我和我的项目合作伙伴完全是 php/sql 的新手,在课堂上可能没有像我们应该有的那样关注。大多数代码几乎都是随机组合在一起的。发现问题似乎不是我们的强项。

第一页 / b_tickets.php (简单的 html 表单,包含值 'ticket_a'、'ticket_k' 和 'ticket_vip')

第二页 / b_rooms.php

    <?php
session_start();

$_SESSION['ticket_a'] = $_POST['ticket_a'];
$_SESSION['ticket_k'] = $_POST['ticket_k'];
$_SESSION['ticket_vip'] = $_POST['ticket_vip'];
?>

第三页 / b_ucp.php

<?php
session_start();

$_SESSION['room_s'] = $_POST['room_s'];
$_SESSION['room_s_extra'] = $_POST['room_s_extra'];
$_SESSION['room_d'] = $_POST['room_d'];
$_SESSION['room_d_extra'] = $_POST['room_d_extra'];
$_SESSION['room_3'] = $_POST['room_3'];
$_SESSION['room_3_extra'] = $_POST['room_3_extra'];
$_SESSION['room_10'] = $_POST['room_10'];
$_SESSION['room_10_extra'] = $_POST['room_10_extra'];
$_SESSION['pension'] = $_POST['pension'];
?>

这导致

插入_ucp.php

(此时,先前变量的回显 §_SESSION 表明它们实际上仍被存储。)

<?php
session_start();

$con = mysql_connect("localhost","XX","XX");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("fatcity", $con);



$sql="INSERT INTO tickets (ticket_a, ticket_k, ticket_vip)
VALUES
('$_SESSION[ticket_a]','$_SESSION[ticket_k]','$_SESSION[ticket_vip]')";

$sql="INSERT INTO rooms (room_s, room_s_extra, room_d, room_d_extra, room_3, room_3_extra, room_10, room_10_extra, pension)
VALUES
('$_SESSION[room_s]','$_SESSION[room_s_extra]','$_SESSION[room_d]','$_SESSION[room_d_extra]','$_SESSION[room_3]','$_SESSION[room_3_extra]','$_SESSION[room_10]','$_SESSION[room_10_extra]','$_SESSION[pension]')";


$sql="INSERT INTO ucp (title, name, n_family, adress, a_housenumber, continent, country, province, region, city, telephone, email, password,  payment, client, comment)
VALUES
('$_POST[title]','$_POST[name]','$_POST[n_family]','$_POST[adress]','$_POST[a_housenumber]','$_POST[continent]','$_POST[country]','$_POST[province]','$_POST[region]','$_POST[city]','$_POST[telephone]','$_POST[email]','$_POST[password]','$_POST[payment]','$_POST[client]','$_POST[comment]')";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }
echo "1 record added";

mysql_close($con);
?>

在这一点上,问题实际上并不在于我们在 php/sql 方面有多糟糕——谢谢……我们已经弄清楚了。离我们的最后期限只有三天了。。

但是为什么会话变量没有保存到数据库中。我们究竟忽略了什么?

非常感谢你提前..

4

3 回答 3

1

每次运行查询!!!

您创建变量,然后将其覆盖 2 次而不是执行它

应该:

$sql = 'smth';
mysql_query($sql);
$sql = 'smth';
mysql_query($sql);
$sql = 'smth';
mysql_query($sql);

你有

$sql = 'smth';
$sql = 'smth';
$sql = 'smth';
mysql_query($sql);

正如我所说,不要使用 mysql_*。而且你的代码允许sql注入

于 2012-11-23T23:36:20.510 回答
0

我同意 E_p 的观点,即只有一个查询会被执行。执行他的建议将允许您执行所有查询。

您可能还想查看您的表,仅通过查看您的查询结构我看不出它们有什么问题,但您最终可能很难获得您想要的信息。我可能是错的,因为你没有发布你的表格结构,你的问题也不是真的关于这个,但这只是我注意到并认为我会分享的东西。您的表看起来不像通过任何外键相互连接。您的项目可能不需要此操作,但如果您需要提取与所有 ticket_a 条目相关的所有表单数据,那么您只会获得与 ticket_a 列对应的 sessionID 列表,而没有来自您的“房间”或“upc”的任何信息' 表。如果这就是你想要的,那么它很好,否则你可能想要调查它。

于 2012-11-24T00:40:14.443 回答
0

我看到的第一个问题是,$sql变量在最后一段代码中被覆盖了 2 次。因此,只有最后一个查询被执行。

其次,您应该使用这种语法将非部落变量注入字符串:"INSERT ... ${someArray[someKey]} ..."- 注意花括号。这在这里不是必需的,但它将使您免于将来的麻烦。

第三,清理所有输入数据!您将在最后一个代码示例中进行SQL 注入。

最后,不需要session_start()在每个文件中 - 只需将它放在引导文件中一次即可require_once

于 2012-11-23T23:37:11.477 回答