Форумы портала PHP.SU » » Вопросы новичков » Помогите понять почему?

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

1. alecs - 10 Июля, 2018 - 13:42:40 - перейти к сообщению
Всем привет, я изучаю 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? или где то в коде закрывается по какой то причине соединение... непойму...

Благодрю за ответыУлыбка
2. andrewkard - 11 Июля, 2018 - 06:59:15 - перейти к сообщению
Вы пытаетесь взять строки средствами прокручиваемого курсора, сделайте так, как в документации:
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
3. Мелкий - 11 Июля, 2018 - 10:44:22 - перейти к сообщению
andrewkard, а откуда такой вывод?
4. alecs - 11 Июля, 2018 - 16:18:12 - перейти к сообщению
может я туплюУлыбка но я ничего не понял... пример мой из учебного материала был взят... автор Денис Колисниченко я так понимаю он брал инфу из официальной документацииУлыбка) я просто сам в итоге предположил что закрыто соединение и попробовал постоянное... и все заработало... но не понятно почему оно закрываетсяУлыбка


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


и всеравно работает... это типа соединение старое осталось открытым?
5. andrewkard - 11 Июля, 2018 - 18:04:36 - перейти к сообщению
Мелкий пишет:
а откуда такой вывод?

да виноват, не досмотрел
6. andrewkard - 12 Июля, 2018 - 07:33:38 - перейти к сообщению
alecs пишет:
но не понятно почему оно закрывается

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

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



а в первом совете была ошибка? насчет указателя?
8. andrewkard - 12 Июля, 2018 - 16:32:48 - перейти к сообщению
alecs пишет:
andrewkard пишет:
alecs пишет:
но не понятно почему оно закрывается

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



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


Нет, извлечение с помощью курсора так же имеет право на жизнь Улыбка
9. alecs - 12 Июля, 2018 - 21:27:20 - перейти к сообщению
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... что я не так делаюУлыбка?
10. andrewkard - 13 Июля, 2018 - 09:29:35 - перейти к сообщению
В данном конкретном случает не нужно делать подготовленный запрос, поскольку
обычно название таблицы хард кодят либо вообще создают вручную.
Если нужно в скрипте, сделайте вот так:

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.  
11. alecs - 13 Июля, 2018 - 14:32:01 - перейти к сообщению
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.  



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

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

 

Powered by ExBB FM 1.0 RC1