0

テーブルの名前がリストされている単純なドロップダウンを使用して、データベース内のいくつかのテーブルにクエリを実行しようとしています。クエリには、データベースに登録されている最年少の機関の名前と年齢を示すレコード結果が 1 つだけあります。

$table = $_GET['table'];
$query = "select max('$table'.est_year) as 'establish_year' from '$table' ";        

テーブルの名前を変数としてクエリアphpファイルに送信する必要があります。メソッドがGETまたはPOSTであっても、変数名をクエリステートメントに入れると、エラーが発生します。

「SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルを参照して、near '.order) as 'last' from 'customers'' を使用する正しい構文を確認してください。

4

2 に答える 2

2

テーブル名を一重引用符で囲んでいますが、これは有効な SQL ではありません (これは文字列の構文であり、テーブル名ではありません)。名前をまったくラップしないか、バッククォートでラップする必要があります (アメリカのキーボード レイアウトでは、それが上記のキーですTAB)。

また、エイリアスを引用しないでくださいestablished_year

select max(`$table`.est_year) as establish_year from `$table`

また、コードは SQL インジェクションに対して脆弱です。これをすぐに修正してください!

更新 (SQL インジェクション防御):

この場合、最も適切なアクションは、ホワイトリストに対してテーブル名を検証することです。

if (!in_array($table, array('allowed_table_1', '...'))) {
    die("Invalid table name");
}
于 2012-06-23T11:24:52.573 に答える
-1

一重引用符 (')、mysql では、文字列値を表します。

SELECT *, 'table' FROM `table`;

デモ

だからあなたのクエリは

$table = $_GET['table'];
$query = "select max($table.est_year) as 'establish_year' from $table ";  

古い投稿phpmyadmin sql apostrophe not workingもお読みください。

また、コードは SQL インジェクションに対して脆弱です。このようなものを使用できます

//Function to sanitize values received from the form. Prevents SQL injection

function clean($str) {
    $str = @trim($str);
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysql_real_escape_string($str);
}

$firstName = clean($_POST['firstName']);
$lastName  = clean($_POST['lastName']);
.
.
.
于 2012-06-23T11:31:08.140 に答える