2012-03-30 18 views
7

Tôi muốn nâng cấp mã hiện tại của mình liên tục được chèn với PDO.Cách thêm giá trị biến bên trong pdo-> truy vấn

Hiện tại tôi đang bị mắc kẹt với việc sử dụng một biến bên trong truy vấn PDO.

Nếu tôi có hai đối số như thế này

$rowsPerPage = 3; 

    // by default we show first page 
    $pageNum = 1; 

    if (isset($_GET['page'])) { 
    $pageNum = mysql_real_escape_string($_GET['page']); 
    } 

    $offset = ($pageNum - 1) * $rowsPerPage; 

Và tôi có truy vấn như thế này

$STH = $DBH->query("SELECT News.ID, LEFT(NewsText,650), Title, AID, Date, imgID," . 
     "DATE_FORMAT(Date, '%d.%m.%Y.') as formated_date " . 
     "FROM News, Categories, NewsCheck WHERE Name LIKE '%News - Block%' AND CID=Categories.ID AND JID=News.ID ". 
     "ORDER BY `Date` DESC LIMIT $offset, $rowsPerPage"); 

PDO báo cáo một lỗi trong dòng cuối cùng của ORDER truy vấn THEO Khi tôi thay thế những phù hợp với "ORDER BY Date DESC LIMIT3,3"); mọi thứ hoạt động.

Vậy làm thế nào để thêm các giá trị biến bên trong PDO :: truy vấn?

Cập nhật: Nhờ trả lời dưới đây tôi đã cập nhật mã của tôi như thế này

$STH = $DBH->prepare("SELECT News.ID, LEFT(NewsText,650), Title, AID, Date, imgID," . 
      "DATE_FORMAT(Date, '%d.%m.%Y.') as formated_date " . 
      "FROM News, Categories, NewsCheck WHERE Name LIKE '%News - Block%' AND CID=Categories.ID AND JID=News.ID ". 
      "ORDER BY `Date` DESC LIMIT :offset, :rowsPerPage;"); 

$STH->bindParam(':offset', $offset, PDO::PARAM_STR); 
$STH->bindParam(':rowsPerPage', $rowsPerPage, PDO::PARAM_STR); 

$STH->execute(); 

Nhưng xảy ra lỗi:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''-3', '3'' at line 1' in /pdo/test.php:42 Stack trace: #0 /pdo/test.php(42): PDOStatement->execute() #1 {main} thrown in /pdo/test..

Second Cập nhật Thay đổi từ PARAM_STR ĐẾN PARAM_INT như

này
$STH->bindParam(':offset', $offset, PDO::PARAM_INT); 
$STH->bindParam(':rowsPerPage', $rowsPerPage, PDO::PARAM_INT); 

Mọi thứ đều hoạt động.

+0

gán chuỗi truy vấn cho biến, var_dump() các kết quả và đăng tại đây, vui lòng. –

Trả lời

21

Bạn muốn sử dụng chuẩn bị phát biểutham số truy vấn như sau:

$sth = $dbh->prepare('SELECT your_column FROM your_table WHERE column < :parameter'); 
$sth->bindParam(':parameter', $your_variable, PDO::PARAM_STR); 
$sth->execute(); 

Sử dụng các biến trực tiếp trong truy vấn của bạn sẽ không bảo vệ bạn khỏi tiêm SQL, ngay cả khi bạn đang sử dụng PDO. Các tham số là cách tốt nhất để ngăn chặn chúng.

+0

Cảm ơn thông tin, nhưng bây giờ tôi đã nhầm lẫn. Sử dụng vars bên trong truy vấn sẽ không bảo vệ tôi khỏi sql inj. tấn công, tôi có nên được an toàn từ tiêm sql với ví dụ của bạn? – BobRock

+1

Có, vì trong ví dụ của tôi, tôi đã sử dụng 'PDO: bindParam' sẽ thay thế': parameter' bằng '$ your_variable'. 'bindParam' cũng sẽ đảm bảo không có ký tự đặc biệt nào trong truy vấn của bạn. –

+0

cảm ơn thông tin. Tôi vừa mới cập nhật câu hỏi. – BobRock

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