5

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

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

SELECT * FROM table WHERE column_id = 1 

但我无法比较数据。

我怎样才能做到这一点?

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

更准确地说:

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

要理解的图像:
第一个显示表格。
第二个显示选定表的行。
第三个显示(通常)1行的数据,但在这张图片中我们可以看到很多行的数据。
选择 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);
4

3 回答 3

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']."";

我最近写了一篇关于 SQL 注入的文章。像您这样的每个漏洞都将允许任何脚本小子转储您的数据库,或者更糟。

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

于 2016-03-25T08:28:12.187 回答
0

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

$col = 'users';
mysql_query("SELECT * FROM table WHERE $col = $something");
于 2012-06-07T09:04:47.857 回答
0

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

于 2015-05-16T03:08:27.357 回答