Có một số điều sai ở đây, nhưng điều lớn nhất là bạn không sử dụng các tham số truy vấn.
Đừng sử dụng addslashes
. Nếu bạn thấy mình đang sử dụng nó, bạn nên nghĩ "rất tiếc, tôi cần phải sửa truy vấn nên tôi sử dụng các tham số để thay thế".
Trong trường hợp này, bạn nên viết một cái gì đó như:
$sth = $pdo->prepare('SELECT replace_value(?, ?, ?)');
$sth->execute(array('protect\classes\Router', $tmp, 'serialized_classes'));
Bạn chưa đề cập đến kiểu dữ liệu của đối số mà bạn truyền dữ liệu được tuần tự hóa đến là gì. Ở trên sẽ chỉ hoạt động nếu nó là text
hoặc varchar
hoặc tương tự.
Nếu đó là bytea
giống như đối với dữ liệu đối tượng được tuần tự hóa, bạn phải nói với PHP rằng tham số là một trường nhị phân:
$sth = $pdo->prepare('SELECT replace_value(:router, :serialbytes, :mode)');
$sth->bindParam(':router', 'protect\classes\Router');
$sth->bindParam(':mode', 'serialized_classes');
$sth->bindParam(':serialbytes', $tmp, PDO::PARAM_LOB);
$sth->execute();
Lưu ý việc sử dụng PDO::PARAM_LOB
để tlel PDO rằng $tmp
chứa dữ liệu nhị phân được chuyển tới PostgreSQL dưới dạng bytea
.
(Bạn có thể đặt các hằng số như 'protect\classes\Router'
trực tiếp vào các truy vấn của bạn, btw, miễn là bạn chia chúng thành các tham số nếu chúng trở thành biến. Tôi chủ yếu tách chúng ra vì tôi thấy nó dễ đọc hơn trong một truy vấn như thế này.)