• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

Headers and Client library minor version mismatch - mysqli / PHP Error

freekiller

NGBler

Registriert
17 Nov. 2015
Beiträge
43
Ort
Schweiz
Hallo zusammen,

ich habe folgenden Fehler:
error.png

Es handelt sich um ein Script welches in Kombination mit einem Onlineshop funktionieren sollte.

Wie kam es zu diesem Fehler? Zu beginn klappte alles wunderbar, bis der Shop ein Problem mit der SQL Datenbank hatte. Um den Fehler zu beheben habe ich als erstes meinen Dedicated Server von Apache auf Ngnix gewechslet und versucht die .htaccess config von diesem Script in die Nginx Config zu übertragen. Weiter habe ich die MySQL Datenbank auf die Version 5.6 upgegradet (welche nicht mehr einen Downgrade verträgt ohne dass die Datenbank gelöscht wird). Als alles nichts gebracht hat, habe ich wieder Apache (läuft übrigens mit dem kompletten LAMP) drauf gehauen und Nginx entfernt, da ich davon ausgegangen bin, dass die .htaccess Datei welche in der Config von Nginx mutiert eingetragen wurde nicht funktionierte. Irgendwann habe ich den Shop wieder mit der kompletten SQL Datenbank hinbekommen. Als ich jedoch das zuvor funktionierende, externe Zusatzscript aufrufen wollte, kam die oben erwähnte Meldung. Da ich zwischendurch auch die PHP Version von 7.0 auf 7.1 und 5.6 geswitch habe, ging ich davon aus, dass es mit einer Version funktionieren sollte. Dies ist jedoch nicht der Fall. (Aktuell läuft PHP7.0). Ich vermute das der Upgrade der SQL Datenbank diesen Fehler verursacht. Natürlich habe ich auch den php5-mysqlnd Driver installiert welcher bei MySQL 5.6 benötigt wird - ohne erfolg.

Was habe ich noch für Optionen um den Fehler zu beheben?

Herzliche Dank für die Tipps.
 

sia

gesperrt

Registriert
26 März 2015
Beiträge
5.931
Ort
FFM (NSFW)
Meistens ist das ein Leerzeichen vor dem Beginn des PHP-Scripts.

Welchen Editor hast du verwendet?

Warum benutzt du oracle-mysql und nicht MariaDB?

EDIT: Achso, klar, die php5-mysql-Version ist falsch. Das sieht ziemlich kaputt konfiguriert aus. Schau dir doch noch mal die Anforderungen der Software selbst an und bringe ein "frisches" System in diesen Zustand.
 

freekiller

NGBler

Registriert
17 Nov. 2015
Beiträge
43
Ort
Schweiz
  • Thread Starter Thread Starter
  • #3
Das mit dem Leerzeichen habe ich auch geprüft aber wäre auch komisch gewesen, da das Script selbst nicht verändert wurde. MariaDB hatte ich auch kurz getestet mit dem selben Ergebnis.

--- [2017-05-24 21:36 CEST] Automatisch zusammengeführter Beitrag ---

Ja der Punkt ist, die externe Software steht in direkten Zusammenhang mit dem Shopsystem und nutzt auch dessen Datenbank. Deshalb hat das Script keine separaten Spezifikationen / Anforderungen ausser die Shopversion welche übereinstimmt. Da der Shop einwandfrei funktioniert und mir der Server Error Log keine Hinweise liefert weiss ich echt nicht weiter. Das Script habe ich nochmals mit den Originaldateien hochgeladen ohne Erfolg. Ich vermute noch immer dass es unter Umständen mit dem Upgrade auf MySQL 5.6 in Zusammenhang steht was aber der Shop ohne Fehler annimmt nur das externe Script nicht mehr.

Nachtrag aktuell ist noch: MariaDB 10.1 drauf.
 
Zuletzt bearbeitet:

sia

gesperrt

Registriert
26 März 2015
Beiträge
5.931
Ort
FFM (NSFW)
was steht denn in der mysqli/mysqli_driver.php in/um Zeile 76 herum?

Schau mal in die Scripts mit den Zeilennummern.

Ich habe das Gefühl, dass das Script nicht versions-agnostisch geschrieben wurde sondern sich auf oracle-mysql einschießt.
 

freekiller

NGBler

Registriert
17 Nov. 2015
Beiträge
43
Ort
Schweiz
  • Thread Starter Thread Starter
  • #5
[src=php]<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* CodeIgniter
*
* An open source application development framework for PHP 5.1.6 or newer
*
* @package CodeIgniter
* @author ExpressionEngine Dev Team
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
* @license http://codeigniter.com/user_guide/license.html
* @link http://codeigniter.com
* @since Version 1.0
* @filesource
*/

// ------------------------------------------------------------------------

/**
* MySQLi Database Adapter Class - MySQLi only works with PHP 5
*
* Note: _DB is an extender class that the app controller
* creates dynamically based on whether the active record
* class is being used or not.
*
* @package CodeIgniter
* @subpackage Drivers
* @category Database
* @author ExpressionEngine Dev Team
* @link http://codeigniter.com/user_guide/database/
*/
class CI_DB_mysqli_driver extends CI_DB {

var $dbdriver = 'mysqli';

// The character used for escaping
var $_escape_char = '`';

// clause and character used for LIKE escape sequences - not used in MySQL
var $_like_escape_str = '';
var $_like_escape_chr = '';

/**
* The syntax to count rows is slightly different across different
* database engines, so this string appears in each driver and is
* used for the count_all() and count_all_results() functions.
*/
var $_count_string = "SELECT COUNT(*) AS ";
var $_random_keyword = ' RAND()'; // database specific random keyword

/**
* Whether to use the MySQL "delete hack" which allows the number
* of affected rows to be shown. Uses a preg_replace when enabled,
* adding a bit more processing to all queries.
*/
var $delete_hack = TRUE;

// whether SET NAMES must be used to set the character set
var $use_set_names;

// --------------------------------------------------------------------

/**
* Non-persistent database connection
*
* @access private called by the base class
* @return resource
*/
function db_connect()
{
if ($this->port != '')
{
return mysqli_connect($this->hostname, $this->username, $this->password, $this->database, $this->port);
}
else
{
return mysqli_connect($this->hostname, $this->username, $this->password, $this->database);
}

}

// --------------------------------------------------------------------

/**
* Persistent database connection
*
* @access private called by the base class
* @return resource
*/
function db_pconnect()
{
return $this->db_connect();
}

// --------------------------------------------------------------------

/**
* Reconnect
*
* Keep / reestablish the db connection if no queries have been
* sent for a length of time exceeding the server's idle timeout
*
* @access public
* @return void
*/
function reconnect()
{
if (mysqli_ping($this->conn_id) === FALSE)
{
$this->conn_id = FALSE;
}
}

// --------------------------------------------------------------------

/**
* Select the database
*
* @access private called by the base class
* @return resource
*/
function db_select()
{
return @mysqli_select_db($this->conn_id, $this->database);
}

// --------------------------------------------------------------------

/**
* Set client character set
*
* @access private
* @param string
* @param string
* @return resource
*/
function _db_set_charset($charset, $collation)
{
if ( ! isset($this->use_set_names))
{
// mysqli_set_charset() requires MySQL >= 5.0.7, use SET NAMES as fallback
$this->use_set_names = (version_compare(mysqli_get_server_info($this->conn_id), '5.0.7', '>=')) ? FALSE : TRUE;
}

if ($this->use_set_names === TRUE)
{
return @mysqli_query($this->conn_id, "SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'");
}
else
{
return @mysqli_set_charset($this->conn_id, $charset);
}
}

// --------------------------------------------------------------------

/**
* Version number query string
*
* @access public
* @return string
*/
function _version()
{
return "SELECT version() AS ver";
}

// --------------------------------------------------------------------

/**
* Execute the query
*
* @access private called by the base class
* @param string an SQL query
* @return resource
*/
function _execute($sql)
{
$sql = $this->_prep_query($sql);
$result = @mysqli_query($this->conn_id, $sql);
return $result;
}

// --------------------------------------------------------------------

/**
* Prep the query
*
* If needed, each database adapter can prep the query string
*
* @access private called by execute()
* @param string an SQL query
* @return string
*/
function _prep_query($sql)
{
// "DELETE FROM TABLE" returns 0 affected rows This hack modifies
// the query so that it returns the number of affected rows
if ($this->delete_hack === TRUE)
{
if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))
{
$sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql);
}
}

return $sql;
}

// --------------------------------------------------------------------

/**
* Begin Transaction
*
* @access public
* @return bool
*/
function trans_begin($test_mode = FALSE)
{
if ( ! $this->trans_enabled)
{
return TRUE;
}

// When transactions are nested we only begin/commit/rollback the outermost ones
if ($this->_trans_depth > 0)
{
return TRUE;
}

// Reset the transaction failure flag.
// If the $test_mode flag is set to TRUE transactions will be rolled back
// even if the queries produce a successful result.
$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;

$this->simple_query('SET AUTOCOMMIT=0');
$this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK
return TRUE;
}

// --------------------------------------------------------------------

/**
* Commit Transaction
*
* @access public
* @return bool
*/
function trans_commit()
{
if ( ! $this->trans_enabled)
{
return TRUE;
}

// When transactions are nested we only begin/commit/rollback the outermost ones
if ($this->_trans_depth > 0)
{
return TRUE;
}

$this->simple_query('COMMIT');
$this->simple_query('SET AUTOCOMMIT=1');
return TRUE;
}

// --------------------------------------------------------------------

/**
* Rollback Transaction
*
* @access public
* @return bool
*/
function trans_rollback()
{
if ( ! $this->trans_enabled)
{
return TRUE;
}

// When transactions are nested we only begin/commit/rollback the outermost ones
if ($this->_trans_depth > 0)
{
return TRUE;
}

$this->simple_query('ROLLBACK');
$this->simple_query('SET AUTOCOMMIT=1');
return TRUE;
}

// --------------------------------------------------------------------

/**
* Escape String
*
* @access public
* @param string
* @param bool whether or not the string will be used in a LIKE condition
* @return string
*/
function escape_str($str, $like = FALSE)
{
if (is_array($str))
{
foreach ($str as $key => $val)
{
$str[$key] = $this->escape_str($val, $like);
}

return $str;
}

if (function_exists('mysqli_real_escape_string') AND is_object($this->conn_id))
{
$str = mysqli_real_escape_string($this->conn_id, $str);
}
/*elseif (function_exists('mysql_escape_string'))
{
$str = mysql_escape_string($str);
}*/
else
{
$str = addslashes($str);
}

// escape LIKE condition wildcards
if ($like === TRUE)
{
$str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
}

return $str;
}

// --------------------------------------------------------------------

/**
* Affected Rows
*
* @access public
* @return integer
*/
function affected_rows()
{
return @mysqli_affected_rows($this->conn_id);
}

// --------------------------------------------------------------------

/**
* Insert ID
*
* @access public
* @return integer
*/
function insert_id()
{
return @mysqli_insert_id($this->conn_id);
}

// --------------------------------------------------------------------

/**
* "Count All" query
*
* Generates a platform-specific query string that counts all records in
* the specified database
*
* @access public
* @param string
* @return string
*/
function count_all($table = '')
{
if ($table == '')
{
return 0;
}

$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));

if ($query->num_rows() == 0)
{
return 0;
}

$row = $query->row();
$this->_reset_select();
return (int) $row->numrows;
}

// --------------------------------------------------------------------

/**
* List table query
*
* Generates a platform-specific query string so that the table names can be fetched
*
* @access private
* @param boolean
* @return string
*/
function _list_tables($prefix_limit = FALSE)
{
$sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char;

if ($prefix_limit !== FALSE AND $this->dbprefix != '')
{
$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%'";
}

return $sql;
}

// --------------------------------------------------------------------

/**
* Show column query
*
* Generates a platform-specific query string so that the column names can be fetched
*
* @access public
* @param string the table name
* @return string
*/
function _list_columns($table = '')
{
return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE);
}

// --------------------------------------------------------------------

/**
* Field data query
*
* Generates a platform-specific query so that the column data can be retrieved
*
* @access public
* @param string the table name
* @return object
*/
function _field_data($table)
{
return "DESCRIBE ".$table;
}

// --------------------------------------------------------------------

/**
* The error message string
*
* @access private
* @return string
*/
function _error_message()
{
return mysqli_error($this->conn_id);
}

// --------------------------------------------------------------------

/**
* The error message number
*
* @access private
* @return integer
*/
function _error_number()
{
return mysqli_errno($this->conn_id);
}

// --------------------------------------------------------------------

/**
* Escape the SQL Identifiers
*
* This function escapes column and table names
*
* @access private
* @param string
* @return string
*/
function _escape_identifiers($item)
{
if ($this->_escape_char == '')
{
return $item;
}

foreach ($this->_reserved_identifiers as $id)
{
if (strpos($item, '.'.$id) !== FALSE)
{
$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);

// remove duplicates if the user already included the escape
return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
}
}

if (strpos($item, '.') !== FALSE)
{
$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;
}
else
{
$str = $this->_escape_char.$item.$this->_escape_char;
}

// remove duplicates if the user already included the escape
return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
}

// --------------------------------------------------------------------

/**
* From Tables
*
* This function implicitly groups FROM tables so there is no confusion
* about operator precedence in harmony with SQL standards
*
* @access public
* @param type
* @return type
*/
function _from_tables($tables)
{
if ( ! is_array($tables))
{
$tables = array($tables);
}

return '('.implode(', ', $tables).')';
}

// --------------------------------------------------------------------

/**
* Insert statement
*
* Generates a platform-specific insert string from the supplied data
*
* @access public
* @param string the table name
* @param array the insert keys
* @param array the insert values
* @return string
*/
function _insert($table, $keys, $values)
{
return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
}

// --------------------------------------------------------------------

/**
* Insert_batch statement
*
* Generates a platform-specific insert string from the supplied data
*
* @access public
* @param string the table name
* @param array the insert keys
* @param array the insert values
* @return string
*/
function _insert_batch($table, $keys, $values)
{
return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values);
}

// --------------------------------------------------------------------


/**
* Replace statement
*
* Generates a platform-specific replace string from the supplied data
*
* @access public
* @param string the table name
* @param array the insert keys
* @param array the insert values
* @return string
*/
function _replace($table, $keys, $values)
{
return "REPLACE INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
}

// --------------------------------------------------------------------

/**
* Update statement
*
* Generates a platform-specific update string from the supplied data
*
* @access public
* @param string the table name
* @param array the update data
* @param array the where clause
* @param array the orderby clause
* @param array the limit clause
* @return string
*/
function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
{
foreach ($values as $key => $val)
{
$valstr[] = $key." = ".$val;
}

$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;

$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';

$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);

$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';

$sql .= $orderby.$limit;

return $sql;
}

// --------------------------------------------------------------------

/**
* Update_Batch statement
*
* Generates a platform-specific batch update string from the supplied data
*
* @access public
* @param string the table name
* @param array the update data
* @param array the where clause
* @return string
*/
function _update_batch($table, $values, $index, $where = NULL)
{
$ids = array();
$where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : '';

foreach ($values as $key => $val)
{
$ids[] = $val[$index];

foreach (array_keys($val) as $field)
{
if ($field != $index)
{
$final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field];
}
}
}

$sql = "UPDATE ".$table." SET ";
$cases = '';

foreach ($final as $k => $v)
{
$cases .= $k.' = CASE '."\n";
foreach ($v as $row)
{
$cases .= $row."\n";
}

$cases .= 'ELSE '.$k.' END, ';
}

$sql .= substr($cases, 0, -2);

$sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')';

return $sql;
}

// --------------------------------------------------------------------

/**
* Truncate statement
*
* Generates a platform-specific truncate string from the supplied data
* If the database does not support the truncate() command
* This function maps to "DELETE FROM table"
*
* @access public
* @param string the table name
* @return string
*/
function _truncate($table)
{
return "TRUNCATE ".$table;
}

// --------------------------------------------------------------------

/**
* Delete statement
*
* Generates a platform-specific delete string from the supplied data
*
* @access public
* @param string the table name
* @param array the where clause
* @param string the limit clause
* @return string
*/
function _delete($table, $where = array(), $like = array(), $limit = FALSE)
{
$conditions = '';

if (count($where) > 0 OR count($like) > 0)
{
$conditions = "\nWHERE ";
$conditions .= implode("\n", $this->ar_where);

if (count($where) > 0 && count($like) > 0)
{
$conditions .= " AND ";
}
$conditions .= implode("\n", $like);
}

$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;

return "DELETE FROM ".$table.$conditions.$limit;
}

// --------------------------------------------------------------------

/**
* Limit string
*
* Generates a platform-specific LIMIT clause
*
* @access public
* @param string the sql query string
* @param integer the number of rows to limit the query to
* @param integer the offset value
* @return string
*/
function _limit($sql, $limit, $offset)
{
$sql .= "LIMIT ".$limit;

if ($offset > 0)
{
$sql .= " OFFSET ".$offset;
}

return $sql;
}

// --------------------------------------------------------------------

/**
* Close DB Connection
*
* @access public
* @param resource
* @return void
*/
function _close($conn_id)
{
@mysqli_close($conn_id);
}


}


/* End of file mysqli_driver.php */
/* Location: ./system/database/drivers/mysqli/mysqli_driver.php */[/src]
 
Zuletzt bearbeitet:

X-Coder

Aktiver NGBler

Registriert
14 Juli 2013
Beiträge
149
Das Problem tritt auf, weil die mysql lib nicht die gleiche Version hat, welche auch beim compilieren von PHP verwendet wurde.

Du kannst entweder das php error_reporting so einstellen dass Warnings nicht angezeigt werden, oder eine mysqlnd-Version installieren die auch zu deinem PHP passt. php5-mysqlnd ist wie der Name schon sagt für php 5 und nicht für 7, du brauchst also ein php7-mysqlnd.

Hiermit kannst du prüfen, ob mysqlnd auch richtig geladen wurde: [src=php]<?php phpinfo(); ?>[/src]
 

drfuture

Zeitreisender
Teammitglied

Registriert
14 Juli 2013
Beiträge
8.730
Ort
in der Zukunft
hmm weil es beim Abruf von Daten in der Datenbank Fehler gibt installierst du mal nginx statt Apache?
Du hast MariaDB und oracle Mysql laufen?

_sicher_ das du weißt was du da tust?
Nicht böse sein das soll nicht gehässig klingen - nur ist und bleibt so ein Server kein Spielzeug, unabhängig davon das du natürlich gerne Hilfe bekommst.

wie x-coder schon sagte muss das php-mysqld modul zur Version der ausgeführten php-Version passen und weniger zur Version von mysqld
 
Oben