【问题标题】:Help in displaying data from Database帮助显示数据库中的数据
【发布时间】:2011-09-08 21:29:54
【问题描述】:

我创建了一个 SQL 页面,用户可以在其中运行 SQL 查询。我的问题在于我不知道用户将输入哪些列。因此,我无法显示他的要求。 就像他的查询是:select id from emp;我怎么知道他输入了什么列名并因此将其显示在结果页面中。 这是您可以使用并帮助我的确切查询。我在我的代码中使用了许多 IF 案例。 例如: if(strpos($query,"id")) 然后它显示 id 列。 请帮我。 并提前感谢!

【问题讨论】:

  • 我很想查看查询历史记录以了解各种攻击
  • 不确定你想在这里做什么
  • 通常情况下,您应该能够使用mysql_num_fieldsmysql_field_name 函数从查询结果中获取列标题列表。
  • @pinouchon 我的第一个想法是在字段中输入“drop database x” :) 另一方面,他实际上可能正在解析输入的查询以只允许某些事情。
  • @Aleks G 当我看到这种网站时,我无法抗拒

标签: php mysql html


【解决方案1】:

must开个玩笑,让用户在一个全世界都可以访问的网络表单中写出这样的声明..

也就是说,当您执行查询时,您可以将结果逐行提取到 key=>value 数组中。键将包含字段名称。为此使用mysql_fetch_array

但真的。如果你的代码正常工作,我可以写

SHOW DATABASES;
DROP DATABASE <databasename that is on my screen>

突然间你得到了一个空服务器。尽快让这个脚本离线。

【讨论】:

  • 这只是一个实验。没有有用的数据可供用户使用。也不是所有的权利都授予用户... SQL 是我们课程的一部分,并考虑尝试...
【解决方案2】:

我选择 GolezTrol,这根本不保存。

您当然可以使用 if 语句检查用户是否使用了“DROP”或“SHOW”这些词,或者只允许某些事情,但我不知道这是否是保存...

【讨论】:

    【解决方案3】:

    只要他限制了 sql 用户与 php mysql 调用相关的权限,就安全了。仅授予它对该数据库的选择权限,并且它是否在公共网站上并不重要(假设您不在乎每个人都可以看到数据)。

    这会将 sql 输出格式化为适合您的表格:

    $header = null;
    $colspan = 0;
    while($values = odbc_fetch_array($rs))
    {
        $result .= "<TR>";
        if(is_null($header))
        {
            foreach(array_keys($values) as $key)
            {
                $header .= "<TH style='border:1px dashed #00FF00;padding:5px 5px 5px 5px;align:left;'>$key</TH>";
                $colspan++;
            }
        }
    
        foreach($values as $value)
        {
            $result .= "<TD style='border:1px dashed #00FF00;padding:5px 5px 5px 5px;align:left;'>$value</TD>";
        }
        $result .= "</TR>";
    }
    }
    $result = "<TABLE style='padding: 1px 1px 1px 1px;border:dash 1px #00FF00;color:#00FF00;'>".
              "<tr><td colspan='$colspan'>>>" . $sql . "</tr></td>" .
              $header.$result."</TABLE>";
    

    【讨论】:

    • 我可以得到要以表格形式显示的数据。我面临的问题是我如何知道用户输入了哪一列并因此显示它。顺便说一句,谢谢。 :)
    • 这就是上面代码的标题部分的用途。它获取数组的键并将它们用作列名。
    【解决方案4】:

    mysql_fetch_field 可以从结果集中获取列名,以及关于列的许多其他信息(类型、最大长度等),这些信息可能对在这样的程序中显示有用。

    【讨论】:

      【解决方案5】:

      当您运行数据库查询的输出时,请执行以下操作:

      $query = mysql_query("YOUR_USERS_QUERY_HERE");
      
      if (mysql_affected_rows() > 0) {
          while ($row = mysql_fetch_assoc($query)) {
              $keys = array_keys($row);
              foreach ($keys as $a_key) {
                  echo $a_key . "=" . $row[$a_key] . " <br /> ";
              }
              echo "<br />";
          }
      } else {
          echo "No Rows Found";
      }
      

      -- 编辑--

      一旦您可以执行以下操作即可输出标题:

      $first = true;
      while ($row = mysql_fetch_assoc($query)) {
          if ($first == true) {
              //output header code here
              $first = false;
          }
          //output data row code here
      }
      

      【讨论】:

      • 嘿,根据上面的帖子,我确实得到了我想要的。谢谢。但是你能帮我做一点格式化吗?请访问link进行查询 - select * from emp;请查看输出并告诉我问题出在哪里..提前谢谢... :)
      • 看起来您在每个循环都输出标题行。输出一次标题行。
      猜你喜欢
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多