Wel verbonden met DB geen resultaten
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?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>";
}
?>
$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
Edit:
Gelieve voortaan [code]-tags te gebruiken voor code-blokken. Quote is bedoeld voor het citeren van tekst.
Gewijzigd op 19/02/2020 16:44:39 door - Ariën -
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.
Gewijzigd op 19/02/2020 17:16:01 door - 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
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.
Gewijzigd op 19/02/2020 18:31:52 door - Ariën -
= 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
Gewijzigd op 19/02/2020 22:35:10 door Thomas van den Heuvel
...en dat zijn echt van die dingen waar je overheen kijkt :X
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.
Gewijzigd op 20/02/2020 00:50:15 door - Ariën -
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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
?>
$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.
Gewijzigd op 20/02/2020 01:00:53 door Thomas van den Heuvel
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?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>";
}
?>
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.
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).
Gewijzigd op 20/02/2020 11:14:56 door - Ariën -
Kan nu twee dingen doen, deze code uitpluizen en opwaarderen of met een schone lei beginnen.
Mijn keuze is met schone lei, zodat ik nette (frisse) code kan schrijven die overzichtelijk is.
Gelukkig draait nu alles op een eigen server en kan er ook niemand meer bij de broncode.
Is er geen versiebeheersysteem, terwijl je met meerdere mensen aan de code werkt?
Nee, voor m'n eigen projectjes houd ik dat wel aan, deze keer toevallig niet.
Ik ken je code niet volledig, dus ik kan niet bepalen of je het overnieuw moet doen, of verder moet gaan.
Maar ik raad aan om in ieder geval naar de functies van MySQLi over te stappen.
Oef. function overons(lala). Opnieuw beginnen lijkt mij inderdaad een beter plan :p.