За последние 24 часа нас посетили 17727 программистов и 1618 роботов. Сейчас ищут 1660 программистов ...

PHP 7 подключение к Mysql

Тема в разделе "MySQL", создана пользователем sharunm, 6 фев 2017.

  1. sharunm

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

    С нами с:
    16 ноя 2014
    Сообщения:
    58
    Симпатии:
    0
    ребята, пытаюсь написать класс для работы с MySQL для PHP 7, уже все перепробовал, не хочет работать... Еще момент, что в PHP 7 используется вместо $this в классах? Короче, мои классы в PHP 7 не работают (использую mysqli)... Помогите с написанием конструктора и как мне к классам обращаться без self::, parent:: или ClassName:: ? Только начал въезжать в эту версию языка. Спасибо
     
  2. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
  3. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @sharunm помнится когдато читал об изменениях в 7. можно пример твоего кода?
     
  4. marsik

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

    С нами с:
    30 дек 2008
    Сообщения:
    246
    Симпатии:
    17
    наверное без конструктора класса
     
  5. sharunm

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

    С нами с:
    16 ноя 2014
    Сообщения:
    58
    Симпатии:
    0
    Код (Text):
    1. <?php
    2.  
    3. class Database {
    4.  
    5.    
    6.    
    7.     function __construct() {
    8.    
    9.         $link = new mysqli('localhost', 'root', '123qweznoxiu', 'bearings') ;
    10.        
    11.         if (!$link) {
    12.             echo "Ошибка: Невозможно установить соединение с MySQL." . PHP_EOL;
    13.             echo "Код ошибки errno: " . mysqli_connect_errno() . PHP_EOL;
    14.             echo "Текст ошибки error: " . mysqli_connect_error() . PHP_EOL;
    15.             exit;
    16.         }
    17.  
    18.         echo "Соединение с MySQL установлено!" . PHP_EOL;
    19.         echo "Информация о сервере: " . mysqli_get_host_info($link) . PHP_EOL;
    20.    
    21.     }
    22.    
    23.    
    24.     function SelectFrom($table, $fields) {
    25.  
    26.         $result = mysql_query ("SELECT ".$fields." FROM `".$table."`");
    27.  
    28.         if ($result) {
    29.         $num = mysql_num_rows($result);    
    30.         $i = 0;
    31.         while ($i < $num) {
    32.         $data[$i] = mysql_fetch_assoc($result);
    33.         $i++;
    34.         }  
    35.         // $result = array('cities'=>$cities);
    36.         }
    37.         else {
    38.         $data = array('type'=>'error');
    39.         }
    40.  
    41.         return $data;
    42.  
    43.     }
    44.    
    45.     function testClass() { //чисто проверка, виден класс или нет
    46.         echo '<p>It works!</p>';
    47.     }
    48.    
    49. }
    50.  
    51. ?>
    --- Добавлено ---
    Код (Text):
    1. <?php
    2.  
    3. class Database {
    4.  
    5.    
    6.    
    7.     function __construct() {
    8.    
    9.         $link = new mysqli('localhost', 'root', '123qweznoxiu', 'bearings') ;
    10.        
    11.         if (!$link) {
    12.             echo "Ошибка: Невозможно установить соединение с MySQL." . PHP_EOL;
    13.             echo "Код ошибки errno: " . mysqli_connect_errno() . PHP_EOL;
    14.             echo "Текст ошибки error: " . mysqli_connect_error() . PHP_EOL;
    15.             exit;
    16.         }
    17.  
    18.         echo "Соединение с MySQL установлено!" . PHP_EOL;
    19.         echo "Информация о сервере: " . mysqli_get_host_info($link) . PHP_EOL;
    20.    
    21.     }
    22.    
    23.    
    24.     function SelectFrom($table, $fields) {
    25.  
    26.         $result = mysql_query ("SELECT ".$fields." FROM `".$table."`");
    27.  
    28.         if ($result) {
    29.         $num = mysql_num_rows($result);    
    30.         $i = 0;
    31.         while ($i < $num) {
    32.         $data[$i] = mysql_fetch_assoc($result);
    33.         $i++;
    34.         }  
    35.         // $result = array('cities'=>$cities);
    36.         }
    37.         else {
    38.         $data = array('type'=>'error');
    39.         }
    40.  
    41.         return $data;
    42.  
    43.     }
    44.    
    45.     function testClass() {
    46.         echo '<p>It works!</p>';
    47.     }
    48.    
    49. }
    50.  
    51. ?>
    --- Добавлено ---
    ECHO я оставил просто проверить,как функция работает... Было еще куча вариация на тему, ничего не работает
    --- Добавлено ---
    И вот класс, который его использует (см. ниже). Сам класс рабочий, автоподгрузка работает, виды загружаются... Но, к функциям приходится обращаться не через $this, а self и прочие... А БД, вообще, не работает
     
  6. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @sharunm [vvv полагаю дело в mysql_query которому нужно вторым параметром передать $link
     
  7. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    У тебя такая каша в коде это ад,а помимо этого хочешь использовать mysqli а по факту делаешь mysql_query
     
  8. NerdRage

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

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    У меня для работы с Wordpress такое. Функция connect_db() вызывается в __construct основного класса, и её результат записывается в $this->db.

    PHP:
    1. function connect_db() {
    2.    include($this->site_dir.'wp-config.php');
    3.    $db = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    4.    if (mysqli_connect_errno()) {
    5.        $this->error_tpl('Не удалось подключиться к базе данных', mysqli_connect_error());
    6.        die();
    7.    }
    8.    if (!mysqli_set_charset($db, "utf8")) {
    9.        $this->error_tpl('Ошибка базы данных', mysqli_error($db));
    10.        die();
    11.    }
    12.    return $db;
    13. }
    14. function query($query) {
    15.    return mysqli_query($this->db, $query);
    16. }
    17.  
    18. function escape($text) {
    19.    return mysqli_real_escape_string($this->db, $text);
    20. }
     
  9. sharunm

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

    С нами с:
    16 ноя 2014
    Сообщения:
    58
    Симпатии:
    0
    И вот класс, который его использует (см. ниже). Сам класс рабочий, автоподгрузка работает, виды загружаются... Но, к функциям приходится обращаться не через $this,
    Как лучше написать запрос?
     
  10. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @sharunm
    mysql_query ("SELECT ".$fields." FROM `".$table."`",this->link);
    как то так
     
  11. sharunm

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

    С нами с:
    16 ноя 2014
    Сообщения:
    58
    Симпатии:
    0
    Эта уже не помню, какая каша в коде... Подскажите, как лучше написать класс и к нему обращаться? В контроллере или модели? Я что-то запутался. Спасибо
     
  12. marsik

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

    С нами с:
    30 дек 2008
    Сообщения:
    246
    Симпатии:
    17
    в php7 не работает mysql, переписывайте на mysqli, т.е. запрос должен быть $result = mysqli_query ($link, "SELECT ".$fields." FROM `".$table."`");
     
  13. sharunm

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

    С нами с:
    16 ноя 2014
    Сообщения:
    58
    Симпатии:
    0
    Не работает....:


    Код (Text):
    1. <?php
    2.  
    3. class Database {
    4.  
    5.    
    6.    
    7.     function __construct() {
    8.    
    9.         $link = new mysqli('localhost', 'root', '123qweznoxiu', 'bearings') ;
    10.        
    11.         if (!$link) {
    12.             echo "Ошибка: Невозможно установить соединение с MySQL." . PHP_EOL;
    13.             echo "Код ошибки errno: " . mysqli_connect_errno() . PHP_EOL;
    14.             echo "Текст ошибки error: " . mysqli_connect_error() . PHP_EOL;
    15.             exit;
    16.         }
    17.  
    18.         echo "Соединение с MySQL установлено!" . PHP_EOL;
    19.         echo "Информация о сервере: " . mysqli_get_host_info($link) . PHP_EOL;
    20.    
    21.     }
    22.    
    23.    
    24.     function SelectFrom($table, $fields) {
    25.  
    26.         $result = mysql_query ("SELECT ".$fields." FROM `".$table."`", $this->link);
    27.  
    28.         if ($result) {
    29.         $num = mysql_num_rows($result);    
    30.         $i = 0;
    31.         while ($i < $num) {
    32.         $data[$i] = mysql_fetch_assoc($result);
    33.         $i++;
    34.         }  
    35.         }
    36.         else {
    37.         $data = array('type'=>'error');
    38.         }
    39.  
    40.         return $data;
    41.  
    42.     }
    43.    
    44.     function testClass() {
    45.         echo '<p>It works!</p>';
    46.     }
    47.    
    48. }
    49.  
    50. ?>
    --- Добавлено ---
    Уже лучше, результат работы (print_r($bt)):
    Array ( [type] => error )
     
  14. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @sharunm полный код и результат вывода ошибок
     
  15. marsik

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

    С нами с:
    30 дек 2008
    Сообщения:
    246
    Симпатии:
    17
    у вас все напутано, подключение в ОО, запрос в процедурном, приведите в порядок код
     
  16. sharunm

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

    С нами с:
    16 ноя 2014
    Сообщения:
    58
    Симпатии:
    0
    Это класс БД:

    Код (Text):
    1. <?php
    2.  
    3. class Database {
    4.  
    5.    
    6.    
    7.     function __construct() {
    8.    
    9.         $link = new mysqli('localhost', 'root', '123qweznoxiu', 'bearings') ;
    10.        
    11.         if (!$link) {
    12.             echo "Ошибка: Невозможно установить соединение с MySQL." . PHP_EOL;
    13.             echo "Код ошибки errno: " . mysqli_connect_errno() . PHP_EOL;
    14.             echo "Текст ошибки error: " . mysqli_connect_error() . PHP_EOL;
    15.             exit;
    16.         }
    17.  
    18.         echo "Соединение с MySQL установлено!" . PHP_EOL;
    19.         echo "Информация о сервере: " . mysqli_get_host_info($link) . PHP_EOL;
    20.    
    21.     }
    22.    
    23.    
    24.     function SelectFrom($table, $fields) {
    25.  
    26.         $result = mysqli_query ("SELECT ".$fields." FROM `".$table."`");
    27.  
    28.         if ($result) {
    29.         $num = mysql_num_rows($result);    
    30.         $i = 0;
    31.         while ($i < $num) {
    32.         $data[$i] = mysql_fetch_assoc($result);
    33.         $i++;
    34.         }  
    35.         // $result = array('cities'=>$cities);
    36.         }
    37.         else {
    38.         $data = array('type'=>'error');
    39.         }
    40.  
    41.         return $data;
    42.  
    43.     }
    44.    
    45.     function testClass() {
    46.         echo '<p>It works!</p>';
    47.     }
    48.    
    49. }
    50.  
    51. ?>
    Это контроллер:

    Код (Text):
    1.  
    2.  
    3.     <?php
    4.    
    5.     class Welcome extends Inm_Controller {
    6.        
    7.         //static $db = new Database; //Кстати,это не работает ///
    8.        
    9.    
    10.         public function index() {
    11.             $bt = Database::SelectFrom($table = 'bearing_tables', $fields='id');
    12.             print_r ($bt);
    13.         }
    14.        
    15.  
    16.    
    17.     }
    18.    
    19.     ?>
    Это результат вывода: Array ( [type] => error )
    --- Добавлено ---
    как лучше написать? Сейчас я изучаю, как обращаться к функциям внутри класса на PHP 7, пытаюсь просто к БД подключиться, чтобы потом допиливать... Вот на работе с БД и застрял (((
     
  17. marsik

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

    С нами с:
    30 дек 2008
    Сообщения:
    246
    Симпатии:
    17
  18. sharunm

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

    С нами с:
    16 ноя 2014
    Сообщения:
    58
    Симпатии:
    0
    как лучше написать? Сейчас я изучаю, как обращаться к функциям внутри класса , того, пытаюсь просто
    Я через mysqli никогда не работал.. У меня два сайта, один еще на php4 написан (старый очень), эта функция там и работает исправно.. Второй - тупо парсер, там тоже без mysqli...
    --- Добавлено ---
    Вот так выдает результат:

    Код (Text):
    1. function SelectFrom($table, $fields) {
    2.         $link = new mysqli('localhost', 'root', '123qweznoxiu', 'bearings') ; // с этим работает, без этого нет
    3.         $result = mysqli_query ($link, "SELECT ".$fields." FROM `".$table."`");
    4.        
    5.  
    6.         if ($result) {
    7.             $num = mysqli_num_rows($result);    
    8.             $i = 0;
    9.             while ($i < $num) {
    10.             $data[$i] = mysqli_fetch_assoc($result);
    11.             $i++;
    12.             }  
    13.         }
    14.         else {
    15.             $data = array('type'=>'error');
    16.         }
    17.  
    18.         return $data;
    19.  
    20.     }
    Вопрос, как сделать конструктор класса, чтобы подключение вынести за пределы функции или, может, подклчение, вообще, в другой класс воткнуть и просто обращаться в переменной $link к нему... Как думаете, оправданный подход?
    --- Добавлено ---
    Вынес подключение к БД в отдельный класс и все работает...
     
  19. marsik

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

    С нами с:
    30 дек 2008
    Сообщения:
    246
    Симпатии:
    17
    что бы заработало без этого надо global
     
  20. sharunm

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

    С нами с:
    16 ноя 2014
    Сообщения:
    58
    Симпатии:
    0
    Вопрос, как сделать конструктор класса, чтобы подключение вынести за пределы
    Сделал проще:

    Код (Text):
    1. <?php
    2.     class DBconnect {
    3.    
    4.    
    5.     public function db1() {
    6.    
    7.         $link = new mysqli('localhost', 'root', '123qweznoxiu', 'bearings') ;
    8.         return $link;
    9.    
    10.     }
    11.    
    12.    
    13.     }
    14. ?>
    И использую в классе:

    Код (Text):
    1. <?php
    2.  
    3. class Database {
    4.  
    5.    
    6.     function SelectFrom($table, $fields) {
    7.         $DBconnect = DBconnect::db1();
    8.         $result = mysqli_query ($DBconnect, "SELECT ".$fields." FROM `".$table."`");
    9.        
    10.  
    11.         if ($result) {
    12.             $num = mysqli_num_rows($result);    
    13.             $i = 0;
    14.             while ($i < $num) {
    15.             $data[$i] = mysqli_fetch_assoc($result);
    16.             $i++;
    17.             }  
    18.         }
    19.         else {
    20.             $data = array('type'=>'error');
    21.         }
    22.  
    23.         return $data;
    24.  
    25.     }
    26.    
    27.    
    28. }
    29.  
    30. ?>
    Может. не совсем валидно, но компактно и работает, также подумаю, как использовать несколько подключений к разным бд
     
  21. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    заменить $DBconnect на $this->DBconnect
     
  22. marsik

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

    С нами с:
    30 дек 2008
    Сообщения:
    246
    Симпатии:
    17
    зачем класс, можно проще, как то так:
    PHP:
    1. $link = mysqli_connect('localhost', 'root', '123qweznoxiu', 'bearings');
    2.  
    3. function SelectFrom($fields) {
    4.        global $link, $table;
    5.         $result = mysqli_query ($link, "SELECT ".$fields." FROM `".$table."`");
    6.      
    7.         if ($result) {
    8.             $num = mysqli_num_rows($result);  
    9.             $i = 0;
    10.             while ($i < $num) {
    11.             $data[$i] = mysqli_fetch_assoc($result);
    12.             $i++;
    13.             }
    14.         }
    15.         else {
    16.             $data = array('type'=>'error');
    17.         }
    18.         return $data;
    19.     }
     
  23. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @marsik ну да я за свою жизнь видел только один проект с двумя бд. но мода пошла на ооп ради одного объекта так что(((((
     
  24. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    SAPI mysql_ было удалено из PHP7. Используйте mysqli_.
    И включите отображение ошибок, чтобы сразу видеть проблемы.
    --- Добавлено ---
    Сколько лет mysql_ уже deprecated было? Лет 5? И все равно свершилось неизбежное - когда его вконец выпилили, это стало неожиданностью.
     
  25. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Начиная с 5.5 объявлено depricated,но это ладно, не все читают миграции.Меня удивляет больше что люди либо вообще не заглядывают в документацию,что в целом очень плохо,либо заглядывают и игнорируют вот это:
    [​IMG]