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 :: Помогите понять почему?

 PHP.SU

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


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

> Без описания
alecs
Отправлено: 10 Июля, 2018 - 13:42:40
Post Id


Новичок


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


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




Всем привет, я изучаю PHP7. в процессе возник вопрос:

почему код:
PHP:
скопировать код в буфер обмена
  1. $host = "localhost";
  2. $db = "test";
  3. $charset = "utf8";
  4. $user = "root";
  5. $pass = "root";
  6.  
  7. $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
  8.  
  9. $opt = array(
  10.     PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  11.     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  12. );
  13.  
  14. // Создаем подключение + ловивм ошибку если естьпри подключении
  15.  
  16. try {
  17.     $pdo = new PDO($dsn, $user, $pass, $opt);
  18. } catch(PDOException $e) {
  19.     die("Подключение не удалось:" . $e->getMessage());
  20. }
  21.  
  22. $stmt = $pdo->query('SELECT * FROM customers');
  23. while($row = $stmt->fetch()){
  24.     echo $row['FIO'] . "\n";
  25. }


у меня не работает с такими атрибутами... и начинает работать только после добавления
PDO::ATTR_PERSISTENT => true

Это дело в конфигурации mysql? или где то в коде закрывается по какой то причине соединение... непойму...

Благодрю за ответыУлыбка


Отредактировано модератором: armancho7777777, 13 Июля, 2018 - 16:30:07
 
 Top
andrewkard
Отправлено: 11 Июля, 2018 - 06:59:15
Post Id


Участник


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


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




Вы пытаетесь взять строки средствами прокручиваемого курсора, сделайте так, как в документации:
PHP:
скопировать код в буфер обмена
  1.  
  2. $stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
  3.     $stmt->execute();
  4.     while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT)) {
  5.       $data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\n";
  6.       print $data;
  7.     }
  8.     $stmt = null;
  9.  

PDO::FETCH_NUM можно заменить на PDO::FETCH_ASSOC
 
 Top
Мелкий Супермодератор
Отправлено: 11 Июля, 2018 - 10:44:22
Post Id



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


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


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




andrewkard, а откуда такой вывод?


-----
PostgreSQL DBA
 
 Top
alecs
Отправлено: 11 Июля, 2018 - 16:18:12
Post Id


Новичок


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


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




может я туплюУлыбка но я ничего не понял... пример мой из учебного материала был взят... автор Денис Колисниченко я так понимаю он брал инфу из официальной документацииУлыбка) я просто сам в итоге предположил что закрыто соединение и попробовал постоянное... и все заработало... но не понятно почему оно закрываетсяУлыбка


хм чудеса... а сейчас из своего кода убрал опцию PDO::ATTR_PERSISTENT => true


и всеравно работает... это типа соединение старое осталось открытым?
 
 Top
andrewkard
Отправлено: 11 Июля, 2018 - 18:04:36
Post Id


Участник


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


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




Мелкий пишет:
а откуда такой вывод?

да виноват, не досмотрел
 
 Top
andrewkard
Отправлено: 12 Июля, 2018 - 07:33:38
Post Id


Участник


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


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




alecs пишет:
но не понятно почему оно закрывается

чудес не бывает, всегда поведению есть объективная причина, возможно где то была ошибка и соединение слетало или еще чего.
 
 Top
alecs
Отправлено: 12 Июля, 2018 - 14:29:16
Post Id


Новичок


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


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




andrewkard пишет:
alecs пишет:
но не понятно почему оно закрывается

чудес не бывает, всегда поведению есть объективная причина, возможно где то была ошибка и соединение слетало или еще чего.



а в первом совете была ошибка? насчет указателя?
 
 Top
andrewkard
Отправлено: 12 Июля, 2018 - 16:32:48
Post Id


Участник


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


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




alecs пишет:
andrewkard пишет:
alecs пишет:
но не понятно почему оно закрывается

чудес не бывает, всегда поведению есть объективная причина, возможно где то была ошибка и соединение слетало или еще чего.



а в первом совете была ошибка? насчет указателя?


Нет, извлечение с помощью курсора так же имеет право на жизнь Улыбка
 
 Top
alecs
Отправлено: 12 Июля, 2018 - 21:27:20
Post Id


Новичок


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


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




andrewkard пишет:
alecs пишет:
andrewkard пишет:
alecs пишет:
но не понятно почему оно закрывается

чудес не бывает, всегда поведению есть объективная причина, возможно где то была ошибка и соединение слетало или еще чего.



а в первом совете была ошибка? насчет указателя?


Нет, извлечение с помощью курсора так же имеет право на жизнь Улыбка



подскажите, что в этом запросе не нравится mysql? это часть Php кода, Mysql ругается:

Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''report'' ( 'id' int not null auto_increment, 'create_date' date,' at line 1 in C:\Apache24\htdocs\btc\mysql_reports.php:46 Stack trace: #0 C:\Apache24\htdocs\btc\mysql_reports.php(46): PDOStatement->execute(Array) #1 {main} thrown in C:\Apache24\htdocs\btc\mysql_reports.php on line 46


PHP:
скопировать код в буфер обмена
  1. $table = "report";
  2.          $query = "CREATE TABLE IF NOT EXISTS :table
  3.          (
  4.         'id' int not null auto_increment,
  5.         'create_date' date,
  6.         'pair' varchar(20) not null,
  7.        'amount' FLOAT(20,8) not null,
  8.        'price' DOUBLE(20,8) not null,
  9.        'profit' DOUBLE(20,8) not null,
  10.        primary key (id)
  11.    )";
  12.      $sql = $pdo -> prepare($query);
  13.      $sql -> execute(array('table' => $table));



PS напрямую в mysql запрос этот работает. только кавычки убрал с названия полей таблицы... но в Php работать отказывается... попробовал :table заключить в обратные ковычки `` запрос выполнился без ошибок... но имя таблицы создалось не report а `report` так и написано в phpmyadmin... что я не так делаюУлыбка?

(Отредактировано автором: 12 Июля, 2018 - 22:31:05)

 
 Top
andrewkard
Отправлено: 13 Июля, 2018 - 09:29:35
Post Id


Участник


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


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




В данном конкретном случает не нужно делать подготовленный запрос, поскольку
обычно название таблицы хард кодят либо вообще создают вручную.
Если нужно в скрипте, сделайте вот так:

PHP:
скопировать код в буфер обмена
  1.  
  2. $query = 'CREATE TABLE IF NOT EXISTS `report`
  3.             (
  4.            `id` INT NOT NULL auto_increment PRIMARY KEY,
  5.            `create_date` DATE,
  6.            `pair` VARCHAR (20) NOT NULL,
  7.           `amount` FLOAT(20,8) NOT NULL,
  8.           `price` DOUBLE(20,8) NOT NULL,
  9.           `profit` DOUBLE(20,8) NOT NULL
  10.       )';
  11. $pdo->query($query);
  12.  
 
 Top
alecs
Отправлено: 13 Июля, 2018 - 14:32:01
Post Id


Новичок


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


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




andrewkard пишет:
В данном конкретном случает не нужно делать подготовленный запрос, поскольку
обычно название таблицы хард кодят либо вообще создают вручную.
Если нужно в скрипте, сделайте вот так:

PHP:
скопировать код в буфер обмена
  1.  
  2. $query = 'CREATE TABLE IF NOT EXISTS `report`
  3.             (
  4.            `id` INT NOT NULL auto_increment PRIMARY KEY,
  5.            `create_date` DATE,
  6.            `pair` VARCHAR (20) NOT NULL,
  7.           `amount` FLOAT(20,8) NOT NULL,
  8.           `price` DOUBLE(20,8) NOT NULL,
  9.           `profit` DOUBLE(20,8) NOT NULL
  10.       )';
  11. $pdo->query($query);
  12.  



Ок понял, благодарю... Подскажите а как в таких ситуациях поступают...

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

(Отредактировано автором: 13 Июля, 2018 - 17:32:29)

 
 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