1

私は単純なSQLクエリを使用して、SQLステートメントを介して注文されたテーブルを出力しています。SQL文字列にORDER BY属性を設定する(複数のSQLステートメントを作成する必要を避けるために)URLに変数を渡したいのですが、これが可能かどうかわかりません。これは私が思いついたものであり、コードが有効である間は機能しません。

function list_entries() 
{
    db_connect();

    $orderby = $_GET["orderby"];
    $sql = mysql_query("SELECT * FROM astaro ORDER BY '".$orderby."'");

    while($row = mysql_fetch_array($sql)) {
        echo "Table Outputs - I trimmed this because it's not important";

    }
    echo "</table>";
    db_disconnect();
}

また、pdo とプリペアド ステートメントの利点も認識していますが、これは内部使用のみの小さなアプリケーションであるため、複雑にしすぎると逆効果になります。

4

4 に答える 4

0

ここでの問題は、クエリが実際に次のようなものになることです

SELECT * FROM table ORDER BY '.$_GET["orderby"].'

$_GET['orderby'] は実際には文字どおりに書き出されます。引用符で囲まないでください。このようなコードは、実際に探しているものです。

$orderby = $_GET["orderby"];
$sql = ("SELECT * FROM table ORDER BY '.$orderby.'");

echo $sql;
于 2013-02-09T12:09:19.563 に答える
0

データベースの操作方法にセキュリティ上の欠陥があります。次の PHP バージョンで削除されるため、PDO を学習し、非推奨の mysql ドライバーを削除してみてください。

列名であろうとテーブル名であろうと、ユーザーにテーブルについて何も知らせないでください。

于 2013-02-09T12:10:35.680 に答える
0

よくわかりませんが、次のようになります。

交換 :

$orderby = '$_GET["orderby"]'; $sql = mysql_query("SELECT * FROM table ORDER BY '.$orderby.'");

に :

$orderby = $_GET["orderby"]; 
$sql = mysql_query("SELECT * FROM table ORDER BY '".$orderby."'");
于 2013-02-09T12:06:27.223 に答える
0

変数を引用しています:

$orderby = '$_GET["orderby"]';

したがって$orderby、文字通りテキストが含まれます$_GET["orderby"]

次のように変更する必要があります。

$orderby = $_GET["orderby"];

また、SQL ステートメントで変数を引用符で囲まないでください。

$sql = mysql_query("SELECT * FROM astaro ORDER BY ".$orderby);

ただし、使用するデータベース関数の種類に関係なく (mysql_*関数は非推奨です)、SQL インジェクションに対して脆弱です。この場合、SQL インジェクションを回避する唯一の方法は、許可されたorderby文字列のホワイトリストを使用し、それに対してチェックすることです。

于 2013-02-09T12:08:36.333 に答える