【问题标题】:PHP MySQL Search Form Select Field and Search Term, Delimiter In Where ClausePHP MySQL 搜索表单选择字段和搜索词,分隔符在 Where 子句中
【发布时间】:2015-02-18 03:19:29
【问题描述】:

我想让用户通过从下拉列表中选择字段名称来搜索表,然后在该字段中输入要搜索的术语。我遇到的问题是有些字段是字符串,有些是数字。当我从 $_GET 变量构造 WHERE 子句时,我不知道如何分隔搜索词,因为我想不出一个好的方法来确定用户选择的字段是数字还是字符串。

这是搜索表单:

<form action="<?php $_SERVER['PHP_SELF'] ?>">
  <label for="search_field">Search:</label>
  <select name="search_field">
  <?php
    $fields = $res->fetch_fields();
    foreach($fields AS $f) {
      echo '<option value="' . $f->name . '">' . $f->name . '</option>\n';  
    }
  ?>
  </select>
  <label for="search_for">For:</label>
  <input type="text" name="search_for" />
  <input type="submit" value="Search" />
</form>

php 文件这样处理搜索变量:

if(isset($_GET['search_field']) and isset($_GET['search_for'])) {
  $sql_where = "AND " . $_GET['search_field'] . ' = ' . $_GET['search_for'] . ' ';
}

$sql = $sql . $sql_where;

查询适用于数字字段,但不适用于字符串字段。我可以在 search_for 术语周围加上引号,但是数字字段将不起作用。必须有办法做到这一点。有任何想法吗?谢谢。

【问题讨论】:

  • 你能从 search_field 参数中知道 search_for 将具有哪种类型的值吗?如果是这样,则您可以根据该 search_field 值获得 if 条件。希望对您有所帮助

标签: php mysql


【解决方案1】:

只需使用is_numeric 函数来判断它是数字还是字符串:

if(isset($_GET['search_field']) and isset($_GET['search_for'])) {
  if(is_numeric($_GET['search_for']))
  $sql_where = 'AND ' . $_GET['search_field'] . ' =  . $_GET['search_for'] . ';
  else{
     $sql_where = 'AND ' . $_GET['search_field'] . ' = ' . '.$_GET['search_for'] . ' ';
  }
}

【讨论】:

    【解决方案2】:

    您可以使用 is_numeric 检查 $_GET['search_for'] 在 php 中是否为数字

    if(isset($_GET['search_field']) and isset($_GET['search_for'])) {
        $sql_where = "AND " . $_GET['search_field'] . ' = ' .
        (is_numeric($_GET['search_for']) ? $_GET['search_for'] : '"' .
        $_GET['search_for'] . '"' ) . ' ';
    }
    

    此外,如果您总是用引号分隔 search_for,它将适用于数值,您可以尝试一下。我只是想向您展示 is_numeric 函数

    【讨论】:

    • 谢谢。无论正在搜索的表列的数据类型如何,在 search_for 周围加上引号似乎都有效。昨晚它似乎不适用于与类型为 int 或 double 的列的比较,但今天它可以。我一定是累了。
    【解决方案3】:

    您知道您的代码存在安全问题,不是吗?

    但是要解决您的问题,只需这样做

    $search_for = is_numeric($_GET['search_for'])?$_GET['search_for']:"'".addslashes($_GET['search_for'])."'";
    $sql_where = 'AND `' . $_GET['search_field'] . '` = ' . $search_for . ' ';
    

    【讨论】:

    • 我怀疑安全问题,但我不知道它们是什么或如何解决它们。我在某处读过从不使用 PHP_SELF。我不知道为什么。还有 GET 和 POST?我上一个 php mysql 项目至少是 5 年前,我正在重新学习。如果您能指出一些有关编码以实现合理安全性的信息,我将不胜感激。谢谢。
    • 您在查询中直接插入外部代码。有人可以在 search_field 中搜索类似“1 或 search_for”的内容。它会显示一切。但在最坏的情况下,他们可以删除您的所有数据库,查看您的用户,更改密码,无论他们想去哪里。我的建议是使用 PDO 或 mysqli。并搜索“php mysql避免sql注入”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多