Laravel - PDO - Nama Tabel Dinamis

Saya mencoba menghapus tabel dengan nama dinamis. Saya sebenarnya membuat dan memanipulasi tabel secara dinamis, tetapi ini adalah pertanyaan yang paling sederhana.

Semuanya berfungsi dengan baik ketika saya menggunakan PDO mentah, seperti:

// PURE PDO VERSION
$this->db = new PDO(
    'mysql:host='   . $configParams['db_hostname']
    . ';port='      . $configParams['db_port']
    . ';dbname='    . $configParams['db_name']
    . ';charset=utf8mb4',
    $configParams['db_username'],
    $configParams['db_password']
);

$this->ps_DeleteTempTable = $db->prepare(
            "DROP TABLE `:tableName`"
        );

Tetapi ketika saya melakukan hal yang sama menggunakan Laravel, seperti:

// LARAVEL VERSION
$pdo = DB::connection()->getPdo();

$this->ps_DeleteTempTable = $pdo->prepare(
            "DROP TABLE `:tableName`"
        );

Saya menerima kesalahan berikut:

SQLSTATE[42S02]: Tabel atau tampilan dasar tidak ditemukan: 1146 Tabel 'testdb.?' tidak ada

Saya telah melihat pertanyaan lain tentang SO dengan tujuan serupa, tetapi semuanya menyarankan bahwa kueri pertama yang saya tulis tidak dapat berfungsi, padahal saya telah menggunakannya selama lebih dari setahun.

Terima kasih,


person mils    schedule 07.06.2017    source sumber
comment
Jika Anda benar-benar berhasil, saya tidak bisa menjelaskannya - karena placeholder hanya berfungsi untuk nilai, bukan nama kolom atau tabel   -  person Qirel    schedule 07.06.2017
comment
Saya membuatnya berfungsi menggunakan backticks, saya membuat/memasukkan/memperbarui/menghapus tanpa masalah. Anehnya ketika melalui laravel ia berhenti bekerja.   -  person mils    schedule 07.06.2017
comment
Ini cukup misterius jika Anda benar-benar membuatnya berfungsi... Karena saat mempersiapkan, tanda kutip tunggal secara otomatis ditambahkan di sekitar nilai - apakah Anda harus mendapatkan kueri yang tampak seperti DROP TABLE `testdb.'table'` - yang tidak valid. Versi PHP dan MySQL apa yang Anda jalankan? Bisakah Anda menunjukkan cara Anda mengeksekusi pengikatan juga?   -  person Qirel    schedule 07.06.2017


Jawaban (1)


Anda harus menambahkan nama tabel sebagai nilai saat membuat SQL...

$pdo = DB::connection()->getPdo();

$this->ps_DeleteTempTable = $pdo->prepare(
            "DROP TABLE `".$tableName."`"
        );

Anda bisa mendapatkan beberapa hasil yang aneh jika tidak menggunakan tanda centang kembali karena namanya mungkin merupakan kata-kata yang dicadangkan. Secara umum lebih baik mendesain database untuk tidak menggunakan ini, tetapi ada beberapa yang cukup umum (misalnya 'urutan')

person Nigel Ren    schedule 07.06.2017