5

SELECT * FROM table最初の列が変数と等しい場所にしたいと思います。列名がわからないはずです。

私は次のようなことができることを知っています

SELECT * FROM table WHERE column_id = 1 

しかし、データを比較することはできません。

どうやってやるの?

T-SQLで解決策を見つけましたが、興味がありません。

より正確に言うと:

「スーパー」管理者がデータベースを直接変更できる管理パネルを Web サイトで開発しています。そのために、テーブルを選択してこのテーブルを編集できます。しかし、それを行うには、すべてのテーブルを表示する唯一の PHP スクリプトを使用しています。1 つを選択すると、スクリプトは選択したテーブルのすべての行を表示します。その後、行を選択すると、問題のあるページにリダイレクトされます。このページは、行が 1 つしかない任意のテーブルを受け取ることができるためSELECT、この行に含まれるデータが必要です。

理解するための画像:
最初の画像はテーブルを示しています。
2 つ目は、選択したテーブルの行を示しています。
3 番目は (通常) 1 行のデータを示していますが、この図では多くの行のデータを見ることができます。
selecto http://imageshack.us/g/135/selecto.png

私は解決策を見つけました:

説明してみてください: 最初: 投稿された特定のテーブルからすべてを選択しました

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

2番目:変数に列名を付けました(知りませんでした)

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

where $col = id3番目:行のテーブルからデータを選択しました

$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

SHOW CREATE TABLE table_nameテーブルのスキーマを取得するために使用できると思います。その後、すべての列をすでに知っているはずです。

于 2015-05-16T03:08:27.357 に答える
0

PHP では、次のようなことができます。

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