Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk memasukkan pembolehubah PHP dalam pernyataan MySQL

<p>Saya cuba memasukkan nilai ke dalam jadual kandungan. Jika saya tidak mempunyai pembolehubah PHP dalam VALUES ia berfungsi dengan baik. Ini tidak berfungsi apabila saya meletakkan pembolehubah <code>$type</code> Apa yang saya buat salah? </p> <pre class="brush:php;toolbar:false;">$type = 'testing'; mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");</pre> <p><br /></p>
P粉738248522P粉738248522395 hari yang lalu534

membalas semua(2)saya akan balas

  • P粉949848849

    P粉9498488492023-08-24 16:07:56

    Untuk mengelakkan suntikan SQL, masukkan pernyataan dengan be

    $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();

    balas
    0
  • P粉883223328

    P粉8832233282023-08-24 15:43:16

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

    1. Gunakan pernyataan yang disediakan

    Peraturan ini meliputi 99% pertanyaan, terutamanya pertanyaan anda. Sebarang pembolehubah yang mewakili literal data SQL (atau, ringkasnya - rentetan atau nombor SQL) mesti ditambah melalui pernyataan yang disediakan. Tiada pengecualian.

    Kaedah ini melibatkan empat langkah asas

    • Dalam pernyataan SQL, gantikan semua pembolehubah dengan pemegang tempat
    • PersediaanPertanyaan keputusan
    • Ikat pembolehubah kepada pemegang tempat
    • Laksanakan Pertanyaan

    Begini cara melakukannya menggunakan semua pemacu pangkalan data PHP yang popular:

    Tambah teks data menggunakan mysqli

    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, penyediaan/pengikatan/pelaksanaan mesti dilakukan 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 memudahkan proses dengan ketara.

    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(); // or while (...)

    Walau bagaimanapun, jika anda mempunyai versi PHP yang lebih lama, anda perlu melakukan rutin menyediakan/mengikat/melaksanakan dan menambah pasangan itu get_result() 方法的调用,以获得熟悉的< code>mysqli_result Anda boleh mendapatkan data daripadanya 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(); // or while (...)
    Gunakan PDO untuk menambah teks 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, kami boleh menggabungkan bahagian pengikat dan pelaksanaan, 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 operator - 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). Keadaan ini jarang berlaku, tetapi lebih baik untuk bersedia.

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

    Berikut adalah contoh:

    $orderby = $_GET['orderby'] ?: "name"; // set the default value
    $allowed = ["name","price","qty"]; // the white list of allowed field names
    $key = array_search($orderby, $allowed, true); // see if we have such a name
    if ($key === false) { 
        throw new InvalidArgumentException("Invalid field name"); 
    }
    $direction = $_GET['direction'] ?: "ASC";
    $allowed = ["ASC","DESC"];
    $key = array_search($direction, $allowed, true);
    if ($key === false) { 
        throw new InvalidArgumentException("Invalid ORDER BY direction"); 
    }

    Selepas kod seperti ini, $direction$orderby pembolehubah selamat untuk dimasukkan 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 disebutkan tentang pengecam ialah ia juga mesti diformat mengikut sintaks pangkalan data tertentu. Untuk MySQL, ia mestilah 反引号 aksara yang mengelilingi pengecam. Jadi rentetan pertanyaan terakhir untuk contoh pesanan kami ialah

    $query = "SELECT * FROM `table` ORDER BY `$orderby` $direction";

    balas
    0
  • Batalbalas