在PHP和MySQL中,无法从依赖于另一个表(关系数据库)的表中选择所有结果


Cannot select all results from a table depending on another table (relational DB) in PHP and MySQL

我正在努力完成我目前正在创建的这个网站,但我有点卡住了。

我想在数据库中创建一个名为"订单"的表。我希望这个表与我的users表相关,这样当用户转到他的"orders.php"页面(一旦登录)时,他就会看到他所有的当前和以前的订单。

这些将是我的表格字段/列:

id用户名定单号描述量总

这是我的方法:

每当创建新订单时,根据用户的选择(为订单选择的内容)插入所有表字段/列,但用户名将是从保存用户名的$_SESSION或$_COOKIE变量中收集的唯一值。然后,一旦用户转到orders.php,我将执行一个查询,以显示只有该用户名订购的所有订单。请注意,我确实对所有输入/输出进行了消毒,并且我不会在cookie中存储敏感数据。我的系统设计为只使用会话作为身份验证方法,因此每次关闭浏览器时都需要登录,但这没关系。

1) 这是一种安全的方法吗?你有什么建议/意见吗?

2) 你能帮我构造查询吗?

我还没有真正使用过关系数据库,所以我有点迷失了方向。如何调用表"orders"中的所有订单,其中username="username from the session"?

到目前为止,我有这个:

"SELECT * FROM orders WHERE username = ? " //(Using PDO)

我知道这会起作用,但我担心的是,如果会话被劫持或类似的事情发生,那么用户是否能够检索到任何用户的订单?

谢谢你进一步解释并帮助我!

干杯!

小心!请不要创建包含人类可读用户id的纯文本cookie(如user2345995OllieJones)。坏人很容易通过猜测来伪造这样的cookie,然后你的用户信息就会泄露出去。

您正在php中工作。因此,您可以使用php的会话机制来存储您的userid和其他值。php使用难以猜测的会话ID(SID),并将它们存储在cookie中或作为URL中的sid=1234abcd9875参数。

为了您的系统的完整性,请阅读这篇文章。事实上,这是一个精心设计的功能,它已经在野外使用了十五年左右:它已经被调试过了。

http://php.net/manual/en/session.idpassing.php

如果您使用的是会话系统,那么您基本上是在您的第一个页面,即登录页面中执行此操作的。

session_start();
...
$_SESSION['username'] = $username;  /* which you get by logging in */
...

在订单查找页面上,您可以执行类似的操作来检索用户名并在查询中使用它。

session_start();
...
$orderstmt = $pdoconn->prepare("SELECT * FROM orders WHERE username = :username");
$orderstmt->execute( array(':username' => $_SESSION['username']) );
...
while ($row = $orderstmt->fetch()) {
   /* use the row's data */
}
$orderstmt->closeCursor();