Niezgodność nagłówków i wersji pomocniczej biblioteki klienta

83

W PHP za każdym razem, gdy próbuję połączyć się z bazą danych (przez mysql_connect), otrzymuję następujące ostrzeżenie

Ostrzeżenie: mysql_connect (): Niezgodność nagłówków i wersji pomocniczej biblioteki klienta. Nagłówki: 50162 Biblioteka: 50524

W moim php -iwyniku mam następujące wartości wymienione w mysqli

Wersja biblioteki API klienta => 5.5.24

Wersja nagłówka API klienta => 5.1.62

Próbowałem zaktualizować php5-mysql i php, ale mam już najnowszą wersję obu z nich. Jak mam zaktualizować wersję nagłówka, aby przestać widzieć to ostrzeżenie?

EDYTOWAĆ

Wszystkie pliki MySQL powinny zostać zaktualizowane do najnowszej wersji:

$ apt-get install mysql.*5.5
. . .
mysql-client-5.5 is already the newest version.
mysql-server-core-5.5 is already the newest version.
mysql-server-5.5 is already the newest version.
mysql-testsuite-5.5 is already the newest version.
mysql-source-5.5 is already the newest version.

Usuwanie starych wersji

$ apt-get remove mysql.*5.1
. . .
Package handlersocket-mysql-5.1 is not installed, so not removed
Package mysql-cluster-client-5.1 is not installed, so not removed
Package mysql-cluster-server-5.1 is not installed, so not removed
Package mysql-client-5.1 is not installed, so not removed
Package mysql-client-core-5.1 is not installed, so not removed
Package mysql-server-5.1 is not installed, so not removed
Package mysql-server-core-5.1 is not installed, so not removed
Package mysql-source-5.1 is not installed, so not removed
Ian Hunter
źródło
będziesz musiał również zaktualizować zawartość mysql. mysql-client lub cokolwiek.
Marc B
@MarcB Powinienem mieć wszystkie najnowsze wersje pakietu MySQL (zobacz moją ostatnią edycję)
Ian Hunter
1
Nie można zaktualizować wersji „nagłówka interfejsu API klienta”, ponieważ jest ona zakodowana na stałe w pliku wykonywalnym PHP. Były to nagłówki mysql (i biblioteki) zainstalowane w systemie zarządzania pakietami PHP w czasie kompilacji PHP. Nie możesz ich ulepszyć. Musisz po awarii wrócić do bibliotek MySQL 5.1.X, aby ponownie uruchomić tę wersję PHP, lub zaktualizować PHP do wersji skompilowanej z MySQL 5.5.X.
dAm2K
@ dAm2K Jak się okazało wersja była w stanie zostać zmodernizowane poprzez zamianę mój bieżący plik mysqli.so z nowszej.
Ian Hunter
1
Naprawdę nie wiem, czy istnieje sposób na sprawdzenie zgodności ABI ... wystarczy sprawdzić plik error_log apache pod kątem dziwnych błędów potomnych httpd. Jeśli po 3-4 dniach błąd nie pojawi się, powinno być dobrze.
dAm2K

Odpowiedzi:

31

Twoje PHP zostało skompilowane z MySQL 5.1, ale teraz łączy bibliotekę mysql z rodziny 5.5.X. Musisz zaktualizować PHP do wersji skompilowanej z MySQL 5.5 lub przywrócić biblioteki klienta mysql do wersji 5.1.x.

dAm2K
źródło
1
Zasadniczo był to problem, który miałem, ale zamiast aktualizować lub obniżać wersję czegokolwiek, byłem w stanie pobrać plik mysqli.so z serwera z PHP skompilowanego z MySQL 5.5 i po prostu umieścić go w moim katalogu / usr / lib / php5 / . Nie jestem jednak pewien, czy jest to najbezpieczniejsza trasa, więc nie chcę jej używać jako odpowiedzi. Dzięki za pomoc.
Ian Hunter
128

Używam MariaDB i mam podobny problem.

Ze strony MariaDB zaleca się naprawienie go przez

  1. Przejdź do korzystania ze sterownika mysqlnd w PHP (zalecane rozwiązanie).
  2. Uruchom z niższym poziomem raportowania błędów:

    $err_level = error_reporting(0);  
    $conn = mysql_connect('params');  
    error_reporting($err_level); 
    
  3. Przekompiluj PHP z bibliotekami klienta MariaDB.
  4. Użyj swojej oryginalnej biblioteki klienta MySQL z MariaDB.

Mój problem został rozwiązany przy użyciu sterownika mysqlnd w Ubuntu:

sudo apt-get install php5-mysqlnd

Twoje zdrowie!


[aktualizacja: dodatkowe informacje] Zainstalowanie tego sterownika rozwiązuje również problem PDO, który zwraca wartość całkowitą jako łańcuch. Aby zachować typ jako liczbę całkowitą, po zainstalowaniu mysqlInd zrób to

$db = new PDO('mysql:host='.$host.';dbname='.$db_name, $user, $pass, 
          array( PDO::ATTR_PERSISTENT => true));
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
rozpoznać
źródło
4
To powinna być odpowiedź, ponieważ działa to również z mysql
Justin E
1
To rozwiązało mój problem z niezgodnością mysql i php w Ubuntu. Dzięki!
jamescampbell
1
dzięki to działa dla klastra mysql 7.30. Jestem z tego bardzo zadowolony: D
haidarvm
wyłączenie raportowania błędów. to najlepsze rozwiązanie. : D
MaXi32
2
mysqlnd z marią db i php7 działa świetnie, dzięki za odpowiedź!
Ricardo BRGWeb
69

W nowej rodzinie MySQL 5.6 musisz zainstalować php5-mysqlnd, a nie php5-mysql.

Usuń tę wersję sterownika mysql

sudo apt-get remove php5-mysql

Zamiast tego zainstaluj to

sudo apt-get install php5-mysqlnd
Carlos Buenosvinos Zamora
źródło
9
Proszę wyjaśnij trochę swoją odpowiedź. Na przykład to, co robią te pakiety.
Machavity
4
W nowej rodzinie MySQL 5.6 musisz zainstalować php5-mysqlnd, a nie php5-mysql.
Carlos Buenosvinos Zamora
To rozwiązało problem. Miałem do czynienia z tym problemem, gdy uaktualniłem MySql (AWS RDS MySql Instance) z 5.5 do 5.6.
Rahul Prasad
3
Oczywiście do poprawnego działania potrzebne jest ponowne uruchomienie Apache. Po prostu wskazując na oczywistość
Metafaniel
1
To zepsuło mój phpMyAdmin. Wygląda na to, że phpMyAdmin nie może współpracować z natywnym sterownikiem MySQL.
Ehsan
23

To samo działa dla MySQL:

sudo apt-get install php5-mysqlnd

Czytałem ten wątek, próbując znaleźć rozwiązanie dla MySQL, a także widziałem odpowiedź kena, ale zignorowałem rozwiązanie dla MariaDB, marnując w ten sposób kilka godzin. Nie było dla mnie jasne, że to samo może dotyczyć MySQL. Ten post jest tylko po to, by oszczędzić Ci straconych kilku godzin.

marek
źródło
dobra poprawka dla mnie, a następnie sudo systemctl restart mysql sudo systemctl restart apache2
Paul
Znacznie lepiej jest przeprowadzić instalację i pozwolić, aby zależności usunęły php5-mysql. Niektóre systemy nie lubią czyszczenia php5-mysql bez alternatywy.
Rui F Ribeiro
11

Głównym powodem tego błędu jest to, że PHP oddzieliło się jakiś czas temu od bibliotek klienta MySQL. Więc to, co się dzieje (głównie na starszych kompilacjach Linuksa), polega na tym, że ludzie będą kompilować PHP dla danej kompilacji klienta MySQL (co oznacza, że ​​wersja zainstalowanego MySQL jest nieistotna) i nie będzie aktualizowana (w CentOS ten pakiet jest wymieniony jako mysqlclientXX, gdzie XXreprezentuje numer pakietu). Pozwala to również opiekunowi pakietu na obsługę niższych wersji MySQL. Jest to trudny sposób, ale był to jedyny sposób, biorąc pod uwagę, w jaki sposób PHP i MySQL używają różnych licencji.

MySQLND rozwiązuje problem, używając własnego natywnego sterownika PHP (ND), który nie polega już na kliencie MySQL. Jest również skompilowany dla używanej wersji PHP. Jest to lepsze rozwiązanie pod każdym względem, jeśli nie ma innego powodu, dla którego MySQLND jest stworzone do komunikacji PHP z MySQL.

Jeśli nie możesz zainstalować MySQLND, możesz w większości bezpiecznie zignorować ten błąd. To po prostu bardziej do Twojej wiadomości niż cokolwiek innego. Po prostu brzmi strasznie.

Machavity
źródło
2

Aby skompilować php ze źródła z natywnym sterownikiem MySQL (mysqlnd) ,

cd /php/source/path
./configure <other-options> --with-mysql --with-mysqli --with-pdo-mysql
make clean    # required if there was a previous make, which could cause various errors during make
make
make install

Od /php/source/path/configure --help.

--with-mysql=DIR        Include MySQL support.  DIR is the MySQL base
                      directory, if no DIR is passed or the value is
                      mysqlnd the MySQL native driver will be used
--with-mysqli=FILE      Include MySQLi support.  FILE is the path
                      to mysql_config.  If no value or mysqlnd is passed
                      as FILE, the MySQL native driver will be used
--with-pdo-mysql=DIR    PDO: MySQL support. DIR is the MySQL base directory
                      If no value or mysqlnd is passed as DIR, the
                      MySQL native driver will be used

Korzystając z tych opcji, można dołączyć jedno lub więcej rozszerzeń PHP MySQL.
Jeśli wartość nie zostanie przekazana do tych opcji lub jeśli wartość to mysqlnd, zostanie użyty natywny sterownik MySQL.

Sithsu
źródło
Twoja odpowiedź była dla mnie tak cenna. Przeczytałem w nim, że aby poprawnie korzystać ze skompilowanego sterownika, musiałem użyć OBU --with-mysqli --with-mysqliopcji. Więc tym razem ponownie wykonałem polecenie konfiguracyjne: `--with-mysql = / home / stephane / Programs / mariadb / install \ --with-mysqli = / home / stephane / programy / mariadb / install / bin / mysql_config` i problem został rozwiązany. Teraz używa poprawnej wersji klienta MariaDB.
Stephane
1

Mam tę samą walkę z php na mojej stronie WordPress ...

Błąd: Ostrzeżenie: mysql_connect (): Niezgodność nagłówków i wersji pomocniczej biblioteki klienta. Nagłówki: 50547 Biblioteka: 50628 w /home/lhu/public_html/innovacarrentalschennai.com/wp-includes/wp-db.php on line 1515

Przyczyna: zaktualizowałem wersję wp 4.2 do 4.5 (niezgodność PHP i MySql)

Zmieniłem wp-db.php w linii 1515

$this->dbh = mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );

do

if ( WP_DEBUG ) {
    $this->dbh = mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );
} else {
    $this->dbh = @mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );
}

Dostał bez wojennego błędu na mojej stronie WordPress

OpenWebWar
źródło
Ta informacja przestanie działać pod PHP7, ponieważ funkcje mysql_ zostały usunięte
Machavity
1

Gdybyś miał dostęp do panelu cpanel lub whm do hostingu domeny ...

W cPanel przejdź do zakładki "Oprogramowanie i usługi", >> a następnie kliknij "Wybierz wersję PHP" >> ustaw żądaną wersję php ...

Ostrzeżenie: mysql_connect (): Niezgodność nagłówków i wersji pomocniczej biblioteki klienta.  Nagłówki: 50547 Biblioteka: 50628 w chennaitechnologies.com

Na przykład. Aktualna wersja PHP:

Wersja PHP [5.2] (lista dostępnych wersji php 5.2, 5.3, 5.4, 5.5, 5.6)

Ostrzeżenie: zmiana modułów php i opcji php za pomocą selektora PHP dla natywnej wersji php jest niemożliwa

Wybrałem wersję 5.6 php, po usunięciu tego błędu na moim blogu wordpress ...

OpenWebWar
źródło
1
Warning: mysqli::mysqli(): Headers and client library minor version mismatch.
Headers:50547 Library:100026

Rozwiązałem powyższy błąd, po prostu odbudowując mój Apache:

cPanel Version  56.0 (build 25)
Apache Version  2.4.18
PHP Version 5.5.30
MySQL Version   10.0.26-MariaDB
Dot Online Services
źródło
0

Mam ten problem, gdy używam Percona / MySQL 5.6, a sterownik php został skompilowany z wersją 5.5, a niektóre aplikacje wymagają php5-mysql, więc piszę skrypt, aby odbudować sterowniki.

https://github.com/falcacibar/php5-mysql-rebuild

Felipe Buccioni
źródło
0

W przypadku WHM i cPanel niektóre wersje wymagają wyraźnego ustawienia mysqli do kompilacji.

Używając WHM, pod CENTOS 6.9 xen pv [dc] v68.0.27, trzeba było przebudować Apache / PHP, patrząc na wszystkie opcje i wybierając mysqli do zbudowania. Domyślnie było budowanie przestarzałego mysql. Teraz komunikaty o deprecjacji zniknęły, a jeden jest gotowy na przyszłe aktualizacje MySQL.

Bob P.
źródło
0

Napotkałem ten sam problem na centos7. Usunięcie php-mysql i zainstalowanie php-mysqlnd rozwiązało problem. Dzięki Carlosowi Buenosvinos Zamora za sugestię.

Oto moje polecenia dotyczące centos7 na wypadek, gdyby mogło to pomóc komukolwiek, ponieważ większość odpowiedzi tutaj opiera się na Debianie / Ubuntu.

Aby znaleźć zainstalowany pakiet php-mysql

yum list installed | grep mysql

Aby usunąć zainstalowany pakiet php-mysql

yum remove php55w-mysql.x86_64

Aby zainstalować php-mysqlnd

yum install php-mysqlnd.x86_64
Agent 7
źródło
0

Moja firma hostingowa kazała mi to naprawić, dezaktywując "mysqli" i aktywując "nd_mysqli" w rozszerzeniach php.

Błąd zniknął, ale nie mam wiedzy, aby zrozumieć, czy jest to właściwa metoda rozwiązania tego problemu.

Pumizo
źródło
-1

Zmiana wersji PHP z 5.6 na 5.5 Naprawiono to .

Musisz przejść do panelu sterowania> Skrypt CGI i tam zmienić wersję PHP.

Hammad Khan
źródło
Wszyscy próbujemy dostać się do najnowszej wersji, nie cofając się w wersjach.
karmafunk