За последние 24 часа нас посетили 22504 программиста и 1275 роботов. Сейчас ищут 750 программистов ...

mysqli to PDO

Тема в разделе "PHP для новичков", создана пользователем cadijob, 14 июл 2017.

Метки:
  1. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    Привет.
    Пытаюсь изменить доступ к бд с mysqli на PDO.

    connect -
    PHP:
    1. function connectPDO(){
    2.     $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    3.     $opt = [
    4.         PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    5.         PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    6.         PDO::ATTR_EMULATE_PREPARES   => false,
    7.     ];
    8.     $pdo = new PDO($dsn, $user, $pass, $opt);
    9. }
    10.  
    11. $mysql = false;
    12. function connectDB(){
    13.     global $mysqli;
    14.     $mysqli = new mysqli('127.0.0.1', 'root', '', 'mainDB');
    15.     if (!$mysqli->connect_errno)  $mysqli->set_charset('utf8');
    16. }
    17.  
    18. function closeDB(){
    19.     global $mysqli;
    20.     $mysqli->close();
    21. }
    mysqli который работал идеально:
    PHP:
    1. function getTags(){
    2.     global $mysqli;
    3.     connectDB();
    4.     $tagsResult = $mysqli->query("SELECT * FROM `tags` ORDER BY `id`");
    5.     closeDB();
    6.     return resultToArrayTags ($tagsResult);
    7. }
    8.  
    9. function resultToArrayTags ($tagsResult){
    10.     $array = array();
    11.     while (($row = $tagsResult->fetch_assoc()) != false )
    12.         $array[] = $row;
    13.     return $array;
    14. }
    и новый PDO, в котором ошибка, похоже -
    PHP:
    1. function getTags(){
    2.     connectPDO();
    3.     $tagsResult = $pdo->query("SELECT * FROM `tags` ORDER BY `id`");
    4.     return resultToArrayTags ($tagsResult);
    5. }
    6.  
    7. function resultToArrayTags($tagsResult){
    8.     $array = array();
    9.     while ($row = $tagsResult->fetch( PDO::FETCH_ASSOC )) {
    10.         $array[] = $row;
    11.    }
    12.    return $array;
    13. }
    а так я получаю теги в index.php -
    PHP:
    1. <head>
    2.     <?php
    3.     require_once "functions/function.php";
    4.     $tags = $getTags();
    5. </head>
    6. <body id="scroll">
    7.                 <ul>
    8.                     <?php
    9.                     for ($i=0; $i < count($tags); $i++) {
    10.                         echo "<li сlass='tagLi'><a href='{$tags[$i]['alias']}' id='{$tags[$i]['id']}' class='canDisable'>{$tags[$i]['name']}</a></li>";
    11.                     }
    12.                     ?>
    13.                 </ul>
    14. </body>
    15. </html>
    Ошибка -
    Fatal error: Uncaught Error: Function name must be a string in адрес/index.php:6 Stack trace: #0 {main} thrown in адрес\index.php on line 6

    В чём может быть проблема?
     
  2. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Ругается на отсутствие закрывающего тега ?> в index.php перед </head>
     
  3. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    Не. Это я криво вставил, в файле всё нормально.
     
  4. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Не совсем понятно, где 6я строчка, но скорее всего проблема в том, что объект $pdo у Вас во всех функциях локальный. Либо добавьте везде global $pdo, либо передавайте его в качестве входного параметра.
     
  5. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    global не помог. line 6 - $tags = $getTags();
     
  6. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Знак доллара уберите с имени функции.
     
    cadijob нравится это.
  7. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Там случайно $ не лишняя перед getTags()?
     
    cadijob и Maputo нравится это.
  8. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    Теперь-

    Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2019] Unknown character set in адрес\functions\connect.php:16 Stack trace: #0 адрес\functions\connect.php(16): PDO->__construct('mysql:host=;dbn...', NULL, NULL, Array) #1 адрес\functions\function.php(19): connectPDO() #2 адрес\index.php(6): getTags() #3 {main} thrown in адрес\functions\connect.php on line 16
    Как я понял не может подключится к БД? Всё по уроку делал...
     
  9. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Переменные $host, $db, $charset, $user и $pass тоже не определены в функции connectPDO
     
  10. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    PHP:
    1. $host="127.0.0.1";
    2. $user="root";
    3. $pass="";
    4. $db='mainDB';
    5. $charset = 'utf8';
     
  11. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Это должно быть объявлено внутри функции connectPDO, либо global, либо в качестве входных параметров. Потому что везде пусто:

     
  12. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    Вставил их в функцию connect PDO
    Новая ошибка -
    Fatal error: Uncaught Error: Call to a member function query() on null in адрес\functions\function.php:20 Stack trace: #0 адрес\index.php(6): getTags() #1 {main} thrown in адрес\functions\function.php on line 20

    line 20 -
    PHP:
    1. $tagsResult = $pdo->query("SELECT * FROM `tags` ORDER BY `id`");
     
  13. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    global $pdo; добавить в начало функции, если эта строка находится внутри функции.
     
    #13 Maputo, 14 июл 2017
    Последнее редактирование: 14 июл 2017
    cadijob нравится это.
  14. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    Всё работает. Спасибо большое.
     
  15. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
  16. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @MouseZver
    я в принципе по этой обвертке написал класс, но он слабоват :D по чужим кодам шастал смотрел и себе так же делал :D