Inilah usaha saya:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');
$query->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
}
Inilah usaha saya:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');
$query->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
}
Jawaban:
Menemukannya tepat setelah saya memposting:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));
while ($results = $query->fetch())
{
echo $results['column'];
}
Bagi mereka yang menggunakan parameter bernama, berikut adalah cara untuk menggunakan LIKE
dengan %
pencocokan parsial untuk database MySQL :
DI MANA nama_kolom SEPERTI CONCAT ('%',: hazardstring, '%')
di mana parameter bernama :dangerousstring
.
Dengan kata lain, gunakan %
tanda yang tidak dapat di- escape secara eksplisit dalam kueri Anda sendiri yang dipisahkan dan yang pasti bukan input pengguna.
Edit: Sintaks penggabungan untuk database Oracle menggunakan operator penggabungan:, ||
jadi itu hanya akan menjadi:
DI MANA nama_kolom SUKA '%' || : tali berbahaya || '%'
Namun ada peringatan seperti yang disebutkan @bobince di sini bahwa:
The kesulitan datang ketika Anda ingin memungkinkan literal
%
atau_
karakter dalam string pencarian, tanpa harus bertindak sebagai wildcard.
Jadi, itu hal lain yang harus diperhatikan saat menggabungkan suka dan parameterisasi.
LIKE CONCAT('%', :something, '%')
. Referensi: stackoverflow.com/a/661207/201648
SELECT * FROM calculation WHERE ( email LIKE '%' || luza || '%' OR siteLocation LIKE '%'|| luza ||'%' OR company LIKE '%' ||luza ||'%' )
ini akan memberi saya kesalahan.
and it means named placeholders can be used
. Bagaimana ini bahkan menjadi masalah dengan placeholder bernama ketika Anda menggabungkan dalam PHP? Jelas penggabungan dalam PHP mendukung nama dan posisi dan lebih portabel karena Anda dapat menggunakan kueri yang sama untuk database apa pun. Saya tidak benar-benar mengerti mengapa begitu banyak orang berpikir ada apa perbedaan antara nama dan posisi placeholder.
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->bindValue(1, "%$value%", PDO::PARAM_STR);
$query->execute();
if (!$query->rowCount() == 0)
{
while ($results = $query->fetch())
{
echo $results['column'] . "<br />\n";
}
}
else
{
echo 'Nothing found';
}
bindValue
melindungi dari serangan injeksi? Jawaban yang diterima pada dasarnya meniadakan nilai menggunakan ?
placeholder dengan menggabungkan string pencarian menjadi %
like in ye days of olde.
Anda juga bisa mencoba yang ini. Saya menghadapi masalah yang sama tetapi mendapat hasil setelah penelitian.
$query = $pdo_connection->prepare('SELECT * FROM table WHERE column LIKE :search');
$stmt= $pdo_connection->prepare($query);
$stmt->execute(array(':search' => '%'.$search_term.'%'));
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($result);
Ini bekerja:
search `table` where `column` like concat('%', :column, '%')
Saya mendapatkan ini dari delusi php
$search = "%$search%";
$stmt = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();
Dan itu berhasil untuk saya, sangat sederhana. Seperti yang dia katakan, Anda harus "menyiapkan literal lengkap kami terlebih dahulu" sebelum mengirimkannya ke kueri
PDO lolos "%" (Dapat menyebabkan injeksi sql) : Penggunaan kode sebelumnya akan memberikan hasil yang diinginkan saat ingin mencocokkan sebagian string TETAPI jika pengunjung mengetik karakter "%", Anda masih akan mendapatkan hasil meskipun tidak ' t memiliki apa pun yang disimpan di basis data (dapat menyebabkan suntikan sql)
Saya telah mencoba banyak variasi, semuanya dengan hasil yang sama PDO keluar dari "%" yang mengarah ke hasil pencarian yang tidak diinginkan / tidak bersemangat.
Saya pikir itu layak untuk dibagikan jika ada yang menemukan kata di sekitarnya, tolong bagikan
like
digunakan? bagaimana cara mengeksekusi array secara berurutan?