Helpmij.nl
Helpmij.nl
Helpmij.nl

Quote

Weergeven resultaten 1 tot 7 van 7

Onderwerp: PHP SQL probleempje met innerjoin

  1. #1
    Senior Member
    Geregistreerd
    1 januari 2007
    Locatie
    Haarlem
    Vraag is niet opgelost

    PHP SQL probleempje met innerjoin

    Deze code werkt goed.
    PHP Code:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    $qw1 = "SELECT idtrefw, trefw FROM trefwoord WHERE alt = $alt";
    $result = mysqli_query($db,$qw1); 
     
    while ($row = mysqli_fetch_assoc($result)){
        $idtw = $row['idtrefw'];
        $trefw = $row['trefw'];
        echo "<br>".$idtw." = idtrefw.";
        
            $qw2 = "SELECT idtb FROM koppeltbtw WHERE idtw = $alt";
            $result2 = mysqli_query($db,$qw2); 
            while ($row2 = mysqli_fetch_assoc($result2)){
                $idtb = $row2['idtb'];
                echo "<br>".$idtb." = idtb. ".$trefw." = trefwoord.";
            
            }
    }
    IDTB is de ID van een tekstbestand
    Nu de JOIN

    PHP Code:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    $qw1 = "SELECT tbestand.idtb, trefwoord.trefw
    FROM tbestand
       INNER JOIN
       koppeltbtw
       ON koppeltbtw.idtb = tbestand.idtb
       INNER JOIN
       trefwoord
       ON koppeltbtw.idtw = trefwoord.alt
       WHERE trefwoord.alt = '$alt'";
    $result = mysqli_query($db,$qw1);
     
    print_r($result);
     
    while ($row = mysqli_fetch_assoc($result)){
        $idtb = $row['idtb'];
        $trefw = $row['trefw'];
        
        echo "<br>".$idtb." = idtb ".$trefw." = trefw.";
        
    }
    Deze code werkt WEL als IDTB twee of meer resultaten heeft
    Deze code werkt NIET als IDTB maar één resultaat had moeten vinden.

    Wat is er fout met de JOIN ?
    Pieter Klein, Haarlem.

  2. #2
    Mega Honourable Senior Member Aar's avatar
    Geregistreerd
    3 augustus 2014
    En met een LEFT JOIN?

    Voor de rest hoop ik dat $alt geéscaped wordt. Anders zie ik een grote SQL-injectie.
    Was voorheen: PHP4U

  3. #3
    Senior Member
    Geregistreerd
    1 januari 2007
    Locatie
    Haarlem
    Bedankt voor de reactie, maar mijn vraag is natuurlijk waarom werkt het wel als de uitkomst uit meer dan één resultaat bestaat
    en niet als de uitkomst uit slechts één enkel resultaat bestaat.

    Wat de leftjoin betreft:
    Hoe stelt U zich dat voor? Ik ben niet zo sterk met joins, helaas.

    Aangezien er voorlopig niemand anders dan ik zelf met deze database werkt,
    heb ik van sql-injecties weinig te vrezen
    Pieter Klein, Haarlem.

  4. #4
    Mega Honourable Senior Member Aar's avatar
    Geregistreerd
    3 augustus 2014
    Lees dit eens:
    https://www.w3schools.com/sql/sql_join.asp


    Quote Origineel gepost door pieter53 Bekijk Bericht
    Aangezien er voorlopig niemand anders dan ik zelf met deze database werkt,
    heb ik van sql-injecties weinig te vrezen
    Kijk, en daar ga je al een veel gemaakte fout in....
    Wie zegt dat hij niet zelf een injection veroorzaakt die je query vernachelt?
    Vul eens 's Hertogenbosch in, en zie dat je query al op zijn plaat gaat met de single-quote.
    Daarnaast is de gedachte van: 'Ik ben de enige die het gebruikt' ook vrij gevaarlijk. Wat nu als je account gecompromitteerd wordt?

    Een 24 uurs winkel heeft ook altijd een slot op de deur.
    Was voorheen: PHP4U

  5. #5
    Senior Member
    Geregistreerd
    1 januari 2007
    Locatie
    Haarlem
    Ik kan je gerust stellen.
    Je zorgen zijn volslagen onnodig want $alt komt uit dezelfde database
    en de invoer daarvan laat geen '\= * e.d. toe en wordt geëscaped.
    Pieter Klein, Haarlem.

  6. #6
    Senior Member
    Geregistreerd
    1 januari 2007
    Locatie
    Haarlem
    INNER JOIN vervangen door LEFT JOIN en dat geeft nog minder resultaat.

    Geen resultaat als er 1 of twee antwoorden mogelijk zijn, de juiste resultaten als er 3 antwoorden mogelijk zijn.

    PHP Code:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    $qw3 = "SELECT tbestand.idtb, trefwoord.trefw
    FROM tbestand
       LEFT JOIN
       koppeltbtw
       ON koppeltbtw.idtb = tbestand.idtb
       LEFT JOIN
       trefwoord
       ON koppeltbtw.idtw = trefwoord.alt
       WHERE trefwoord.alt = '$alt'";
     
    $result3 = mysqli_query($db,$qw3);
     
    print_r($result3);
     
    while ($row3 = mysqli_fetch_assoc($result3)){
        $idtb = $row3['idtb'];
        $trefw = $row3['trefw'];
        
        echo "<br>".$idtb." = idtb ".$trefw." = trefw.";
        
    }
    Pieter Klein, Haarlem.

  7. #7
    Senior Member
    Geregistreerd
    1 januari 2007
    Locatie
    Haarlem
    Toch gewoon weer een stommiteit van mij. Toen ik analyseerde wat ik in de eerste query eigenlijk deed,
    was het snel gevonden. (De left of inner join wordt er ook een stuk simpeler van.)
    PHP Code:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    $qw1 = "SELECT idtrefw, trefw FROM trefwoord WHERE alt = $alt";
    $result = mysqli_query($db,$qw1);
     
    while ($row = mysqli_fetch_assoc($result)){
    $idtw = $row['idtrefw'];
    $trefw = $row['trefw'];
    echo "<br>".$idtw." = idtrefw.";
     
    $qw2 = "SELECT idtb FROM koppeltbtw WHERE idtw = $alt";
    $result2 = mysqli_query($db,$qw2);
    while ($row2 = mysqli_fetch_assoc($result2)){
    $idtb = $row2['idtb'];
    echo "<br>".$idtb." = idtb. ".$trefw." = trefwoord.";
     
    }
    }

    ANALYSE qw1
    /*$alt = 42 => trefwoord.idtw = 42, 154, 155 => Eerste WHILE geeft dus drie 'resultaten'
    ANALYSE qw2
    koppeltbtw.idtw = 42 => idtb = 5 => 5 is dus de waarde van elk resultaat
    Er zijn dus drie trefwoorden, met gelijke betekenis maar verschillende schrijfwijze gekoppeld aan tekstbestand 5.
    */

    Nieuwe query met left of inner join
    PHP Code:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    $qw3 = "SELECT koppeltbtw.idtb, trefwoord.trefw
    FROM koppeltbtw
       LEFT JOIN
       trefwoord
       ON koppeltbtw.idtw = trefwoord.alt
       WHERE trefwoord.alt = '$alt'";
    $result3 = mysqli_query($db,$qw3);
     
    print_r($result3);
     
    while ($row3 = mysqli_fetch_assoc($result3)){
    $idtb = $row3['idtb'];
    $trefw = $row3['trefw'];
     
    echo "<br>".$idtb." = idtb ".$trefw." = trefw.";
     
    }

    Uitvoer:
    42 = idtrefw.
    5 = idtb. Beyerlandse schouw = trefwoord.
    154 = idtrefw.
    5 = idtb. Beijerlandse schouw = trefwoord.
    155 = idtrefw.
    5 = idtb. Beyerlandsche schouw = trefwoord.

    Hierna query met JOIN.

    mysqli_result Object ( [current_field] => 0 [field_count] => 2 [lengths] => [num_rows] => 3 [type] => 0 )
    5 = idtb Beyerlandse schouw = trefw.
    5 = idtb Beijerlandse schouw = trefw.
    5 = idtb Beyerlandsche schouw = trefw.
    Pieter Klein, Haarlem.

Berichtenregels

  • U mag geen nieuwe vragen starten.
  • U mag niet reageren op berichten.
  • U mag geen bijlagen versturen.
  • U mag uw berichten niet bewerken.
  •  
Helpmij.nl
Helpmij.nl

Helpmij.nl

Regels
Help

Helpmij.nl en business

Partners
Sponsoren