Как добавить значения переменных внутри pdo-> query - PullRequest
8 голосов
/ 30 марта 2012

Я хочу обновить свой текущий код, который постоянно вводится с помощью PDO.

В настоящее время я застрял с использованием переменной внутри запроса PDO.

Если у меня есть два аргумента, подобных этому

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

И у меня есть запрос, подобный этому

$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 сообщает об ошибке в последней строке запроса. ORDER BY Когда я заменяю эти строки на "ORDER BY Date DESC LIMIT3,3");, все работает.

Итак, как добавить значения переменных в PDO :: query?

Обновлено: благодаря ответу ниже я обновил свой код следующим образом

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

Но произошла ошибка:

Неустранимая ошибка: необработанное исключение 'PDOException' с сообщением'SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1064 В синтаксисе SQL есть ошибка;проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с '-3', '3' 'в строке 1 в /pdo/test.php:42 Трассировка стека: # 0 / pdo / test.php (42): PDOStatement-> execute () # 1 {main}, брошенный в /pdo/test..

Второе обновление Изменено с PARAM_STR на PARAM_INT, как это

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

Все работает.

1 Ответ

23 голосов
/ 30 марта 2012

Вы хотите использовать подготовленные операторы и параметры запроса , например:

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

Использование переменных непосредственно в запросе не защитит вас от SQL-инъекций, даже если вы используете PDO.Параметры - единственный хороший способ предотвратить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...