We hebben op de site een aantal onderwerpen die niet meer werken, https://www.vwltclub.nl/waar.php en http://www.vwltclub.nl/wiki/. Dit zou komen omdat het forum op PHP 7.0 werkt en deze onderwerpen op 5.6. Van een collega club uit Duitsland heb ik een stukje script gekregen om er tussen te plakken. Helaas het werkt niet. De uitleg heb ik vertaald.

Voor de kaart gebruik je hetzelfde programma als wij in het LT forum.
Dit programma werkt alleen tot PHP versie 5.6.
U kunt controleren welke PHP-versie op uw website draait.
Het werkt niet vanaf 7.0.
Als PHP5.6 nog beschikbaar is op uw website, kunt u het dwingen op 5.6 te draaien door een vermelding te maken in het .htaccess-bestand.

De invoer ziet er ongeveer zo uit:[/i]]FilesMatch \.php>
# Apache 2.4.10+ can proxy to unix socket
SetHandler "proxy:unix:/var/run/php/php5.6-fpm.sock|fcgi://localhost/"
</FilesMatch>>

En nu loop ik vast, plak ik de code ertussen, is het hele forum van slag.

Wie heeft een oplossing?
Alvast bedankt
Aart
Hmmmm .....
Dan moeten we verder debuggen:


 // Query absetzen
    function query($query) {
        $result = mysqli_query($this->link, $query);
var_dump($this->link);
var_dump($query);
        echo mysqli_error();
        return $result;
    }



Dan moet je toch wat gaan zien aan debug informatie.

Edit:
janus_landkaart hoort tussen quotes. Het is een string. Of geef hem net als je user en pass door via $this. Dat is een stuk netter.
Warning: Undefined property: sql::$link in /home/janus/domains/zonstraal.be/public_html/landkaart/inc/sql.class.php on line 22


Voor zover ik het snap gaat er iets fout met de verbinding met de database.
De inloggegeven kloppen wel, die heb ik met een ander script gecontroleerd.

class sql {

	// Verbindung zur Datenbank  herstellen
	function sql() {
		$this->host 	= DB_HOST;
		$this->db 	= DB_DATABASE;
		$this->user	= DB_USER;
		$this->pass 	= DB_PASSWORD;

		$this->link = mysqli_connect($this->host, $this->user, $this->pass, $this->janus_landkaart );
		if(!$this->link)
			return;
		register_shutdown_function( array( &$this, "close" ) );
	}
Ik neem aan dat je ook je code een beetje verkent, en niet rücksichtslos wat in je code staat te typen?
Want waar slaat dit op: $this->janus_landkaart ?


        $this->link = mysqli_connect($this->host, $this->user, $this->pass, $this->janus_landkaart );


Je hebt ook: $this->host, $this->user, $this->pass.
Dit zijn dus eigenschappen van je databaseverbinding. Met logisch nadenken, en het verkennen van je code, dan zie je ook $this->db staan. En je weet, neem ik aan, dat janus_landkaart geen eigenschap is, maar een waarde. Dus dan is dit het enige correcte. (Met andere woorden: Je hebt geen hostname die host heet, geen username die user heet en geen paswoord die pass heet, maar wel een database die janus_landkaart heet.)

Dit lijkt mij dus zinvoller.

        $this->link = mysqli_connect($this->host, $this->user, $this->pass, $this->db );


Dus, bekijk je code aandachtig, zoek logische verbanden. Daar heb je niet eens veel programmeer-ervaring voor nodig. Feitelijk is dit al het begin van programmeren.

Ik denk dat je met deze stap je script al werkend hebt.
Dat had ik ook al getest maar de error blijft hetzelfde.
Heb je de var_dump al toegevoegd? Ik zie daar nog niks van terug?

Als ik de code nog eens verbeter:


class sql {

    // Verbindung zur Datenbank  herstellen
    function __construct() {
        $this->host     = DB_HOST;
        $this->db     = DB_DATABASE;
        $this->user    = DB_USER;
        $this->pass     = DB_PASSWORD;

        $this->link = mysqli_connect($this->host, $this->user, $this->pass, $this->db);
        if(!$this->link)
            throw new Exception("Database connection error: ".mysqli_connect_error());
    } 


Dit is meer moderner PHP met een construct en een exception.
Als de connectie niet klopt, dan moet je een duidelijke foutmelding zien.

Werkt dit? En zo nee, wat zie je?

Ter informatie:
Ik heb die register_shutdown_function(...) eruit gehaald. Ik heb een vermoeden dat je daarmee de $this-variabelen (interne variabelen binnen je class) om zeep helpt als je connectie fout is. Ik zie geen reden waarom je dat zou willen. Die functie en het gebruik op deze manier ken ik niet zo goed, maar het lijkt mij geen beste afhandeling.

Toch ben ik benieuwd wat die hele class precies doet? Tot nu toe is dit hetzelfde wat PHP zelf al kan doen.

Edit:
mysqli_connect_error() gebruikt
Ik hen er nu een extra warning bij.
Warning: Undefined array key "ort" in /home/janus/domains/zonstraal.be/public_html/landkaart/inc/map.func.php on line 34
object(mysqli)#2 (18) { ["affected_rows"]=> int(83) ["client_info"]=> string(15) "10.3.32-MariaDB" ["client_version"]=> int(100332) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(4) ["host_info"]=> string(25) "Localhost via UNIX socket" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(23) "10.3.29-MariaDB-cll-lve" ["server_version"]=> int(100329) ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(406522110) ["warning_count"]=> int(0) } string(100) "SELECT u.name, g.lon, g.lat, g.ort FROM lms_user u LEFT JOIN lms_geodb g ON u.geoid = g.id WHERE 1 " 


Volledige meldingen kun je hier nog steeds zien:
https://www.zonstraal.be/landkaart/

Zo te zien is er dus (nu) een werkende connectie.
Dus dat probleem is er niet (meer).

Waar komt ort in map.func.php van lijn 34 vandaan?
mysqli_error() is nog ergens niet voorzien van je $this->link

Kan je anders de relevante scripts tonen op en rond die lijnen die in de error genoemd worden uit de genoemde bestanden?
// Einträge aus der Datenbank laden und nach Pixelkoordinaten gruppieren
function getPoints($id=0) {
	// Suche ?
	$q = "SELECT u.name, g.lon, g.lat, g.ort FROM ".TABLE_USER." u LEFT JOIN ".TABLE_GEODB."  g ON u.geoid = g.id WHERE 1 ";
	if($id) $q .="AND u.id = '".mysqli_real_escape_string($id)."' ";
	if($_GET['name']) $q .="AND u.name LIKE '%".mysqli_real_escape_string($_GET['name'])."%' ";
	if($_GET['plz']) $q .="AND g.plz LIKE '".mysqli_real_escape_string($_GET['plz'])."%' ";
	if($_GET['ort']) $q .="AND g.ort LIKE '".mysqli_real_escape_string($_GET['ort'])."%' ";
	
	global $db;
	$res = $db->query($q);
	$p=array();


De regels 27 tot 38 in map.function.php

// Karte zeichnen ( standard Aktion )
else {
	require_once('inc/map.func.php');
	echo '<div id="map"><div id="inf"></div>';
	$p=getPoints((int)$_GET['m']);
	generatePoints($p);
	echo '</div>';
}

120 tot 127 van de index.php
Over de errors: Warning: Undefined array key .............

Kan je $q echo'en op de lege lijn 9?

echo $q;

Welke query zie je dan bij uitvoer van je script?
Ik heb een vermoeden dat je de parameters: name, plz en ort niet in je URL benoemt.

Je zult met isset() moeten controleren of ze bestaan. Bijv:
if(isset($_GET['plz'])) (en dat ook voor name en ort)

Ook moet je net als bij mysqli_query de mysqli_real_escape_string(...) functie voorzien van je link naar je connectie. In dit geval $db->link (geen this, dat gebruik je enkel in classes)
---------------------------
Over de error: mysqli_error() expects exactly 1 argument, 0 given
In je sql.class.php on line 28 mis je bij mysqli_error() een $this->link in die functie.
---------------------------
En over je index.php met de error: PHP_AUTH_USER
Waar komt dat in je index.php voor op/rond lijn 30?

Als je dat goed hebt, moet het goed werken.
Die var_dump()'s mag je dan wel weghalen en moet je een error-schone site hebben.
Je bent nu bezig om een niet-eigen script aan te passen zodat het met een veel nieuwere versie van PHP gaat werken.
Naast dat de mysql-functies intussen vervangen zijn door mysqli, heb je ook te maken met nog een rijtje andere functies die in de loop van de tijd uit php gehaald zijn. Bijvoorbeeld de regexfuncties.

Maar ook zaken als dat een metho met dezelfde naam als een class de functie van __construct() heeft.

Je zult aan de lopende band tegen die fouten aan gaan lopen.
Daarnaast heb je de melding "undefined array key" (die ik als "undefined index" zou verwachten.
Dat duidt erop dat de code kennelijk eerst onder een laag level van error-reporting had gewerkt.

Het lijkt mij het verstandigst om te kijken op https://www.phpbb.com/ en daar een recentere versie te downloaden om je scripts daarmee te updaten.
Dan doe je niet al het werk opnieuw, en kun je ook bijblijven als over 3 maanden een nieuwe versie uitkomt.
Als je er nu zelf in gaat klieren, is straks niets meer compatibel.

Reageren