【问题标题】:Using PHP forms in mysql queries, Q2在 mysql 查询中使用 PHP 表单,Q2
【发布时间】:2012-08-24 16:58:33
【问题描述】:

继我之前提出的一个问题之后(得到了非常有帮助的回答 - 谢谢),我有一个后续问题。

我设法将一个表单放入我的页面,该表单成功链接到具有过滤结果的另一个页面。然后我在下面直接添加了另一个表单(作为第二个搜索过滤器),但第二个表单不起作用。代码是:

<p style="margin-left:20px;">Search by:<br />
<form action="ordersfiltered.php" method="post">
order_no: <input type="int" name="order_no" />
<input type="Submit" />
</form>
<form action="ordersfiltered_name.php" method="post">
name: <input type="text" name="name" />
<input type="Submit" />
</form></p>

就像我说的,如果我在第一个框中输入 order_no 并单击“提交”,那么我会进入另一个页面,并相应地过滤结果。但是,当我在第二个框中输入名称时,我得到的页面包含所有表格标题等,但没有结果。作为参考,我在“ordersfiltered.php”页面上的相关代码是:

$result = mysql_query("SELECT * FROM orders WHERE order_no = " . $_POST["order_no"]);

(注意,我意识到我不应该使用 SELECT * - 它在我要更改的列表中)。这很好用。

我在“ordersfiltered_name.php”上的代码是:

$result = mysql_query("SELECT * FROM orders WHERE name = " . $_POST["name"]);

任何想法为什么第一个有效但第二个无效?

另外 - 如果可能的话,我想修改它添加类似 WHERE name LIKE '%...%' 的内容,以防用户没有输入整个内容。

再次感谢。

【问题讨论】:

  • 这可能无助于回答您的问题,但您应该停止使用mysql_* 函数。它们正在被弃用。请改用PDO(PHP 5.1 起支持)或mysqli(PHP 4.1 起支持)。如果您不确定要使用哪一个,read this article.
  • @Matt 我认为您对上一个问题发表了完全相同的评论...
  • 他只是在宣传……干得好! (去 PDO)
  • @jeroen 是的,我潜伏着回答我能回答的问题,并指出人们何时使用过时的功能。我来这里是为了荣耀。我实际上已经在记事本中写下了评论,所以当需要时,我只是复制/粘贴。
  • 请阅读并遵循您在其他问题中给出的建议。不断犯同样的错误并不断要求我们告诉你如何解决它是没有意义的。

标签: php mysql html forms


【解决方案1】:

您说之前提出的问题有一些有用的答案,尽管您似乎没有使用任何答案:Using PHP forms in mysql queries(我不会从那里重复所有有效点...)。

也就是说,您缺少已发布变量的引号和转义:

$result = mysql_query("SELECT * FROM orders WHERE name = '" . mysql_real_escape_string($_POST["name"])) . "'";

【讨论】:

  • 使用mysqli,这种事情要容易上千亿倍。这是真的。我对它进行了一次基准测试,这就是它所说的。一千亿。
【解决方案2】:

我认为这与order_no 是一个数字而name 是一个字符串这一事实有关。 字符串必须用引号括起来。

因此,改变:

$result = mysql_query("SELECT * FROM orders WHERE name = " . $_POST["name"]);

到:

$name =  mysql_real_escape_string($_POST['name']);
$result = mysql_query("SELECT * FROM orders WHERE name = '". $name ."'");

您还需要检查 $_POST['name'] 是否没有任何引号。

编辑 1.您始终可以在您的mysql 命令之后使用or die(mysql_error())。 然后,您将能够看到这些命令不起作用的原因。

编辑 2. 在查询中使用 $_POST[..] 非常危险。 您应该先检查它的值并确保“清理”它。

编辑 3.另一个注意事项,考虑转移到PDO

【讨论】:

  • 您正在记录 PDO,然后无耻地将 $_POST 变量直接放入您的 SQL 中?来吧,你可以做得比这更好。无论问题是什么,都不要发布带有漏洞的答案。这是你的答案,这是你的代码。
  • 你要我教他如何使用 PDO 吗?这是他的情况的答案,他是要考虑是否使用 PDO 或保持不安全的人。
  • 再次感谢。老实说,这整件事是针对一个大学项目及其本地托管的虚拟数据 - 所以我并不担心攻击等。我也不知道 PDO 是什么(我几乎不知道什么是 PHP/html/mysql是!)在这一点上,我只是想让它工作,即使它远非完美。谢谢大家
  • 学术与否,如果你在没有逃避的情况下这样做,那么你的做法是错误的,当你在其中插入带有' 的数据时,你会遇到令人困惑的错误。这也是一个非常的坏习惯,就像重复使用注射器一样。 “但我只是在医学院,”你说。没关系。
  • @OfirBaruch 是的,提供使用 PDO 的示例代码。不难:stackoverflow.com/questions/12098031/…
猜你喜欢
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 2018-12-05
  • 2016-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2017-04-03
相关资源
最近更新 更多