2012-03-30 8 views
7

hinzufügen Ich möchte meinen aktuellen Code, der ständig mit PDO sql injiziert wird.Wie man Variablenwerte in pdo-> query

Derzeit bin ich mit der Verwendung einer Variablen in einer PDO-Abfrage stecken.

Wenn ich zwei Argumente wie diese

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

Und ich habe Abfrage wie diese

$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 meldet einen Fehler in letzte Zeile der Abfrage ORDER BY Wenn ich diese Zeile ersetzen "ORDER BY Date DESC LIMIT3,3"); alles funktioniert.

Wie also Variablenwerte in PDO :: query hinzufügen?

Aktualisiert: Dank unten zu beantworten Ich habe meinen Code wie dieser

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

aktualisiert Aber Fehler ist aufgetreten:

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

zweite Update von PARAM_STR geändert wie diese

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

Alles funktioniert.

+0

den Abfrage-String einer Variablen zuweisen, var_dump() die Ergebnisse und hier bitte posten. –

Antwort

21

Sie wollen vorbereitete Anweisungen und Abfrageparameter wie folgt verwenden:

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

Variablen direkt in Ihrer Abfrage verwenden werden Sie nicht von SQL-Injektionen schützen, auch wenn Sie PDO verwenden. Parameter sind der einzige gute Weg, sie zu verhindern.

+0

Danke für die Info, aber ich bin jetzt verwirrt. Die Verwendung der vars-internen Abfrage schützt mich nicht vor sql inj. Attacken, sollte ich mit deinem Beispiel vor SQL-Injektionen abgesichert sein? – BobRock

+1

Ja, weil ich in meinem Beispiel 'PDO: bindParam' verwendet habe, das entsprechend' 'parameter' durch' $ your_variable' ersetzt. 'bindParam' stellt außerdem sicher, dass in Ihrer Abfrage keine Sonderzeichen enthalten sind. –

+0

danke für die Info. Ich bin nur eine aktualisierte Frage. – BobRock

Verwandte Themen