Vấn đề là ở đây:
$sql = $sql . 'WHERE a.regGUID in ( :regGUID ) and ';
$stmt->bindValue(':regGUID', $regGUID, PDO::PARAM_STR);
Tôi giả sử $ regGUID là danh sách các chuỗi được trích dẫn được phân tách bằng dấu phẩy.
Mỗi tham số truy vấn chỉ chấp nhận một giá trị vô hướng duy nhất. Không phải danh sách trong tổng số các giá trị.
Vì vậy, bạn có hai lựa chọn:
-
Tiếp tục nội suy chuỗi $ regGUID, ngay cả khi bạn sử dụng các tham số cho các giá trị vô hướng khác. Nhưng bạn vẫn muốn cẩn thận để tránh SQL injection, vì vậy bạn phải tạo chuỗi $ regGUID một cách chính xác. Bạn không thể chỉ gọi PDO ::quote () trên toàn bộ chuỗi, điều đó sẽ làm cho nó trở thành một chuỗi được trích dẫn duy nhất có chứa UUID và dấu phẩy. Bạn phải đảm bảo từng chuỗi UUID được thoát và được trích dẫn riêng lẻ, sau đó ghép danh sách lại với nhau và nội suy vào mệnh đề IN.
$regGUIDs = explode(',', $regGUID); $regGUIDs = array_map(function ($g) { return $db->quote($g); }, $regGUIDs); $regGUID = implode(',', $regGUIDs); $sql = $sql . 'WHERE a.regGUID in (' . $regGUID . ') and ';
-
explode()
$ regGUID vào một mảng và thêm một tham số truy vấn cho mỗi phần tử trong mảng. Nội suy danh sách động các trình giữ chỗ tham số truy vấn.$regGUIDs = explode(',', $regGUID); $params = array_fill(1, count($regGUIDs), '?'); $sql = $sql . ' WHERE a.regGUID in ( ' . implode(',', $params) . ' ) and ';
Bạn có thể bindValue () trong một vòng lặp cho mảng, nhưng hãy nhớ rằng các tham số khác cũng phải được ràng buộc bởi vị trí, không phải theo tên. PDO có một số lỗi khiến bạn không hài lòng khi cố gắng kết hợp hai kiểu tham số khác nhau trong cùng một truy vấn.
Thay vì sử dụng bindValue (), tôi chỉ truyền một mảng giá trị tham số cho PDOStatement ::execute (), điều này dễ dàng hơn nhiều.
$paramValues = $regGUIDs;
$paramValues[] = $game;
$results = $stmt->execute($paramValues);