Hoi,

Loop tegen een probleem aan.
Kan vanuit een PHP pagina wel een verbinding leggen met de eigen SQL server, maar word er een query gedaan komt er geen resultaat.
Voer ik dezelfde query uit in phpmyadmin op de server dan krijg ik netjes resultaat.


<?php
	$link = mysqli_connect($dbhos,$dbgeb,$dbwaw) or die(mysqli_error());
        mysqli_select_db($link, $dbdba) or die(mysqli_error($link));
        $connect = mysqli_connect($dbhos,$dbgeb,$dbwaw) or die(mysqli_error());
        mysqli_set_charset($connect, 'utf8');
        if (mysqli_connect_errno())
	{
		printf("Connect failed: %s\n", mysqli_connect_error());
		exit();
	}
	else
	{
		printf("Connected to database<br>");
	}

	IF ($WDlng="ENG")
	{
		$query8="SELECT * FROM paginateksten WHERE Pagina = 'Over' AND Taal = 'ENG' ORDER BY Alinea";
	}
	ELSE
	{
		$query8="SELECT * FROM paginateksten WHERE Pagina = 'Over' AND Taal = 'NLD' ORDER BY Alinea";
	}
	
	IF ($result8 = mysqli_query($connect, $query8))
	{
		while ($row8 = mysqli_fetch_assoc($result8))
		{
			echo $row8['Tekst']."<br>";
		}
		mysqli_free_result($result8);
	}
	else
	{
		echo "No result in database<br>";
	}
?>


Is er een fout in mijn code?
Of toch in de setup van de server? (lijkt mij niet, ik krijg netjes de melding dat er een verbinding met de database is)

Alvast bedankt,

Marco

Zie je de <br> wel in de code staan? In dat geval zal het veld Tekst niet bestaan.
Een false bij mysqli_query betekent NIET dat er geen resultaten zijn, maar dat de mysqli_query niet gelukt is. Om te controleren of er resultaten zijn moet je met mysqli_num_rows controleren.

Oh ja, verder zijn genummerde queries niet echt aan te bevelen. Omschrijf liever wat ze doen. Vergissen is zo gedaan, vooral als je na vele weken je code weer eens uit gaat bouwen.
Ariën,

Dank voor je reactie.

Heb de tip van mysqli_num_rows overgenomen, deze gebruikte ik op andere plekken van de totale code wel, voor deze functie niet.
Ook de <br> tip is meegenomen, alhoewel deze in de code nooit problemen heeft gegeven.

Het nummeren van variablen en queries is iets dat ik heb overgehouden uit de begintijd van Basic en Pascal programmeren, denk niet dat het ooit slijt.... ;-)

Maar weet jij of de melding van een geslaagde verbinding met een database ook vals kan zijn?

Groetjes,

Marco
Ik heb nooit gezegd dat <br> problemen geeft? Je kan het gebruik ervan ook zien als troubleshoot functie, zodat je kan zien of de loop wordt doorlopen.

Nummeren van queries raad ik gewoon af, laat dat liever eruit slijten. ;-)
Weet jij straks uit je hoofd nog wat $query12 deed, terwijl $resultMembers duidelijk aangeeft wat er in zit (een result) met de Members.
IF ($WDlng="ENG")


= is een toekenning

== is een vergelijking

IF ($WDlng="ENG") evalueert tot
IF ("ENG")
en dat is equivalent aan
IF (true) dus die tak van het if-statement zal altijd worden gekozen
...en dat zijn echt van die dingen waar je overheen kijkt :X
Thomas,

Dank je wel, was op zich een ander punt, maar blij dat je me er op wees.

Inmiddels is het uitlezen van de DB ook in de totale PHP pagina gelukt, bleek in dit project het commando mysqli te worden gebruik, het weghalen van de i bleek de oplossing te zijn.

Ariën,

Jij ook nogmaals bedankt.

Groetjes,

Marco
Marco Apeldoorn op 20/02/2020 00:45:33

Inmiddels is het uitlezen van de DB ook in de totale PHP pagina gelukt, bleek in dit project het commando mysqli te worden gebruik, het weghalen van de i bleek de oplossing te zijn.

Heuh! Dan val je dus terug op de oude mysql_***() functies die infeite al uit de recente PHP-versies gesloopt zijn.

Anyway.... mysqli bestaat al héél lang. Dus zorg liever voor een goede oplossing met mysqli_functies of eventueel PDO.
Hoe luidt de huidige code dan? Het lijkt mij niet verstandig om de mysql_-functies nog te gebruiken want deze zijn al een lange tijd uit de mode en zijn in PHP7 in het geheel verdwenen.

Ik zie nu in het oorspronkelijke fragment dat je twee connecties en -methoden door elkaar gebruikt.

Ook is $query8 in grote lijnen hetzelfde in de verschillende varianten. Het enige deel wat verschilt is de taal. Je zou het if-statement dus ook kunnen beperken tot die taal, en uitgaan van een default waarde. Daarbij zou je een lijstje van toegestane talen kunnen bijhouden, zodat als deze lijst op een gegeven moment uitgebreid wordt, het aanpassen van deze functionaliteit een kwestie is van een elementje erbij prikken, in plaats van de code uitbreiden met (nog) een else-statement.

Dus zoiets:
<?php
$language = 'NLD'; // default
$allowedLanguages = array('NLD', 'ENG' /* et cetera */);

// controleer taal
if (in_array($WDlng, $allowedLanguages)) {
    $language = $WDlng;
}

// bouw query
$query =
    "SELECT *
    FROM paginateksten
    WHERE Pagina = 'Over'
    AND Taal = '".mysqli_real_escape_string($connection, $language)."'
    ORDER BY Alinea";

// et cetera
?>

Waar komt $WDlng overigens vandaan?

NB: het is een goede gewoonte om alle "DATA" delen in je query te ontdoen van enige speciale betekenis met real_escape_string() zodat deze DATA niet als SQL geïnterpreteerd kan worden.
Thomas en Ariën,

Inderdaad is dit een terug in de tijd naar PHP5, daar heb ik de site indertijd ook op geschreven, de persoon waar ik dit voor op heb gezet (en moest herstellen) wilde na wegvallen van hun vaste hosting bedrijf het zo snel mogelijk draaiend hebben om zo weinig downtijd te hebben.
De hostingserver draaide ook op PHP 5.6.40, daarom koos ik voor het opzetten van een eigen server die dezelfde versie draaide, ik hoopte dat het daardoor naadloos overgezet kon worden......
Waar ik alleen tegenaan liep waren een aantal storingen, blijkt (achteraf) ook dat iemand anders in de code had zitten pionieren, ook heel gezellig (NOT).

Nu dit draait ga ik voor haar een totaal nieuwe opzet maken op PHP7.

Het stukje waar ik naar citeerde ziet er nu zo uit:


<?php
function overons($connect, $WDlng, $dbhos, $dbdba, $dbgeb, $dbwaw, $WDcat, $sessie, $WDfok, $WDema, $mobile, $mobhgt, $mobwth, $mobhgd)
{
	echo "<tr><td align='center' valign='middle' colspan='2'>";
	
	IF ($WDlng === "NLD")
	{
		$query8 = "SELECT * FROM paginateksten WHERE Pagina = 'Over' AND Taal = 'NLD' ORDER BY Alinea";
	}
	ELSE
	{
		$query8 = "SELECT * FROM paginateksten WHERE Pagina = 'Over' AND Taal = 'ENG' ORDER BY Alinea";
	}
        $db = array (
                      'host' => $dbhos,
                      'user' => $dbgeb,
                      'pass' => $dbwaw,
                      'dbname' => $dbdba
                    );

                if(!mysql_connect($db['host'], $db['user'], $db['pass']))
                {
                      trigger_error('Fout bij verbinden: '.mysql_error());
                }
                elseif(!mysql_select_db($db['dbname']))
                {
                      trigger_error('Fout bij selecteren database: '.mysql_error());
                }
                else
                {
                $sql = "SET SESSION sql_mode = 'ANSI,ONLY_FULL_GROUP_BY'";
                if(!mysql_query($sql))
                {
                      trigger_error('MySQL in ANSI niet mogelijk');
                }
                }
        $connect = mysql_connect($db['host'], $db['user'], $db['pass']);
        $link = mysql_connect($db['host'], $db['user'], $db['pass']);

	IF ($result8 = mysql_query($query8))
	{
		if (mysql_num_rows($result8) > 0)
		{
			while ($row8 = mysql_fetch_assoc($result8))
			{
				echo $row8['Tekst'];
				echo "<br>";
			}
		}
	}
	echo "</td></tr><tr><td align='center' valign='middle' colspan='2'><img src='images/site/divider.png' alt='".$WDcat."' width='100%'></td></tr>";
}
?>


Niet de netste oplossing met inderdaad een aantal dingen die makkelijker kunnen (zoals de taal keuze) waarvan $WDlng uit een config bestand word gehaald of (indien aanwezig) uit een opgeslagen cookie.

De door jullie gegeven tips zijn zeer gewaardeerd en zullen in het nieuwe project met PHP7 zeker worden meegenomen.



Stap dus terug op de mysqli-functies, en bij mijn sterke voorkeur de object-georiënteerde versie welke herkenbaar is aan het pijltje: $conn->query("....."), en dan liever dus geen mix met de procedurele variant (dus: mysqli_query(".....")).
De object-georiënteerde versie is eenvoudiger uit te breiden en werkt met objecten.

Verder vraag ik mij af waarom je in de functie opnieuw een connectie aanlegt. Dat is normaliter iets wat maar een enkele keer aan het begin in de code gebeurt, en welke je als parameter in je functie meegeeft (wat je nu al wél doet).

Reageren