PHP PDO lolos dari tanda tanya sehingga tidak menganggapnya sebagai pengganti

Saya memiliki pertanyaan yang terlihat seperti ini:

SELECT CONCAT('path/to/page/?id=', id) AS link FROM users WHERE name = ?

Saya menggunakan PDO untuk menyiapkan pernyataan ini dan saya mendapatkan kesalahan

Invalid parameter number: number of bound variables does not match number of tokens

karena menganggap tanda tanya pada string CONCAT adalah pengganti.

Apakah ada cara untuk menghindari tanda tanya sehingga PDO mengetahui bahwa ini bukan pengganti?

Harap tidak ada komentar tentang cara lain untuk mendapatkan tautan. Saya mengubah kode lama yang masuk ke mesin templating lama sehingga akan jauh lebih mudah menemukan cara untuk menghindari tanda tanya daripada tidak memberi tanda tanya dalam kueri.


person Tony Brix    schedule 25.08.2014    source sumber
comment
Sejauh yang saya tahu, PDO cukup pintar untuk memahami bahwa tidak ada pengganti dalam string. Bisakah Anda menempelkan seluruh perintah PHP?   -  person Mchl    schedule 25.08.2014
comment
Maaf lupa 'DARI pengguna'   -  person Tony Brix    schedule 25.08.2014
comment
Tolong tunjukkan lebih banyak kode kepada kami, sulit untuk mengatakan dengan pasti mengapa ia berpikir seperti itu.   -  person Funk Forty Niner    schedule 25.08.2014
comment
Kesalahan saya PDO benar, kueri saya sebenarnya terlihat seperti ini: ... nama = '?'. Jadi PDO tidak berpikir saya punya pengganti dalam kueri. Saya terkejut karena saya tidak dapat menemukan dalam dokumentasi PDO cara menghindari tanda tanya dengan '?'   -  person Tony Brix    schedule 25.08.2014


Jawaban (1)


PDO tidak bingung dengan tanda tanya di dalam tanda kutip. Saya baru saja mengujinya dengan PHP 5.5.15.

$sql = "SELECT CONCAT('path/to/page/?id=', id) AS link FROM foo WHERE name = ?;";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1, 'name');
$stmt->execute();
print_r($stmt->fetchAll());

Ini berfungsi dengan baik, tanpa kesalahan tentang jumlah parameter yang salah. Kesalahan Anda disebabkan oleh cara Anda mengikat parameter, bukan oleh sintaks SQL.

Saya kira Anda belum menunjukkan kepada kami seluruh kueri SQL, karena WHERE tanpa FROM adalah kesalahan sintaksis. Jadi, Anda harus memiliki placeholder parameter tambahan yang belum Anda tunjukkan kepada kami. Akan sangat membantu juga jika Anda menunjukkan kepada kami cara Anda mengikat parameter (atau meneruskan parameter ke eksekusi()).

person Bill Karwin    schedule 25.08.2014
comment
Saya melihat Anda adalah bagian dari Jaringan Detektif Kode ;) +1 - Saya memikirkan hal yang sama, namun saya ingin melihat kode aktual OP sebelum mengirimkan jawaban; kerja bagus, Bill. - person Funk Forty Niner; 25.08.2014
comment
Saya menandai ini sebagai jawabannya karena Anda benar. Ini adalah salah satu kesalahan bodohmu. pertanyaan saya sebenarnya terlihat seperti ini: SELECT CONCAT('path/to/page/?id=', id) AS link FROM users WHERE name = '?' jadi PDO tidak berpikir ada penggantinya - person Tony Brix; 25.08.2014
comment
@UziTech Lalu, mengapa Anda memposting pertanyaan Anda sebagai pertanyaan yang sebenarnya tidak Anda gunakan? Anda akan mendapatkan jawaban yang lebih cepat. (mengedip) - person Funk Forty Niner; 25.08.2014
comment
@Fred karena ada informasi sensitif dalam permintaan sebenarnya - person Tony Brix; 25.08.2014
comment
@UziTech Saya memahami dan menghormatinya. Namun, Anda memposting WHERE name = ? tetapi mengatakan Anda sebenarnya menggunakan WHERE name = '?' dengan tanda kutip di sekitar tanda tanya; itulah sebabnya. (mengedipkan mata) - Itu yang saya maksud dengan sebenarnya. Itu hanya menghilangkan dugaan-dugaan. Namun Bill berhasil menemukan solusinya dan itu bagus, semangat - person Funk Forty Niner; 25.08.2014