Rumah >pembangunan bahagian belakang >tutorial php >Mengapa Saya Tidak Boleh Menggunakan Parameter PDO dalam ORDER BY Klausa Pernyataan SQL Saya?

Mengapa Saya Tidak Boleh Menggunakan Parameter PDO dalam ORDER BY Klausa Pernyataan SQL Saya?

DDD
DDDasal
2024-12-27 01:39:09943semak imbas

Why Can't I Use PDO Parameters in the ORDER BY Clause of My SQL Statement?

PESANAN OLEH Params dalam Penyata PDO

Anda menghadapi kesukaran menggunakan parameter dalam klausa ORDER BY pernyataan SQL anda. Param :order dan :direction gagal menghasilkan sebarang hasil.

Punca Isu

Parameter PDO tidak boleh digunakan terus dalam klausa ORDER BY. Ia mestilah rentetan statik.

Penyelesaian

Tiada pemalar PDO untuk nama lajur atau arah pengisihan. Oleh itu, anda mesti memasukkan nilai ini terus ke dalam pernyataan SQL. Walau bagaimanapun, adalah penting untuk mengambil langkah berjaga-jaga:

  1. Kod keras setiap pengendali dan pengecam dalam skrip anda.
$orders = array("name", "price", "qty");
$key = array_search($_GET['sort'], $orders);
$order = $orders[$key];
$query = "SELECT * from table WHERE is_live = :is_live ORDER BY $order";
  1. Gunakan pembantu senarai putih fungsi:
$order = white_list($order, ["name", "price", "qty"], "Invalid field name");
$direction = white_list($direction, ["ASC", "DESC"], "Invalid ORDER BY direction");

$sql = "SELECT field from table WHERE column = ? ORDER BY $order $direction";
$stmt = $db->prepare($sql);
$stmt->execute([$is_live]);

Penjelasan

Fungsi senarai putih menyemak nilai dan menimbulkan ralat jika ia tidak betul, mengurangkan risiko SQL suntikan serangan.

Contoh

$sql = "SELECT field from table WHERE column = :my_param";

$stmt = $db->prepare($sql);
$stmt->bindParam(':my_param', $is_live, PDO::PARAM_STR);
$stmt->bindParam(':order', $order, PDO::PARAM_STR);
$stmt->bindParam(':direction', $direction, PDO::PARAM_STR);
$stmt->execute();

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menggunakan Parameter PDO dalam ORDER BY Klausa Pernyataan SQL Saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn