DB-Zugriff - eigenes Script - mysql - mysqli

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
uwe.ha
Mitglied
Beiträge: 712
Registriert: 18.05.2001 02:00

DB-Zugriff - eigenes Script - mysql - mysqli

Beitragvon uwe.ha » 22.04.2017 09:25

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
Uwe

Benutzeravatar
gn#36
Administrator
Administrator
Beiträge: 9133
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

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

Beitragvon gn#36 » 22.04.2017 20:31

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.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.

uwe.ha
Mitglied
Beiträge: 712
Registriert: 18.05.2001 02:00

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

Beitragvon uwe.ha » 22.04.2017 22:40

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!
Uwe

Benutzeravatar
vfrblue
Junior Supporter
Beiträge: 647
Registriert: 22.11.2016 18:46
Wohnort: Niedersachsen-West
Kontaktdaten:

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

Beitragvon vfrblue » 22.04.2017 23:30

Vielleicht hilft dir das weiter:
Link1
Link2
Gruß Hermann

Forum VFR-OC
User: phpbbtest PW: vfroc

Benutzeravatar
gn#36
Administrator
Administrator
Beiträge: 9133
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

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

Beitragvon gn#36 » 23.04.2017 00:21

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.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.

uwe.ha
Mitglied
Beiträge: 712
Registriert: 18.05.2001 02:00

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

Beitragvon uwe.ha » 23.04.2017 22:12

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!
Uwe

Benutzeravatar
gn#36
Administrator
Administrator
Beiträge: 9133
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

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

Beitragvon gn#36 » 25.04.2017 10:38

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.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.

uwe.ha
Mitglied
Beiträge: 712
Registriert: 18.05.2001 02:00

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

Beitragvon uwe.ha » 25.04.2017 14:08

Ok, DANKE!
Uwe

uwe.ha
Mitglied
Beiträge: 712
Registriert: 18.05.2001 02:00

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

Beitragvon uwe.ha » 25.04.2017 17:09

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!
Uwe

Benutzeravatar
gn#36
Administrator
Administrator
Beiträge: 9133
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

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

Beitragvon gn#36 » 29.04.2017 09:01

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.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.


Zurück zu „Coding & Technik“