Door
Aart LT
op 20-02-2022 19:37
gewijzigd op 20-02-2022 22:38
5.589 views
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.
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 ?
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.)
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.
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.
// 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();
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.