2011-01-17 28 views

Trả lời

8

Bạn đã đề cập hai tham số (cùng tên) cho câu lệnh chuẩn bị, nhưng bạn chỉ cung cấp giá trị cho tham số đầu tiên (đó là lỗi của thông tin).

Không hoàn toàn chắc chắn cách PDO nội bộ giải quyết cùng một vấn đề tên tham số, nhưng bạn luôn có thể tránh điều đó.

Hai giải pháp khả thi:

$sql = "select * from $table ". 
     "where " 
     "first_name like concat('%', :fname, '%') or ". 
     "last_name like concat('%', :lname, '%')"; 
$stmt= $DBH->prepare($sql); 
$stmt->bindValue(':fname', $string, PDO::PARAM_STR); 
$stmt->bindValue(':lname', $string, PDO::PARAM_STR); 

$sql = "select * from $table ". 
     "where " 
     "first_name like concat('%', ?, '%') or ". 
     "last_name like concat('%', ?, '%')"; 
$stmt= $DBH->prepare($sql); 
$stmt->bindValue(1, $string, PDO::PARAM_STR); 
$stmt->bindValue(2, $string, PDO::PARAM_STR); 

Bằng cách này, cách hiện tại bạn đã làm vẫn còn có vấn đề về SQL injection.

+0

Thx ajreal, tại sao cách thức của tôi vẫn tiêm nhạy cảm? – bart

+0

bởi vì bạn đã bao gồm mọi thứ vào sql đầy đủ, trong khi bạn nên ràng buộc giá trị chính xác để chỉ tìm kiếm, chẳng hạn như ví dụ – ajreal

+0

@ajreal: chỉ một số điều nhỏ: bạn đang thiếu a. (dấu chấm) giữa '" ở đâu "' và '" first_name ... "' – Helmut

Các vấn đề liên quan