Wel verbonden met DB geen resultaten

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Marco Apeldoorn

Marco Apeldoorn

19/02/2020 16:42:09
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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

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 -
 
PHP hulp

PHP hulp

16/07/2020 19:21:00
 
- Ariën -
Beheerder

- Ariën -

19/02/2020 16:48:15
Quote Anchor link
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.
Gewijzigd op 19/02/2020 17:16:01 door - Ariën -
 
Marco Apeldoorn

Marco Apeldoorn

19/02/2020 18:24:03
Quote Anchor link
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
 
- Ariën -
Beheerder

- Ariën -

19/02/2020 18:27:19
Quote Anchor link
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.
Gewijzigd op 19/02/2020 18:31:52 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

19/02/2020 22:11:20
Quote Anchor link
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
Gewijzigd op 19/02/2020 22:35:10 door Thomas van den Heuvel
 
- Ariën -
Beheerder

- Ariën -

19/02/2020 22:17:58
Quote Anchor link
...en dat zijn echt van die dingen waar je overheen kijkt :X
 
Marco Apeldoorn

Marco Apeldoorn

20/02/2020 00:45:33
Quote Anchor link
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
 
- Ariën -
Beheerder

- Ariën -

20/02/2020 00:49:39
Quote Anchor link
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 -
 
Thomas van den Heuvel

Thomas van den Heuvel

20/02/2020 00:59:34
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
?>

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
 
Marco Apeldoorn

Marco Apeldoorn

20/02/2020 10:47:40
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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.
 
- Ariën -
Beheerder

- Ariën -

20/02/2020 11:13:00
Quote Anchor link
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).
Gewijzigd op 20/02/2020 11:14:56 door - Ariën -
 
Marco Apeldoorn

Marco Apeldoorn

20/02/2020 12:58:04
Quote Anchor link
De connectie met de server stond (oorspronkelijk) ook enkel vooraan in de code en werd met het aanroepen van de functies meegenomen, ergens in de code (+/- 5000 regels, dus valt mee) is die connectie verbroken door de wijzigingen die een ander heeft aangebracht, deze moest ik snel herstellen en dan is dit de kortste slag.

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.
 
- Ariën -
Beheerder

- Ariën -

20/02/2020 13:38:52
Quote Anchor link
Is er geen versiebeheersysteem, terwijl je met meerdere mensen aan de code werkt?
 
Marco Apeldoorn

Marco Apeldoorn

20/02/2020 14:03:33
Quote Anchor link
Nee, voor m'n eigen projectjes houd ik dat wel aan, deze keer toevallig niet.
 
- Ariën -
Beheerder

- Ariën -

20/02/2020 14:07:04
Quote Anchor link
Ah, okee.

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.
 
Thomas van den Heuvel

Thomas van den Heuvel

20/02/2020 17:07:23
Quote Anchor link
Oef. function overons(lala). Opnieuw beginnen lijkt mij inderdaad een beter plan :p.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.