Использование переданной переменной в запросе с использованием PDO

#php #mysql #pdo

#php #mysql #pdo

Вопрос:

Я пытаюсь взять переменную, переданную с другой страницы, и использовать ее в запросе PDO. Переменная — это дата добавления записи, и я пытаюсь вернуть все новые записи. Должен ли я использовать $_POST для этого в PDO?

 <?php
require_once('globals.php');

$date_added = $_POST['date_added'];

$sth = $dbh->prepare("SELECT * FROM games WHERE date_added > $date_added");
$sth->execute();

/* Fetch all of the remaining rows in the result set */
print("Fetch all of the remaining rows in the result set:n");
$result = $sth->fetchAll();
print_r($result);


?>
  

Комментарии:

1. Работает ли это? Если нет: какую ошибку вы видите? Одна из проблем здесь заключается в том, что вы берете пользовательские данные непосредственно в запросе — используйте подготовленные операторы или $dbh-> quote()

2. Вот ошибка: Неустранимая ошибка: вызов функции-члена prepare() для не-объекта.

3. @DonS У вас никогда не было успешного подключения к базе данных с самого начала. Вы действительно new PDO() куда-то звонили, например, в globals.php ?

4. @DonS Даже если это не общедоступная форма, вы должны быть привязаны $date_added в подготовленном операторе.

5. @johannes как насчет данных, не относящихся к пользователю? можно ли вводить в запрос как есть?

Ответ №1:

Вам нужно фактически установить соединение с базой данных, создав новый объект PDO $dbh . Приведенный ниже код предполагает, что пользователь и пароль базы данных указаны как $dbusername, $dbpassword и имя базы $nameofdb данных .

$date_added заменяется в prepare() вызове параметром :dateadded , затем передается через массив в execute() вызов.

Пожалуйста, прочитайте документацию по обоим PDO::__construct() и PDO::execute()

 <?php
require_once('globals.php');

// Connect to MySQL via PDO
try {
    $dbh = new PDO("mysql:dbname=$nameofdb;host=localhost", $dbusername, $dbpassword);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

$date_added = $_POST['date_added'];

// Replace `$date_added` with a parameter `:dateadded`
$sth = $dbh->prepare("SELECT * FROM games WHERE date_added > :dateadded");
// bind $date_added and pass it into the execute() call inside an array
$sth->execute(array('dateadded'=>$date_added));

/* Fetch all of the remaining rows in the result set */
print("Fetch all of the remaining rows in the result set:n");
$result = $sth->fetchAll();
print_r($result);

?>
  

Комментарии:

1. Спасибо, Майкл! Это работает отлично. Также спасибо за ссылки на PDO.

2. Если бы я хотел записать результат в формате json вместо его печати, был бы код: ‘$json= json_encode ($result);’ вместо: ‘print_r ($result);’ Для этой последней строки?