Seite 1 von 2

DB-Zugriff - eigenes Script - mysql - mysqli

Verfasst: 22.04.2017 09:25
von uwe.ha
Hallo zusammen,

laut https://www.phpbb.de/kb/phpBB32_upgrade_from_31 soll man beim Update auf 3.2 - wegen PHP 7 - in der config.php das

Code: Alles auswählen

$dbms = 'mysql';
ersetzen durch

Code: Alles auswählen

$dbms = 'phpbb\db\driver\mysqli';
.

Das würde für das Forum selbst soweit auch funktionieren. Allerdings habe ich ein php-script um mir auf den redaktionellen Seiten (außerhalb /phpBB - Ordner) die "aktuellen Themen" anzeigen zu lassen. Diese "aktuelle-themen.inc.pgp" liegt im Ordner phpBB/.
Wenn ich in der config.php auf mysqli umstelle, kommt bei den "aktuellen Themen" eine Fehlermeldung:

Code: Alles auswählen

[phpBB Debug] PHP Warning: in file [ROOT]/aktuelle-themen.inc.php on line 40: mysql_query(): Access denied for user ''@'localhost' (using password: NO)
[phpBB Debug] PHP Warning: in file [ROOT]/aktuelle-themen.inc.php on line 40: mysql_query(): A link to the server could not be established
SQL Statement Error: Access denied for user ''@'localhost' (using password: NO)
Die Zeile 40 lautet:

Code: Alles auswählen

$result = mysql_query($sql);
Die ganze Datei sieht so aus:

Code: Alles auswählen

<div>

 <?php
// ############         Edit below         ########################################
$topic_length = '30';   // length of topic title
$topic_limit = '10';   // limit of displayed topics
$special_forums = '0';   // specify forums ('0' = no; '1' = yes)
$forum_ids = '';      // IDs of forums; separate them with a comma

//$config_path = '/phpBB/';   // path to config.php
//$root_path = 'http://www.meine-domain.de/phpBB/';      // link path

// ############         Edit above         #######################################

define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './phpBB/';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include_once($phpbb_root_path . 'common.' . $phpEx);

//$path = dirname(__FILE__);
//include_once($path.$config_path .'config.php');
//mysql_connect($dbhost, $dbuser, $dbpasswd) OR die('Unable to select server.');
//mysql_select_db($dbname) OR die('Unable to select database.');

// ############## output ##############

echo '<table border="0" cellpadding="0" cellspacing="0" style="width: 100%">
         <tr>
           <td>
		   <h3 style="background-color:#00aa00; color:#ffffff" ><img src="/bilder/ffffff.gif" alt="fff">&nbsp; FORUM ... aktuelle Themen   &raquo;</h3><br>
           </td>
         </tr>';
// ############## output ##############

$where_forums = ( $special_forums == '0' ) ? '' : 't.forum_id NOT IN ('. $forum_ids .') AND ';
$sql = "SELECT t.*, f.forum_id, f.forum_name, p2.post_time
   FROM ". $table_prefix ."topics t, ". $table_prefix ."forums f, ". $table_prefix ."posts p, ". $table_prefix ."posts p2, ". $table_prefix ."users u2
   WHERE $where_forums f.forum_id = t.forum_id AND p.post_id = t.topic_first_post_id AND p2.post_id = t.topic_last_post_id AND u2.user_id = p2.poster_id
   ORDER BY t.topic_last_post_id DESC LIMIT $topic_limit";
$result = mysql_query($sql);
if( !$result )
{
   die('SQL Statement Error: '. mysql_error());
   exit();
}

$line = array();
while( $row = mysql_fetch_array($result) )
{
   $line[] = $row;
}

for( $i = 0; $i < count($line); $i++ )
{
   $forum_id = $line[$i]['forum_id'];
   $forum_url = $root_path .'phpBB/viewforum.php?f='. $forum_id;
   $topic_id = $line[$i]['topic_id'];
   $topic_url = $root_path .'phpBB/viewtopic.php?t='. $topic_id;

   $topic_title = ( strlen($line[$i]['topic_title']) < $topic_length ) ? $line[$i]['topic_title'] : substr(stripslashes($line[$i]['topic_title']), 0, $topic_length) .'...';

   $last_url = '<a href="'. $root_path .'phpBB/viewtopic.php?p='. $line[$i]['topic_last_post_id'] .'#'. $line[$i]['topic_last_post_id'] .'" target="_blank">'. $last_author .'</a>';

   // ############## output ##############
   echo '<tr>

            <td><p><img src="/phpBB/styles/prosilver/theme/images/icon_online.gif" alt="latest">&nbsp;&nbsp;<strong><a href="'. $topic_url .'">'. $topic_title .'</a></strong></p></td>
			</tr><tr class="aktuelle-themen_mobile-hide">
 			<td><p class="klein" style="color:#888">aus: <a href="'. $forum_url .'" style="color:#888">'. $line[$i]['forum_name'] .'</a></td>
        </tr>
<tr><td>&nbsp;</td></tr>';

   // ############## output ##############
}

echo '</table>';
mysql_close();
?>

</div>
Weiß jemand, wo das Problem liegt, bzw. was ich ändern muss, damit es auch mit mysqli funktioniert?

VIELEN DANK!
Uwe

Re: DB-Zugriff - eigenes Script - mysql - mysqli

Verfasst: 22.04.2017 20:31
von gn#36
Tausche die mysql_xxx Aufrufe einfach aus gegen mysqli_xxx. Musst du sowieso bevor du auf PHP 7 umschaltest, denn den mysql Treiber gibt es in PHP 7 nicht mehr. Der Grund warum der Zugriff nicht mehr funktioniert ist, weil du, wenn du den neuen Treiber nutzt, mit dem alten nicht mehr bei der Datenbank angemeldet bist.

Alternativ und besser stellst du um auf das phpBB DBAL. Falls du dann mal irgendwann entscheiden solltest die phpBB Datenbank z.B. von mysql auf postgres oder was anderes umzustellen funktionieren deine Skripte trotzdem.

Hierfür:
  • mysql_query durch $db->sql_query ersetzen
  • mysql_fetch_assoc durch $db->sql_fetchrow ersetzen
  • mysql_fetch_array durch $db->sql_fetchrow ersetzen (könnte ein paar Probleme verursachen, je nach Benutzung)
  • mysql_close, mysql_connect und mysql_select_db weg (falls du dich mit einer anderen DB verbindest musst du ein weiteres Objekt für die Verbindung erstellen und das für die Abfragen verwenden, in dem Fall dann statt $db z.B. $my_special_db erstellen (hierbei werden als Parameter die Verbindungsdaten gebraucht) und dann in den Abfragen oben statt $db einfach $my_special_db verwenden.
Egal was von beidem du machst: Du solltest auch noch mal nachsehen, ob dein Skript mit der neuen Datenbank zusammenpasst und es nicht einfach blind weiterverwenden.

Re: DB-Zugriff - eigenes Script - mysql - mysqli

Verfasst: 22.04.2017 22:40
von uwe.ha
DANKE gn#36!

ich habe es mal mit der (für mich) einfacheren Variante:
gn#36 hat geschrieben:Tausche die mysql_xxx Aufrufe einfach aus gegen mysqli_xxx.
probiert.

Nun kommt folgende Fehlermeldung:

Code: Alles auswählen

[phpBB Debug] PHP Warning: in file [ROOT]/aktuelle-themen.inc.php on line 40: mysqli_query() expects at least 2 parameters, 1 given
[phpBB Debug] PHP Warning: in file [ROOT]/aktuelle-themen.inc.php on line 43: mysqli_error() expects exactly 1 parameter, 0 given
SQL Statement Error: 
line 40:

Code: Alles auswählen

$result = mysqli_query($sql);
line 43:

Code: Alles auswählen

   die('SQL Statement Error: '. mysqli_error());
Was ist falsch bzw. fehlt?

DANKE!

Re: DB-Zugriff - eigenes Script - mysql - mysqli

Verfasst: 22.04.2017 23:30
von vfrblue
Vielleicht hilft dir das weiter:
Link1
Link2

Re: DB-Zugriff - eigenes Script - mysql - mysqli

Verfasst: 23.04.2017 00:21
von gn#36
Hm, ich hätte wohl doch mal kurz schauen sollen, ob die Aufrufe kompatibel sind... mysql hat einen optionalen Verbindungsparameter, der ist bei mysqli nicht mehr optional sondern erforderlich. An den Parameter kommst du nur ziemlich blöd ran. Das abstrahiert in phpBB die Klasse für dich.

Nimm lieber die andere Variante, die braucht den Parameter nicht. Ansonsten kommst du nur ran, wenn du den phpBB core umbaust. Alternativ könntest du höchstens eine zweite Verbindung zur selben Datenbank aufbauen.

Re: DB-Zugriff - eigenes Script - mysql - mysqli

Verfasst: 23.04.2017 22:12
von uwe.ha
gn#36 hat geschrieben:Nimm lieber die andere Variante,
FUNKTIONIERT :D ... DANKE!
War ja doch ganz einfach ;-)

Abschließende Frage:
Was ist mit der Zeile

Code: Alles auswählen

   die('SQL Statement Error: '. mysql_error());
?
Soll/kann "mysql_error" so bleiben, oder soll ich da was ersetzen?

Nochmal VIELEN DANK!

Re: DB-Zugriff - eigenes Script - mysql - mysqli

Verfasst: 25.04.2017 10:38
von gn#36
Nein das kann nicht so bleiben, die Funktion mysql_error gibt's in php 7 nicht mehr. Aber die Zeile kannst du rauswerfen, da bei einem SQL Fehler phpBB selber die Ausführung abbricht und abhängig von den Debug Einstellungen eine detaillierte Fehlermeldung ausspuckt oder nicht.

Re: DB-Zugriff - eigenes Script - mysql - mysqli

Verfasst: 25.04.2017 14:08
von uwe.ha
Ok, DANKE!

Re: DB-Zugriff - eigenes Script - mysql - mysqli

Verfasst: 25.04.2017 17:09
von uwe.ha
Nochmal ... soll ich NUR die Zeile "die..." rauswerfen, oder ggf. noch was davor und danach:

Code: Alles auswählen

{
   die('SQL Statement Error: '. mysql_error());
   exit();
}
Nochwas:
Nachdem ich nun erfolgreich auf 3.2 upgedatet habe, will ich (bei all-inkl) auch von PHP 5.6 auf PHP 7 umstellen.
Soll ich PHP 7.0.14 wählen, oder gleich PHP 7.1.1?

DANKE!

Re: DB-Zugriff - eigenes Script - mysql - mysqli

Verfasst: 29.04.2017 09:01
von gn#36
Im Grunde kannst du den ganzen Block löschen, weil phpBB das selber macht - wenn die SQL Abfrage schief geht aus welchen Gründen auch immer, dann bricht phpBB die Ausführung ab, es sei denn du hast das der DB Klasse vorher anders mitgeteilt. Also kann dein kompletter Block weg.

phpBB 3.2 sollte PHP 7.1 kompatibel sein, daher spricht in meinen Augen nichts dagegen direkt auf 7.1 zu springen. Das gilt aber nicht zwingend für alle Erweiterungen. Da würde ich daher prüfen, ob du inkompatible Erweiterungen hast.