是否可以在 SQL 中 SELECT * FROM a table WHERE column 1 = something 而不是 column_name = something

Posted

技术标签:

【中文标题】是否可以在 SQL 中 SELECT * FROM a table WHERE column 1 = something 而不是 column_name = something【英文标题】:Is it possible in SQL to SELECT * FROM a table WHERE the column 1 = something and not the column_name = something 【发布时间】:2012-06-07 08:57:50 【问题描述】:

我想SELECT * FROM table 其中第一列等于一个变量。它假设我不知道列名。

我知道我可以做类似的事情

SELECT * FROM table WHERE column_id = 1 

但我无法比较数据。

我该怎么做?

我找到了一些 T-SQL 解决方案,但我不感兴趣。

更准确地说:

我正在我的网站上开发一个管理面板,“超级”管理员可以直接修改数据库。为此,我可以选择一个表并编辑该表。但要做到这一点,我只使用了一个显示所有表的 php 脚本,我们可以选择一个,脚本会显示所选表中的所有行。之后,您选择一行,您将被重定向到问题所在的页面。这个页面可以接收任何只有一行的表,所以我想SELECT这行包含的数据。

要理解的图片: 第一个显示表格。 第二个显示选定表的行。 第三个显示(通常)1行的数据,但在这张图中我们可以看到很多行的数据。selecto http://imageshack.us/g/135/selecto.png

我找到了解决办法:

试着解释一下: 首先:我从发布的特定表格中选择了所有表格

 $query="SELECT * FROM ".$_POST['table']."";
    $result=mysql_query($query);

第二:我将列名归因于变量(我不知道)

while($fields=mysql_fetch_array($result))
    
        $col =  mysql_field_name($result,0);
        $nb++;
    

第三:我从表where $col = id的行中选取数据

$sql = "SELECT * FROM ".$_POST['table']." WHERE ".$col."=".$_GET['idRow']."";
$result1=mysql_query($sql);

【问题讨论】:

目前尚不清楚您要完成什么以及您是如何失败的。考虑改写你的问题。 如果您对 T-SQL 不感兴趣 - 什么您对数据库和 SQL 方言感兴趣!?!? 奇怪的是您知道表的名称,而不是其 PK 的名称。通过合理的命名约定,它甚至可以被推断出来。 你不能在一个语句中做SELECT * FROM every table,当你有多个语句时,你也可以在它们中指定不同的列名。 只是指出这里的声明...$query="SELECT * FROM ".$_POST['table'].""; ...让您对各种 SQL 注入开放。 【参考方案1】:

如果你知道有多少列,你可以在这里使用这个小技巧:

SELECT *
FROM (
  SELECT null x1, null x2, ..., null xn
  WHERE 1 = 0
  UNION ALL
  SELECT * FROM my_table
) t
WHERE t.x1 = something

在 MySQL 以外的其他数据库中,重命名“未知”列会更简单,例如在 PostgreSQL 中,您只能像这样重命名第一列:

SELECT * FROM my_table t(x) WHERE x = something

如果您对桌子一无所知

...可以先快速查询information_schema

SELECT column_name
FROM information_schema.columns
WHERE table_name = :my_table
AND ordinal_position = 1

SQL注入注意事项

请不要,不要这样做。永远:

$query="SELECT * FROM ".$_POST['table']."";

I've recently written an article about SQL injection。每一个像你这样的漏洞都会允许任何脚本小子转储你的数据库,或者更糟。

解决方案是首先清理您的输入。理想情况下,您将维护一个允许的表字符串目录,将您的 $_POST 变量与那些比较,然后将预定义的表字符串连接到您的 SQL 语句中,不是用户输入。 p>

【讨论】:

【参考方案2】:

我认为您可以使用SHOW CREATE TABLE table_name 来获取表的架构。在那之后,你应该已经知道每一列了。

【讨论】:

【参考方案3】:

在 PHP 中,您可以执行以下操作:

$col = 'users';
mysql_query("SELECT * FROM table WHERE $col = $something");

【讨论】:

是的,但我不知道列名。 你的变量中没有这个未知的列名吗? 好的,我有个主意,我可以做一个 $fields = mysql_num_fields($result);在此之后 $query = "SELECT * FROM $mytable WHERE $fields[0] = $var "; 你可以在MySQL中找到这样的列名:***.com/questions/64894/…

以上是关于是否可以在 SQL 中 SELECT * FROM a table WHERE column 1 = something 而不是 column_name = something的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 SQL 中反转 select 语句?

SQL数据库中如何使用SELECT+参数+FROM?

在sql中select from where 的where的条件是否一定要是表里面的字段

SQL SELECT Union SELECT FROM (选择...)

怎么用SQL比对两表

SQL Server - SELECT FROM存储过程