Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Вывод последней записи с помощью PDO

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
KEFIR4UK
Отправлено: 25 Октября, 2014 - 12:16:50
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Апр. 2014  


Помог: 0 раз(а)




Нужно вывести последнюю запись из базы с помощью PDO
делаю так:
PHP:
скопировать код в буфер обмена
  1.  
  2.     try {
  3.                         $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);    
  4.                         $slc = $dbh -> prepare("SELECT * FROM materials WHERE id=?");
  5.                         $slc = $dbh -> execute(array'(mysql_insert_id()'));
  6.                         } catch(PDO_EXPRESSION $e) {
  7.  
  8.                               echo $e ->getMessage();
  9.                         }  
  10.                         while($row = $slc->fetch()) {
  11.                          print_r($row);
  12.                         }
  13.  

но в итоге ничего, вместо mysql_insert_id() брал $insertId=$dbh->lastInsertId(); но ничего не выходит, даже ошибок никаких нет

(Отредактировано автором: 25 Октября, 2014 - 12:18:24)

 
 Top
teddy
Отправлено: 25 Октября, 2014 - 12:29:08
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM `materials` ORDER BY `id` DESC LIMIT 1

(Добавление)
И что за catch(PDO_EXPRESSION $e) ? должно быть PDOException, а PDO_EXPRESSION нет в природе
(Добавление)
Блин... да тут гора ошибок))
так же при передаче массива в execute есть синтаксическая ошибка... + ко всему execute есть у PDOStatement а не у PDO.
 
 Top
KEFIR4UK
Отправлено: 25 Октября, 2014 - 13:15:07
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Апр. 2014  


Помог: 0 раз(а)




teddy пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM `materials` ORDER BY `id` DESC LIMIT 1

(Добавление)
И что за catch(PDO_EXPRESSION $e) ? должно быть PDOException, а PDO_EXPRESSION нет в природе
(Добавление)
Блин... да тут гора ошибок))
так же при передаче массива в execute есть синтаксическая ошибка... + ко всему execute есть у PDOStatement а не у PDO.

Вот,вышло)
$stmt = $dbh->query('SELECT * from materials ORDER BY `id` DESC LIMIT 1');
$stmt->setFetchMode(PDO::FETCH_ASSOC);
while($row = $stmt->fetch())
{
echo "<p>" . $row['title'] . "&nbsp;" . $row['content'] . "</p>";
echo "<p>" . $row['calendar'] . "</p><br />";
}
 
 Top
teddy
Отправлено: 25 Октября, 2014 - 13:22:50
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Уже лучше Улыбка Но косячки все же остались.

Вопрос, зачем здесь while, если у Вас возвращается всего 1 запись?
PHP:
скопировать код в буфер обмена
  1. $stmt = $dbh->query('SELECT * from materials ORDER BY `id` DESC LIMIT 1');
  2. $result = $stmt->fetch(PDO::FETCH_ASSOC);
  3. var_dump($result);

В данном случае этого более чем достаточно.

(Отредактировано автором: 25 Октября, 2014 - 13:23:46)

 
 Top
KEFIR4UK
Отправлено: 25 Октября, 2014 - 14:21:28
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Апр. 2014  


Помог: 0 раз(а)




Еще вопрос, нужно вытащить все записи с базы и нажатием на одну из них должно открыться редактирование. Для этого хочу сначала вывести все тайтлы статей в цикле а уже потом кликнув на них должно появиться окно где редактируем. Делаю так:
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3.      $stmt = $dbh->query('SELECT * from materials');
  4.      $stmt->setFetchMode(PDO::FETCH_NUM);
  5.      while($row = $stmt->fetch())
  6.     {
  7.         printf("<p> <a href='edit.php?id=%s'>%s</a></p>",$row[0],$row[1]);
  8.                            
  9.     }
  10.  

Вопрос, безопасно ли это, sql инъекцию так не сделаеш? Если не безопасно скажите пожалуйста как сделать правильно.
 
 Top
teddy
Отправлено: 25 Октября, 2014 - 14:38:27
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Для начала $row[0],$row[1] лучше поменять на внятные ключи, а fetch mode сделайте fetch assoc, читабельность кода улучшиться.
Вот смотрите, Вы формируете ссылки на редактирование каждой записи, подставляя id каждой записи в ссылку. Тут все хорошо.
Но в конечном счете на странице редактирования, Вы используете этот $_GET['id'] в SQL запросе для получения необходимой записи для редактирования.

Так вот, когда Вы используете $_GET['id'] для получении записи, приведите его явно к числу.
PHP:
скопировать код в буфер обмена
  1. $id = isset($_GET['id']) ? (int)$_GET['id'] : null;

И уже этот $id можете спокойно использовать в своем запросе.

При нажатии на кнопку "Сохранить" так же экранируйте все данные, которые будут участвовать в запросе UPDATE. Сделать это можно с помощью метода quote(у экземпляра класса PDO)

Либо используйте подготовленные запросы и можно ничего не экранировать Улыбка
Как то так...

(Отредактировано автором: 25 Октября, 2014 - 14:38:55)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB