PHP SQL probleempje met innerjoin

Status
Niet open voor verdere reacties.

pieter53

Gebruiker
Lid geworden
1 jan 2007
Berichten
297
Deze code werkt goed.
PHP:
$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:
$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 ?
 
En met een LEFT JOIN?

Voor de rest hoop ik dat $alt geéscaped wordt. Anders zie ik een grote SQL-injectie.
 
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
 
Lees dit eens:
https://www.w3schools.com/sql/sql_join.asp


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. ;)
 
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.
 
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:
$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.";
	
}
 
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:
$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:
$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.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan