Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara menulis kueri SELECT aman yang memiliki sejumlah variabel nilai yang disediakan pengguna dengan mysqli?

Tugas yang harus Anda lakukan adalah pernyataan yang disiapkan dengan sejumlah variabel penampung. Ini lebih sederhana di PDO, tapi saya akan menunjukkan pendekatan gaya berorientasi objek mysqli. Apa pun yang terjadi, selalu cetak larik yang disandikan json sehingga skrip penerima Anda mengetahui jenis data yang diharapkan.

Saya memiliki cuplikan yang tergeletak di sekitar yang mencakup baterai penuh diagnostik dan pemeriksaan kesalahan. Saya belum menguji skrip ini, tetapi cukup mirip dengan postingan saya ini .

if (empty($_POST['companyname']) || empty($_POST['username'])) {  // perform any validations here before doing any other processing
    exit(json_encode([]));
}

$config = ['localhost', 'root', '', 'dbname'];  // your connection credentials or use an include file
$values = array_merge([$_POST['companyname']], explode(',', $_POST['username']));  // create 1-dim array of dynamic length
$count = sizeof($values);
$placeholders = implode(',', array_fill(0, $count - 1, '?'));  // -1 because companyname placeholder is manually written into query
$param_types = str_repeat('s', $count);
if (!$conn = new mysqli(...$config)) {
    exit(json_encode("MySQL Connection Error: <b>Check config values</b>"));  // $conn->connect_error
}
if (!$stmt = $conn->prepare("SELECT user_scid, user_scid FROM linked_user WHERE company_name = ? AND username IN ({$placeholders})")) {
    exit(json_encode("MySQL Query Syntax Error: <b>Failed to prepare query</b>"));  // $conn->error
}
if (!$stmt->bind_param($param_types, ...$values)) {
    exit(json_encode("MySQL Query Syntax Error: <b>Failed to bind placeholders and data</b>"));  // $stmt->error;
}
if (!$stmt->execute()) {
    exit(json_encode("MySQL Query Syntax Error: <b>Execution of prepared statement failed.</b>"));  // $stmt->error;
}
if (!$result = $stmt->get_result()) {
    exit(json_encode("MySQL Query Syntax Error: <b>Get Result failed.</b>")); // $stmt->error;
}
exit(json_encode($result->fetch_all(MYSQLI_ASSOC)));

Jika Anda tidak ingin mengasapi semua kondisi dan komentar diagnostik tersebut, berikut ini adalah persamaan tulang yang seharusnya bekerja secara identik:

if (empty($_POST['companyname']) || empty($_POST['username'])) {
    exit(json_encode([]));
}

$values = explode(',', $_POST['username']);
$values[] = $_POST['companyname'];
$count = count($values);
$placeholders = implode(',', array_fill(0, $count - 1, '?'));
$param_types = str_repeat('s', $count);

$conn = new mysqli('localhost', 'root', '', 'dbname');
$stmt = $conn->prepare("SELECT user_scid, user_scid FROM linked_user WHERE username IN ({$placeholders}) AND company_name = ?");
$stmt->bind_param($param_types, ...$values);
$stmt->execute();
$result = $stmt->get_result();
exit(json_encode($result->fetch_all(MYSQLI_ASSOC)));


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masalah C# MySqlParameter

  2. Doctrine 2 DQL MySQL setara dengan ROUND()?

  3. Perbarui basis data dengan beberapa Pernyataan SQL

  4. Apa perbedaan antara tinyint, smallint, mediumint, bigint dan int di MySQL?

  5. Bagaimana saya bisa menggunakan executemany untuk memasukkan ke MySQL daftar kamus dengan Python