Header und kleinere Version der Clientbibliothek stimmen nicht überein

81

In PHP erhalte ich die folgende Warnung, wenn ich versuche, eine Verbindung zu einer Datenbank herzustellen (via mysql_connect)

Warnung: mysql_connect (): Nicht übereinstimmende Header und Clientbibliothek stimmen nicht überein. Header: 50162 Bibliothek: 50524

In meiner php -iAusgabe sind die folgenden Werte unter mysqli aufgeführt

Version der Client-API-Bibliothek => 5.5.24

Client-API-Header-Version => 5.1.62

Ich habe versucht, php5-mysql und php zu aktualisieren, aber ich bin bereits auf der neuesten Version von beiden. Wie aktualisiere ich die Header-Version, damit diese Warnung nicht mehr angezeigt wird?

BEARBEITEN

Meine MySQL-Dateien sollten alle auf die neueste Version aktualisiert werden:

$ 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.

Alte Versionen entfernen

$ 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
quelle
Sie müssen auch das MySQL-Zeug aktualisieren. MySQL-Client oder was auch immer.
Marc B
@MarcB Ich sollte alle neuesten Versionen der MySQL-Suite haben (siehe meine neueste Bearbeitung)
Ian Hunter
1
Die Version "Client API Header" kann nicht aktualisiert werden, da sie in der ausführbaren PHP-Datei fest codiert ist. Dies waren die MySQL-Header (und -Bibliotheken), die zum Zeitpunkt der Kompilierung von PHP auf dem System des PHP-Paket-Mantainers installiert waren. Sie können sie nicht aktualisieren. Sie müssen auf MySQL 5.1.X-Bibliotheken zurückgreifen, damit diese Version von PHP wieder funktioniert, oder PHP auf eine mit MySQL 5.5.X kompilierte Version aktualisieren.
dAm2K
@ dAm2K Da es die Version stellte sich heraus , war der Lage , mit einem neueren meiner aktuellen mysqli.so Datei aktualisiert werden durch Auslagern.
Ian Hunter
1
Ich weiß wirklich nicht, ob es eine Möglichkeit gibt, die ABI-Kompatibilität zu überprüfen ... Sie müssen nur apache error_log auf seltsame untergeordnete httpd-Fehler überprüfen. Wenn der Fehler nach 3-4 Tagen nicht auftritt, sollten Sie in Ordnung sein.
dAm2K

Antworten:

31

Ihr PHP wurde mit MySQL 5.1 kompiliert, aber jetzt verbindet es eine MySQL-Bibliothek der 5.5.X-Familie. Sie müssen PHP auf eine mit MySQL 5.5 kompilierte Version aktualisieren oder MySQL-Client-Bibliotheken auf 5.1.x zurücksetzen.

dAm2K
quelle
1
Grundsätzlich war dies das Problem, das ich hatte, aber anstatt irgendetwas zu aktualisieren oder herunterzustufen, konnte ich die Datei mysqli.so von einem Server mit PHP abrufen, der mit MySQL 5.5 kompiliert wurde, und sie einfach in mein Verzeichnis / usr / lib / php5 / stecken . Ich bin mir jedoch nicht sicher, ob dies der sicherste Weg ist, daher möchte ich diesen nicht als Antwort verwenden. Danke für Ihre Hilfe.
Ian Hunter
126

Ich benutze MariaDB und habe das ähnliche Problem.

Von der MariaDB-Site wird empfohlen, das Problem durch zu beheben

  1. Wechseln Sie zur Verwendung des mysqlnd-Treibers in PHP (empfohlene Lösung).
  2. Führen Sie mit einer niedrigeren Fehlerberichterstattungsstufe aus:

    $err_level = error_reporting(0);  
    $conn = mysql_connect('params');  
    error_reporting($err_level); 
  3. Kompilieren Sie PHP mit den MariaDB-Clientbibliotheken neu.
  4. Verwenden Sie Ihre ursprüngliche MySQL-Client-Bibliothek mit der MariaDB.

Mein Problem wurde mithilfe des mysqlnd-Treibers in Ubuntu behoben:

sudo apt-get install php5-mysqlnd

Prost!


[Update: Zusätzliche Informationen] Durch die Installation dieses Treibers wird auch das PDO-Problem behoben, bei dem ein ganzzahliger Wert als Zeichenfolge zurückgegeben wird. Führen Sie dies nach der Installation von mysqlInd aus, um den Typ als Ganzzahl beizubehalten

$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);
Ken
quelle
4
Dies sollte die Antwort sein, da dies auch mit MySQL funktioniert
Justin E
1
Dies löste mein Problem mit MySQL und PHP Mismatch in Ubuntu. Vielen Dank!
Jamescampbell
1
danke das funktioniert für mysql cluster 7.30. Ich bin sehr zufrieden damit: D
haidarvm
Fehlerberichterstattung deaktivieren. Das ist die beste Lösung. : D
MaXi32
2
das mysqlnd mit maria db und php7 funktioniert super, danke für die antwort!
Ricardo BRGWeb
68

Für die neue MySQL 5.6-Familie müssen Sie php5-mysqlnd installieren, nicht php5-mysql.

Entfernen Sie diese Version des MySQL-Treibers

sudo apt-get remove php5-mysql

Und installieren Sie dies stattdessen

sudo apt-get install php5-mysqlnd
Carlos Buenosvinos Zamora
quelle
9
Bitte erläutern Sie Ihre Antwort einige. Dinge wie das, was diese Pakete tun.
Machavity
4
Für die neue MySQL 5.6-Familie müssen Sie php5-mysqlnd installieren, nicht php5-mysql.
Carlos Buenosvinos Zamora
Es hat das Problem gelöst. Dieses Problem trat auf, als ich MySql (AWS RDS MySql Instance) von 5.5 auf 5.6 aktualisierte.
Rahul Prasad
3
Offensichtlich ist ein Neustart von Apache erforderlich, damit dies ordnungsgemäß funktioniert. Nur das Offensichtliche zeigen
Metafaniel
1
Das hat meinen phpMyAdmin kaputt gemacht. Es scheint, dass phpMyAdmin nicht mit dem nativen MySQL-Treiber arbeiten kann.
Ehsan
23

Das gleiche funktioniert für MySQL:

sudo apt-get install php5-mysqlnd

Ich habe diesen Thread gelesen, um die Lösung für MySQL zu finden, und ich habe auch Ken's Antwort gesehen, aber ich habe die Lösung für MariaDB ignoriert und ein paar Stunden auf diese Weise verschwendet. Mir war nicht klar, dass dies auch für MySQL gelten könnte. Dieser Beitrag soll Ihnen nur die wenigen Stunden ersparen, die ich verloren habe.

marek
quelle
gute Lösung für mich, gefolgt von sudo systemctl Neustart mysql sudo systemctl Neustart apache2
Paul
Es ist viel besser, die Installation durchzuführen und die Abhängigkeiten php5-mysql entfernen zu lassen. Einige Systeme mögen die Bereinigung von php5-mysql ohne Alternative nicht.
Rui F Ribeiro
10

Der Hauptgrund für diesen Fehler ist, dass sich PHP vor einiger Zeit von den MySQL Client-Bibliotheken getrennt hat. Was also passiert (hauptsächlich bei älteren Linux-Kompilierungen), ist, dass Benutzer PHP gegen einen bestimmten Build des MySQL-Clients kompilieren (was bedeutet, dass die installierte Version von MySQL irrelevant ist) und nicht aktualisieren (in CentOS wird dieses Paket als aufgeführt mysqlclientXX, wobei das XXdargestellt wird Paketnummer). Dadurch kann der Paketbetreuer auch niedrigere Versionen von MySQL unterstützen. Es ist ein chaotischer Weg, dies zu tun, aber es war der einzige Weg, wenn man bedenkt, wie PHP und MySQL unterschiedliche Lizenzen verwenden.

Mysqlnd löst das Problem durch PHP eigene nativen Treiber (die ND) verwendet wird , die nicht verläßt sich mehr auf MySQL - Client. Es wurde auch für die von Ihnen verwendete PHP-Version kompiliert. Dies ist eine rundum bessere Lösung, wenn MySQLND aus keinem anderen Grund dafür ausgelegt ist, dass PHP mit MySQL spricht.

Wenn Sie MySQLND nicht installieren können, können Sie diesen Fehler zum größten Teil sicher ignorieren. Es ist nur mehr eine FYI-Mitteilung als alles andere. Es klingt nur beängstigend.

Machavity
quelle
2

Um PHP aus dem Quellcode mit dem nativen MySQL-Treiber (mysqlnd) zu kompilieren ,

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

Von /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

Mithilfe dieser Optionen können eine oder mehrere PHP-MySQL-Erweiterungen hinzugefügt werden.
Wenn ein Wert nicht an diese Optionen übergeben wird oder wenn der Wert lautet mysqlnd, wird der native MySQL-Treiber verwendet.

Sithsu
quelle
Ihre Antwort war für mich so wertvoll. Darin las ich, dass ich BEIDE --with-mysqlund --with-mysqliOptionen verwenden musste, um den kompilierten Treiber richtig zu verwenden. Also habe ich diesmal meinen Konfigurationsbefehl erneut ausgeführt mit: `--with-mysql = / home / stephane / programme / mariadb / install \ --with-mysqli = / home / stephane / programme / mariadb / install / bin / mysql_config` und das Problem wurde gelöst. Es wird jetzt die richtige MariaDB-Client-Version verwendet.
Stephane
1

Ich habe den gleichen PHP-Krieg auf meiner WordPress-Seite ...

Err: Warnung: mysql_connect (): Header und Clientbibliothek stimmen nicht mit der Version überein. Header: 50547 Bibliothek: 50628 in /home/lhu/public_html/innovacarrentalschennai.com/wp-includes/wp-db.php in Zeile 1515

Ursache: Ich habe die Version wp 4.2 auf 4.5 aktualisiert (PHP und MySql stimmen nicht überein).

Ich habe wp-db.php in Zeile 1515 geändert

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

zu

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 );
}

Es ist ohne kriegerischen Fehler auf meiner WordPress-Seite

OpenWebWar
quelle
Nur zu Ihrer Information
Machavity
1

Wenn Sie Zugriff auf cpanel oder whm für Domain-Webhosting hatten ...

Gehen Sie in cPanel zur Registerkarte "Software und Dienste" >> und klicken Sie dann auf "PHP-Version auswählen" >> stellen Sie die gewünschte Version von PHP ein ...

Warnung: mysql_connect (): Nicht übereinstimmende Header und Clientbibliothek stimmen nicht überein.  Header: 50547 Bibliothek: 50628 in chennaitechnologies.com

Z.B. Aktuelle PHP-Version:

PHP-Version [5.2] (Liste der verfügbaren PHP-Versionen 5.2, 5.3, 5.4, 5.5, 5.6)

Warnung: Das Ändern von PHP-Modulen und PHP-Optionen über PHP Selector für die native PHP-Version ist nicht möglich

Ich habe die PHP-Version 5.6 ausgewählt, nachdem dieser Fehler auf meiner WordPress-Blog-Site behoben wurde ...

OpenWebWar
quelle
1
Warning: mysqli::mysqli(): Headers and client library minor version mismatch.
Headers:50547 Library:100026

Ich habe den obigen Fehler behoben, indem ich meinen Apache neu erstellt habe:

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
quelle
0

Ich habe diese Probleme, wenn ich Percona / MySQL 5.6 verwende und der PHP-Treiber mit 5.5 kompiliert wurde und für einige Apps PHP5-MySQL erforderlich ist. Daher schreibe ich ein Skript, um die Treiber neu zu erstellen.

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

Felipe Buccioni
quelle
0

Für WHM und cPanel müssen einige Versionen explizit festlegen, dass mysqli erstellt wird.

Unter Verwendung von WHM musste unter CENTOS 6.9 xen pv [dc] v68.0.27 Apache / PHP neu erstellt werden, indem alle Optionen überprüft und mysqli zum Erstellen ausgewählt wurden. Standardmäßig wurde das veraltete MySQL erstellt. Jetzt sind die Abschreibungsmeldungen verschwunden und eine ist bereit für zukünftige MySQL-Upgrades.

Bob P.
quelle
0

Ich bin auf centos7 auf dasselbe Problem gestoßen. Das Entfernen von php-mysql und das Installieren von php-mysqlnd haben das Problem behoben. Vielen Dank an Carlos Buenosvinos Zamora für Ihren Vorschlag.

Hier sind meine Befehle für centos7, nur für den Fall, dass dies für jedermann hilfreich sein kann, da die meisten Antworten hier auf Debian / Ubuntu basieren.

So finden Sie das installierte PHP-MySQL-Paket

yum list installed | grep mysql

So entfernen Sie das installierte PHP-MySQL-Paket

yum remove php55w-mysql.x86_64

So installieren Sie php-mysqlnd

yum install php-mysqlnd.x86_64
Agent 7
quelle
-1

Das Ändern der PHP-Version von 5.6 auf 5.5 wurde behoben .

Sie müssen zu Systemsteuerung> CGI-Skript gehen und dort die PHP-Version ändern.

Hammad Khan
quelle
Wir alle versuchen, auf die neueste Version zu kommen, ohne in Versionen zurück zu gehen.
Karmafunk