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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
gheka
Отправлено: 26 Апреля, 2015 - 20:03:34
Post Id



Частый гость


Покинул форум
Сообщений всего: 191
Дата рег-ции: Февр. 2011  


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




Здравствуйте начал сейчас разбираться с PDO но при создании файла подключении к базе данных и запроса на выборку SELECT выходит фатальная ошибка, хотя вроде сделал всё правильно.

Вот скрипт соединения с базой

PHP:
скопировать код в буфер обмена
  1.  
  2. //Имя сервера БД / DSN
  3. $bd_host = "localhost";
  4. //Название базы данных
  5. $bd_name = "test_pdo";
  6. //Имя пользователя БД
  7. $bd_user = "root";
  8. //Пароль к БД
  9. $bd_pass = "";
  10. try {
  11.         $db = new PDO ( "mysql:host=$bd_host;bdname=$bd_name;", "$bd_user", "$bd_pass" );
  12.         $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  13.         $db->exec ("SET NAMES utf8");
  14. }
  15. catch ( PDOException $e ) {
  16.     echo 'Подключение не удалось: ' . $e->getMessage();
  17. }
  18.  
  19. define ( "DB_PREFIX", "test_" );
  20.  


Вот запрос на выборку

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. $sql = "SELECT * FROM `" . DB_PREFIX . "user`";
  4. $stmt = $db->query ( $sql );
  5.  
  6. while ( $row = $stmt->fetch (PDO::FETCH_ASSOC) ) {
  7.        
  8.         echo $row ['id'];
  9.        
  10. }
  11.  


И вот что выходит

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected' in Z:\home\magazin_pdo.ru\www\111.php:7 Stack trace: #0 Z:\home\magazin_pdo.ru\www\111.php(7): PDO->query('SELECT * FROM `...') #1 {main} thrown in Z:\home\magazin_pdo.ru\www\111.php on line 7

Даже не знаю что не так. Подскажите пожалуйста где я ошибся?
 
 Top
Мелкий Супермодератор
Отправлено: 26 Апреля, 2015 - 20:06:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




gheka пишет:
bdname

Database, а не basadannih


-----
PostgreSQL DBA
 
 Top
exlant
Отправлено: 26 Апреля, 2015 - 20:10:32
Post Id



Посетитель


Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015  


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




какой еще "bdname" dbname! У вас DataBase, а не биде!

PHP:
скопировать код в буфер обмена
  1. $db = new PDO ( "mysql:host=$bd_host;dbname=$bd_name;", "$bd_user", "$bd_pass" );
 
 Top
gheka
Отправлено: 26 Апреля, 2015 - 20:13:15
Post Id



Частый гость


Покинул форум
Сообщений всего: 191
Дата рег-ции: Февр. 2011  


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




Спасибо большое глупая ошибка, вот идиот, а я голову морочил.
 
 Top
DelphinPRO
Отправлено: 26 Апреля, 2015 - 21:21:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


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




I'm sorry! Хватит офтопить

exlant пишет:
какой еще "bdname" dbname! У вас DataBase, а не биде!

а если так:

PHP:
скопировать код в буфер обмена
  1. $bd_imja, $bd_polzovatel, $bd_parol


? Ха-ха Ха-ха Ха-ха


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
gheka
Отправлено: 27 Апреля, 2015 - 02:05:27
Post Id



Частый гость


Покинул форум
Сообщений всего: 191
Дата рег-ции: Февр. 2011  


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




Вот ещё вопрос по PDO

В просто MYSQLI делал проверку на количество затронутых полей в запросе так

PHP:
скопировать код в буфер обмена
  1.  
  2. $t = "SELECT * FROM `" . DB_PREFIX . "goods` WHERE `status`='%d'";
  3. $result = mysqli_query ( $LinkToBD, sprintf ( $t, mysqli_real_escape_string ( $LinkToBD, '1' ) ));
  4.  
  5. if ( mysqli_num_rows ( $result ) != 0 ) {
  6.  
  7. $goods = mysqli_fetch_assoc ( $result );
  8. // Продолжение................
  9.  
  10. }
  11.  
  12.  


Как такое сделать в PDO?

PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "SELECT * FROM `" . DB_PREFIX . "goods` WHERE `status`=?";
  3. $stmt = $dbh->prepare ( $sql );
  4. $stmt = execute ( array (1) );
  5.  
  6. if ( // что сюда вставить ) {
  7. $goods = $stmt->fetch (PDO::FETCH_ASSOC);
  8.  
  9. }
  10.  


Не много по рывшийся нашёл вот такое решение
Оно работает но хотел бы узнать у знающих людей может есть более правильное решение?


PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "SELECT * FROM `" . DB_PREFIX . "goods` WHERE `status`=?";
  3. $stmt = $dbh->prepare ( $sql );
  4. $stmt = execute ( array (1) );
  5.  
  6. if ( $stmt->rowCount() != 0 ) {
  7. $goods = $stmt->fetch (PDO::FETCH_ASSOC);
  8.  
  9. }
  10.  
  11.  

(Отредактировано автором: 27 Апреля, 2015 - 02:28:25)

 
 Top
DelphinPRO
Отправлено: 27 Апреля, 2015 - 10:44:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


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




PHP:
скопировать код в буфер обмена
  1. while ($row = $stmt->fetch (PDO::FETCH_ASSOC)) {
  2.    $goods[] = $row;
  3. }

Если рядов затронуто ноль, то и цикл ни разу не выполнится.

А еще есть



который вернет пустой массив, если затронутых рядов ноль, или массив данных

Как видите, необходимость rowCount для селектов отпадает Улыбка


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
gheka
Отправлено: 27 Апреля, 2015 - 12:38:14
Post Id



Частый гость


Покинул форум
Сообщений всего: 191
Дата рег-ции: Февр. 2011  


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




DelphinPRO пишет:
$stmt->fetchAll()


Это не совсем удобно так как получается что бы получит данные из массива нужно писать вот что
$goods [0]['name']

PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "SELECT * FROM `" . DB_PREFIX . "goods` WHERE `status`=?";
  3. $stmt = $dbh->prepare ( $sql );
  4. $stmt = execute ( array (1) );
  5.  
  6. if ( $goods = $stmt->fetchAll() ) {
  7. // Получаем название
  8. $goods [0]['name']
  9. }
  10.  


Есть ещё что то похожее? именно для

PHP:
скопировать код в буфер обмена
  1. if (// проверку на наличие данных) {
  2.  
  3. // Вытаскиваем данные
  4. }

(Отредактировано автором: 27 Апреля, 2015 - 12:40:26)

 
 Top
DelphinPRO
Отправлено: 27 Апреля, 2015 - 13:40:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


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




gheka пишет:
Это не совсем удобно так как получается что бы получит данные из массива нужно писать вот что
$goods [0]['name']

fetchAll используется для получения нескольких строк, по которым потом проходят циклов для вывода данных

fetch() - возвращает null если строк нет.
Вы бы хоть документацию почитали бы что ли.

PHP:
скопировать код в буфер обмена
  1. $data = $stmt->fetch();
  2. if (!$data) {
  3.   ничего нет
  4. }


или даже так
PHP:
скопировать код в буфер обмена
  1. if ($data = $stmt->fetch()) {
  2.   что нибудь делаем с $data
  3. }

(Отредактировано автором: 27 Апреля, 2015 - 13:41:48)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
gheka
Отправлено: 27 Апреля, 2015 - 17:07:37
Post Id



Частый гость


Покинул форум
Сообщений всего: 191
Дата рег-ции: Февр. 2011  


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




DelphinPRO пишет:
Вы бы хоть документацию почитали бы что ли.


Я читал и пробывал я и написал что для меня fetchAll () именно для проверки пустоты данных не совсем удобна. Про цикл речь не идёт там её самое то применять для выборки отдельных полей.


Другое дело, то что мне нужно. За это большое спасибо.

(Отредактировано автором: 27 Апреля, 2015 - 17:08:45)

 
 Top
DelphinPRO
Отправлено: 27 Апреля, 2015 - 18:08:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


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




gheka пишет:
Я читал и пробывал я и написал что для меня fetchAll () именно для проверки пустоты данных не совсем удобна.

видимо не так используете Улыбка



потом где-то в шаблоне

PHP:
скопировать код в буфер обмена
  1. if (!empty($data)) {
  2.   foreach($data as $item) {
  3.        // вывод данных
  4.   }
  5. } else {
  6.   echo 'Нет данных';
  7. }


я вот не припомню, когда мне требовалось получать количество выбранных строк методом rowCount() или прочими методами php...


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
gheka
Отправлено: 02 Мая, 2015 - 19:02:40
Post Id



Частый гость


Покинул форум
Сообщений всего: 191
Дата рег-ции: Февр. 2011  


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




Помогите пожалуйста как вывести ошибку при обновлении записи в PDO

В MYSQLI я это делал так

PHP:
скопировать код в буфер обмена
  1.  
  2. $t = "UPDATE `" . DB_PREFIX . "goods` SET `name`='%d' WHERE `id`='%d'";
  3. $result = mysqli_query ( $LinkToBD, sprintf ($t, mysqli_real_escape_string ( $LinkToBD, 'test' ),
  4.                                                         mysqli_real_escape_string ( $LinkToBD, 107 ) ));
  5. if (!$result)
  6.         die ('Ошибка базы данных ' . mysqli_error ( $LinkToBD ) );
  7.  


В PDO делаю так

PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "UPDATE `" . DB_PREFIX . "goods` SET `name`=? WHERE `id`=?";
  3. $stmt = $dbh->prepare ( $sql );
  4. $stmt->execute ( array ('текс', 107) );
  5. if (!$stmt)
  6.         print_r ('Ошибка базы данных ' . $stmt->errorInfo () );
  7.  


Но ошибка не выводится, что я неправильно делаю?

РАЗОБРАЛСЯ С ЭТИМ нужно было запрос делать в

PHP:
скопировать код в буфер обмена
  1.  
  2. try {
  3. // Прибавляем забронированное количество товара, общему количеству
  4. $sql = "UPDATE `" . DB_PREFIX . "goods` SET `name`=? WHERE `id`=?";
  5. $stmt = $dbh->prepare ( $sql );
  6. $stmt->execute ( array ('текс', 107) );
  7.  
  8. }
  9. catch ( PDOException $e ) {
  10.     echo 'ошибка: ' . $e->getMessage();
  11. }
  12.  

ТАК ОШИБКУ ВЫВОДИТ

Но не совсем понятно нужно ли делать TRY () CATCH ()

Для каждого запроса или один раз на странице?

(Отредактировано автором: 02 Мая, 2015 - 20:04:01)

 
 Top
exlant
Отправлено: 02 Мая, 2015 - 23:50:39
Post Id



Посетитель


Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015  


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




не обязательно, через TRY{} CATCH(){}
у вас ошибка в этом коде:
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "UPDATE `" . DB_PREFIX . "goods` SET `name`=? WHERE `id`=?";
  3. $stmt = $dbh->prepare ( $sql );
  4. $stmt->execute ( array ('текс', 107) );
  5. if (!$stmt)
  6.         print_r ('Ошибка базы данных ' . $stmt->errorInfo () );
  7.  

не $stmt->errorInfo (), а $dbh->errorInfo()
 
 Top
gheka
Отправлено: 03 Мая, 2015 - 00:56:57
Post Id



Частый гость


Покинул форум
Сообщений всего: 191
Дата рег-ции: Февр. 2011  


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




exlant пишет:
не обязательно, через TRY{} CATCH(){}
у вас ошибка в этом коде:
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "UPDATE `" . DB_PREFIX . "goods` SET `name`=? WHERE `id`=?";
  3. $stmt = $dbh->prepare ( $sql );
  4. $stmt->execute ( array ('текс', 107) );
  5. if (!$stmt)
  6.         print_r ('Ошибка базы данных ' . $stmt->errorInfo () );
  7.  

не $stmt->errorInfo (), а $dbh->errorInfo()


Нет у меня всё верно надо было просто писать вот так print_r ( $stmt->errorInfo () );
а не так print_r ('Ошибка базы данных ' . $stmt->errorInfo () );

Правильно так
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "UPDATE `" . DB_PREFIX . "goods` SET `name`=? WHERE `id`=?";
  3. $stmt = $dbh->prepare ( $sql );
  4. $stmt->execute ( array ('текс', 107) );
  5. print_r ($stmt->errorInfo () );
  6.  

(Отредактировано автором: 03 Мая, 2015 - 00:57:51)

 
 Top
exlant
Отправлено: 03 Мая, 2015 - 01:07:16
Post Id



Посетитель


Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015  


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




пример из мануала
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. /* Спровоцируем синтаксическую ошибку SQL */
  3. $stmt = $dbh->prepare('bogus sql');
  4. if (!$stmt) {
  5.     echo "\nPDO::errorInfo():\n";
  6.     print_r($dbh->errorInfo());
  7. }
  8. ?>

http://php.net/manual/ru/pdo.errorinfo.php
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB