นี่คือความพยายามของฉัน:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');
$query->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
}
นี่คือความพยายามของฉัน:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');
$query->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
}
คำตอบ:
คิดออกทันทีหลังจากที่ฉันโพสต์:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));
while ($results = $query->fetch())
{
echo $results['column'];
}
สำหรับผู้ที่ใช้พารามิเตอร์ที่มีชื่อนี่คือวิธีใช้LIKE
กับ%
การจับคู่บางส่วนสำหรับฐานข้อมูล MySQL :
คอลัมน์ WHERE LIKE CONCAT ('%',: hazardstring, '%')
:dangerousstring
ที่พารามิเตอร์ชื่อเป็น
กล่าวอีกนัยหนึ่งคือใช้%
เครื่องหมายที่ไม่ใช้ Escape อย่างชัดเจนในข้อความค้นหาของคุณเองซึ่งแยกออกจากกันและไม่ใช่ข้อมูลที่ผู้ใช้ป้อน
แก้ไข:ไวยากรณ์การเชื่อมต่อสำหรับฐานข้อมูล Oracleใช้ตัวดำเนินการต่อข้อมูล: ||
ดังนั้นมันจะกลายเป็น:
โดยที่ column_name LIKE '%' || : สายรัดอันตราย || '%'
อย่างไรก็ตามมีข้อควรระวังตามที่ @bobince กล่าวไว้ที่นี่ว่า:
ความ ยาก เกิดขึ้นเมื่อคุณต้องการอนุญาตให้ใช้ตัวอักษร
%
หรือ_
อักขระในสตริงการค้นหาโดยไม่ต้องทำหน้าที่เป็นตัวแทน
นั่นคือสิ่งอื่นที่ต้องระวังเมื่อรวมการเหมือนและการกำหนดพารามิเตอร์
LIKE CONCAT('%', :something, '%')
ไวยากรณ์คือ อ้างอิง: stackoverflow.com/a/661207/201648
SELECT * FROM calculation WHERE ( email LIKE '%' || luza || '%' OR siteLocation LIKE '%'|| luza ||'%' OR company LIKE '%' ||luza ||'%' )
ซึ่งจะทำให้ฉันมีข้อผิดพลาด
and it means named placeholders can be used
. แม้กระทั่งปัญหากับตัวยึดตำแหน่งที่ระบุชื่อเมื่อคุณเชื่อมต่อใน PHP? เห็นได้ชัดว่าการเชื่อมต่อกันใน PHP รองรับทั้งแบบตั้งชื่อและตำแหน่งและแบบพกพามากขึ้นเนื่องจากคุณสามารถใช้แบบสอบถามเดียวกันสำหรับฐานข้อมูลใดก็ได้ ฉันไม่เข้าใจจริงๆว่าทำไมหลาย ๆ คนถึงคิดว่ามีความแตกต่างระหว่างตัวยึดตำแหน่งที่มีชื่อและตำแหน่ง
$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
ป้องกันการโจมตีด้วยการฉีดยาหรือไม่? คำตอบที่ได้รับการยอมรับโดยทั่วไปจะลบล้างคุณค่าของการใช้?
ตัวยึดตำแหน่งโดยการต่อสตริงการค้นหาให้%
เหมือนกับในสมัยก่อน
คุณยังสามารถลองใช้อันนี้ ฉันประสบปัญหาคล้าย ๆ กัน แต่ได้ผลหลังจากการวิจัย
$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);
ใช้งานได้:
search `table` where `column` like concat('%', :column, '%')
ฉันได้รับสิ่งนี้จากการหลงผิด php
$search = "%$search%";
$stmt = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();
และมันได้ผลสำหรับฉันง่ายมาก อย่างที่เขาพูดคุณต้อง "เตรียมตัวอักษรที่สมบูรณ์ของเราก่อน" ก่อนที่จะส่งไปยังแบบสอบถาม
PDO หนี "%" (อาจนำไปสู่การฉีด sql) : การใช้รหัสก่อนหน้านี้จะให้ผลลัพธ์ที่ต้องการเมื่อต้องการจับคู่สตริงบางส่วนแต่ถ้าผู้เยี่ยมชมพิมพ์อักขระ "%" คุณจะยังคงได้ผลลัพธ์แม้ว่าคุณจะไม่ได้รับ ไม่มีสิ่งใดที่เก็บไว้ในฐานข้อมูล (อาจนำไปสู่การฉีด sql)
ฉันได้ลองใช้รูปแบบต่างๆมากมายโดย PDO ผลลัพธ์เดียวกันคือการหลีกเลี่ยง "%" นำหน้าผลการค้นหาที่ไม่ต้องการ / ไม่ได้รับการร้องขอ
ฉันคิดว่ามันคุ้มค่าที่จะแบ่งปันหากใครพบคำศัพท์เกี่ยวกับเรื่องนี้โปรดแบ่งปัน
like
ล่ะ? อาร์เรย์จะดำเนินการอย่างไรตามลำดับ