#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);’ Для этой последней строки?