Bagaimana untuk memasukkan pembolehubah PHP dalam pernyataan MySQL
P粉595605759
P粉595605759 2023-09-16 21:28:26
0
2
467

Saya cuba memasukkan nilai ke dalam jadual kandungan. Ia berfungsi dengan baik jika tiada pembolehubah PHP dalam VALUES. Walau bagaimanapun, apabila saya meletakkan pembolehubah $type放在VALUES di dalamnya, ia tidak berfungsi. Apa yang saya buat salah?

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) 
     VALUES($type, 'john', 'whatever')");

P粉595605759
P粉595605759

membalas semua(2)
P粉239089443

Untuk mengelakkan suntikan SQL, pernyataan sisipan adalah:

$type = 'testing';
$name = 'john';
$description = 'whatever';

$con = new mysqli($user, $pass, $db);
$stmt = $con->prepare("INSERT INTO contents (type, reporter, description) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $type , $name, $description);
$stmt->execute();
P粉036800074

Peraturan untuk menambah pembolehubah PHP dalam mana-mana pernyataan MySQL adalah mudah dan mudah:

1. Gunakan pernyataan yang disediakan

Peraturan ini terpakai kepada 99% pertanyaan dan ia juga terpakai kepada pertanyaan anda. Sebarang pembolehubah yang mewakili data SQL secara literal (atau ringkasnya, rentetan atau nombor SQL) mesti ditambah melalui pernyataan yang disediakan. Tanpa terkecuali.

Kaedah ini terdiri daripada empat langkah asas:

  • Dalam pernyataan SQL anda, gantikan semua pembolehubah dengan pemegang tempat
  • Sediakan
  • untuk pertanyaan yang anda dapat
  • Ikat pembolehubah kepada pemegang tempat
  • Lakukan pertanyaan

Begini cara untuk mencapai ini dalam semua pemacu pangkalan data PHP yang popular:

Gunakan mysqli untuk menambah literal data

Versi PHP semasa membolehkan anda menyediakan/mengikat/melaksanakan dalam satu panggilan:

$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$mysqli->execute_query($query, [$type, $reporter]);

Jika anda mempunyai versi PHP yang lebih lama, anda mesti menyediakan/mengikat/melaksanakan secara eksplisit:

$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ss", $type, $reporter);
$stmt->execute();

Kod ini agak rumit, tetapi penjelasan terperinci tentang semua operator ini boleh didapati dalam artikel saya Cara menjalankan pertanyaan INSERT menggunakan Mysqli, serta penyelesaian yang boleh memudahkan proses dengan banyak.

Untuk pertanyaan PILIH, anda boleh menggunakan kaedah yang sama seperti di atas:

$reporter = "John O'Hara";
$result = $mysqli->execute_query("SELECT * FROM users WHERE name=?", [$reporter]);
$row = $result->fetch_assoc(); // 或者 while (...)

Walau bagaimanapun, jika anda mempunyai versi PHP yang lebih lama, anda perlu melakukan rutin menyediakan/mengikat/melaksanakan dan juga perlu memanggil get_result()方法,以便从中获取一个熟悉的mysqli_result dari mana data boleh diekstrak dengan cara biasa:

$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // 或者 while (...)
Gunakan PDO untuk menambah literal data
$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $pdo->prepare($query);
$stmt->execute([$type, $reporter]);

Dalam PDO, kita boleh menggabungkan bahagian pengikat dan pelaksanaan bersama-sama, yang sangat mudah. PDO juga menyokong ruang letak bernama, yang sesetengah orang mendapati sangat mudah.

2. Gunakan penapisan senarai putih

Sebarang bahagian pertanyaan lain, seperti kata kunci SQL, nama jadual atau medan, atau pengendali, mesti ditapis melalui senarai putih.

Kadangkala kita perlu menambah pembolehubah yang mewakili bahagian lain pertanyaan, seperti kata kunci atau pengecam (pangkalan data, jadual atau nama medan). Ini adalah situasi yang jarang berlaku, tetapi lebih baik untuk bersedia.

Dalam kes ini, pembolehubah anda mesti disemak terhadap senarai nilai ditulis secara eksplisit dalam skrip anda. Ini dijelaskan secara terperinci dalam artikel saya yang lain Tambahkan nama medan mengikut klausa ORDER BY berdasarkan pilihan pengguna:

Berikut adalah contoh:

$orderby = $_GET['orderby'] ?: "name"; // 设置默认值
$allowed = ["name","price","qty"]; // 允许的字段名的白名单
$key = array_search($orderby, $allowed, true); // 看看是否有这个名字
if ($key === false) { 
    throw new InvalidArgumentException("无效的字段名"); 
}
$direction = $_GET['direction'] ?: "ASC";
$allowed = ["ASC","DESC"];
$key = array_search($direction, $allowed, true);
if ($key === false) { 
    throw new InvalidArgumentException("无效的ORDER BY方向"); 
}

Selepas kod seperti ini, $direction$orderbypembolehubah boleh dimasukkan dengan selamat ke dalam pertanyaan SQL kerana ia sama ada akan sama dengan salah satu varian yang dibenarkan atau ralat akan dilemparkan.

Satu perkara terakhir yang perlu dinyatakan ialah pengecam juga mesti diformat mengikut sintaks pangkalan data tertentu. Untuk MySQL, pengecam harus dikelilingi oleh backtick aksara. Jadi rentetan pertanyaan terakhir untuk contoh ORDER BY kami hendaklah:

$query = "SELECT * FROM `table` ORDER BY `$orderby` $direction";
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!