Đây là nỗ lực của tôi về nó:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');
$query->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
}
Đây là nỗ lực của tôi về nó:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');
$query->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
}
Câu trả lời:
Tìm ra nó ngay sau khi tôi đăng:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));
while ($results = $query->fetch())
{
echo $results['column'];
}
Đối với những người sử dụng các tham số được đặt tên, đây là cách sử dụng LIKE
với %
đối sánh từng phần cho cơ sở dữ liệu MySQL :
WHERE column_name LIKE CONCAT ('%',: riskstring, '%')
tham số được đặt tên ở đâu :dangerousstring
.
Nói cách khác, sử dụng %
các dấu hiệu không thoát rõ ràng trong truy vấn của riêng bạn, được phân tách và chắc chắn không phải là đầu vào của người dùng.
Chỉnh sửa: Cú pháp nối cho cơ sở dữ liệu Oracle sử dụng toán tử nối:, ||
vì vậy nó sẽ đơn giản trở thành:
WHERE column_name LIKE '%' || : chuỗi nguy hiểm || '%'
Tuy nhiên, có những lưu ý khi @bobince đề cập ở đây rằng:
Các khó khăn đến khi bạn muốn cho phép một chữ
%
hoặc_
nhân vật trong chuỗi tìm kiếm, mà không cần phải nó hoạt động như một ký tự đại diện.
Vì vậy, đó là điều khác cần chú ý khi kết hợp like và tham số hóa.
LIKE CONCAT('%', :something, '%')
. Tham khảo: stackoverflow.com/a/661207/201648
SELECT * FROM calculation WHERE ( email LIKE '%' || luza || '%' OR siteLocation LIKE '%'|| luza ||'%' OR company LIKE '%' ||luza ||'%' )
điều này sẽ cho tôi lỗi.
and it means named placeholders can be used
. Làm thế nào nó thậm chí là một vấn đề với trình giữ chỗ có tên khi bạn nối trong PHP? Rõ ràng là nối trong PHP hỗ trợ cả được đặt tên và vị trí và dễ di động hơn vì bạn có thể sử dụng cùng một truy vấn cho bất kỳ cơ sở dữ liệu nào. Tôi thực sự không hiểu tại sao nhiều người nghĩ rằng có bất kỳ sự khác biệt nào giữa trình giữ chỗ có tên và vị trí.
$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
bảo vệ chống lại các cuộc tấn công tiêm không? Câu trả lời được chấp nhận về cơ bản phủ định giá trị của việc sử dụng ?
trình giữ chỗ bằng cách nối chuỗi tìm kiếm để %
thích trong những ngày xưa.
Bạn cũng có thể thử cái này. Tôi phải đối mặt với vấn đề tương tự nhưng đã có kết quả sau khi nghiên cứu.
$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);
Tôi nhận được điều này từ ảo tưởng php
$search = "%$search%";
$stmt = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();
Và nó hoạt động đối với tôi, rất đơn giản. Giống như anh ấy nói, bạn phải "chuẩn bị nghĩa đen hoàn chỉnh của chúng tôi trước" trước khi gửi nó đến truy vấn
PDO thoát khỏi "%" (Có thể dẫn đến chèn sql) : Việc sử dụng mã trước đó sẽ cho kết quả mong muốn khi tìm cách khớp các chuỗi một phần NHƯNG nếu khách truy cập nhập ký tự "%", bạn vẫn sẽ nhận được kết quả ngay cả khi bạn không t có bất kỳ thứ gì được lưu trữ trong cơ sở dữ liệu (nó có thể dẫn đến việc tiêm sql)
Tôi đã thử rất nhiều biến thể đều có cùng kết quả PDO đang thoát "%" dẫn đến kết quả tìm kiếm không mong muốn / không được giải thích.
Tôi mặc dù nó rất đáng để chia sẻ nếu ai đó tìm thấy một từ xung quanh nó, hãy chia sẻ nó
like
sử dụng nhiều thì sao? mảng thực thi nên thực thi theo thứ tự như thế nào?