2012-03-30 10 views
7

Chcę uaktualnić mój obecny kod, który jest stale sql wstrzykiwany z PDO.Jak dodać wartości zmiennych wewnątrz pdo-> zapytanie

Obecnie utknąłem przy użyciu zmiennej wewnątrz zapytania PDO.

Jeśli mam dwa argumenty jak ten

$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; 

I mam zapytanie jak to

$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 zgłasza błąd w ostatnim wierszu zlecenia zapytaniu Kiedy wymienić te linię "ORDER BY Date DESC LIMIT3,3"); wszystko działa.

Jak dodać wartości zmiennych wewnątrz PDO :: zapytanie?

Aktualizacja: Dzięki odpowiedzieć poniżej I zostały zaktualizowane mojego kodu jak ten

$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(); 

Ale błąd:

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..

Druga aktualizacja Zmieniono z PARAM_STR DO PARAM_INT jak ten

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

Wszystko działa.

+0

przypisz ciąg zapytania do zmiennej, var_dump() wyniki i post tutaj proszę. –

Odpowiedz

21

Chcesz użyć przygotowanych sprawozdań i parametrów zapytania tak:

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

pomocą zmiennych bezpośrednio w zapytaniu nie chroni przed SQL injection, nawet jeśli używasz PDO. Parametry są jedynym dobrym sposobem, aby im zapobiec.

+0

Dzięki za informację, ale jestem teraz zdezorientowany. Używanie vars wewnątrz kwerendy nie ochroni mnie przed sql inj. ataki, czy powinienem być zabezpieczony przed wtryskiem sql z twojego przykładu? – BobRock

+1

Tak, ponieważ w moim przykładzie użyłem 'PDO: bindParam', który zastąpi odpowiednio': parameter' przez '$ your_variable'. 'bindParam' zapewnia również, że w zapytaniu nie ma znaków specjalnych. –

+0

dzięki za informacje. Jestem po prostu zaktualizowanym pytaniem. – BobRock

Powiązane problemy