Gå til innhold

JOINs og andre spørringer.


Anbefalte innlegg

Så, jeg prøver å gjøre fire SQL spørringer. Disse spørringene er resultatene fra hverandre.

Jeg har funnet ut såpass at jeg trenger en while loop for å ikke bare få "Resource id #X".

 

Problemet mitt akkurat nå er at den siste delen av koden ikke kommer opp i det hele tatt. Får ikke noen mysql error engang. Noen som vet hvorfor? eventuelt /facepalmer akkurat nå og vil vise en smartere måte å gjøre dette på? Om dere trenger mer info om akkurat hva som ligger i de forskjellige databasene skal jeg poste det..

 

 

<?php
include ('connect.php');

$q=$_GET["q"];
$sql="SELECT vareID FROM relasjon WHERE enhetID = '".$q."'";
$vareresult = mysql_query($sql);

while ($row=mysql_fetch_array($vareresult)) {

$sql2="SELECT produktnavn,type,produsent FROM varer WHERE vareID = '".$row['vareID']."'";
$vareinfo = mysql_query($sql2);
	print_r(mysql_fetch_assoc($vareinfo));

$sql3="SELECT kategori FROM varer WHERE vareID = '".$row['vareID']."'";
$kategori = mysql_query($sql3);
	print_r(mysql_fetch_assoc($kategori));

while ($katrow=mysql_fetch_array($kategori)) {
	$sql4="SELECT kategoriNavn FROM kategori WHERE kategoriID = '".$katrow['kategoriID']."'";
	$kategori2 = mysql_query($sql4);
	print_r(mysql_fetch_assoc($kategori2) or die(mysql_error));
	mysql_close($con);
}
}

?>

 

edit: om det ikke er klart vil jeg bare nevne at alle print_r'ne skal bort. De er bare der for å få litt respons.

Endret av TekniskFeil
Lenke til kommentar
Videoannonse
Annonse

Et par ting jeg vil kommentere.

 

Det første er at du saniterer input, din kode er helt åpen for SQL-injection.

Det andre er at det er mye enklere å skrive:

$sql = "SELECT vareID FROM relasjon WHERE enhetID = '{$q}';";

Det tredje er at du sannsynligvis kan skrive det du trenger som en SQL-spørring i stedet for fire ved å bruke JOINs.

 

SELECT v.vareId, v.produktnavn, v.type, v.produsent, v.kategori, k.kategoriNavn FROM relasjon AS r LEFT JOIN varer AS v ON ( r.vareID = v.vareId ) JOIN kategori AS k ON ( v.kategori = k.kategoriID ) WHERE r.enhetID = '{$q}';

Endret av JohndoeMAKT
Lenke til kommentar

muchas grasias senor!

 

Det første er at du saniterer input, din kode er helt åpen for SQL-injection.

 

Willdo, ?q=str skal hentes via ajax fra en side på adminområdet tho så risikoen for SQL er heller liten med mindre de har FTP access/insider knowledge eller hva? Skal uansett for sikkerhetskyld putte på en magic quotes.

 

 $sql = "SELECT vareID FROM relasjon WHERE enhetID = '{$q}';"; 

 

Takk! Did not know that.

 

Det tredje er at du sannsynligvis kan skrive det du trenger som en SQL-spørring i stedet for fire ved å bruke JOINs.

SELECT v.vareId, v.produktnavn, v.type, v.produsent, v.kategori, k.kategoriNavn FROM relasjon AS r LEFT JOIN varer AS v ON ( r.vareID = v.vareId ) JOIN kategori AS k ON ( v.kategori = k.kategoriID ) WHERE r.enhetID = '{$q}';

 

veldig, veldig kult. Tydelig at jeg må lære meg mer SQL. Hvordan vil du anbefale å echoe ut dette om jeg for eksempel vil ha det i en table nå?

 


$q=$_GET["q"];

$sql="SELECT v.vareId, v.produktnavn, v.type, v.produsent, v.kategori, k.kategoriNavn FROM relasjon AS r LEFT JOIN varer AS v ON ( r.vareID = v.vareId ) JOIN kategori AS k ON ( v.kategori = k.kategoriID ) WHERE r.enhetID = '{$q}'";

$resultat= mysql_query($sql);

$string = "<table>";
$string .= "<tr>";
$string .= "<th>ID</th>";
$string .= "<th>Produktnavn</th>";
$string .= "<th>Type</th>";
$string .= "<th>Produsent</th>";
$string .= "<th>Kategori</th>";
$string .= "<th>KategoriNavn</th>";
$string .= "</tr>";

while($row = mysql_fetch_array($resultat)){
$string .= "<tr>";
$string .= "<td>$row[v.vareID]</td>";
$string .= "<td>$row[v.produktnavn]</td>";
$string .= "<td>$row[v.type]</td>";
$string .= "<td>$row[v.produsent]</td>";
       $string .= "<td>$row[v.kategori]</td>";
       $string .= "<td>$row[v.kategoriNavn]</td>";
$string .= "</tr>";	
}
$string .= "</table>";
echo $string

 

?

Lenke til kommentar
veldig, veldig kult. Tydelig at jeg må lære meg mer SQL. Hvordan vil du anbefale å echoe ut dette om jeg for eksempel vil ha det i en table nå?

Jeg er personlig ikke glad i å echoe HTML i PHP. Jeg skriver ren PHP og så skriver jeg HTML med PHP inline. Eksempel:

 

<?php
if (isset($_GET['q'])) {
$q = preg_replace('/\W/', '', $_GET['q']);
if (mb_strlen($q) > 0) {
	$sql="SELECT v.vareId, v.produktnavn, v.type, v.produsent, v.kategori, k.kategoriNavn FROM relasjon AS r LEFT JOIN varer AS v ON ( r.vareID = v.vareId ) JOIN kategori AS k ON ( v.kategori = k.kategoriID ) WHERE r.enhetID = '{$q}'";
	$resultat= mysql_query($sql);
}
}
?><table>
<tr>
	<th>ID</th>
	<th>Produktnavn</th>
	<th>Type</th>
	<th>Produsent</th>
	<th>Kategori</th>
	<th>KategoriNavn</th>
</tr>
<?php
if (isset($resultat) && is_resource($resultat)) {
	while($row = mysql_fetch_assoc($resultat)) {
?>	<tr>
	<td><?= $row['vareID'] ?></td>
	<td><?= $row['produktnavn'] ?></td>
	<td><?= $row['type'] ?></td>
	<td><?= $row['produsent'] ?></td>
	<td><?= $row['kategori'] ?></td>
	<td><?= $row['kategoriNavn'] ?></td>
</tr>
<?php
	}
}
?></table>

Endret av JohndoeMAKT
Lenke til kommentar

Awesome, lærer masse. Tizag og w3schools kan bare gi opp :/

 

Men burde hoppe til køys, fint å se det ikke bare er meg som har dårlig døgnrytme though ;)

 

 

En siste tjeneste om du har peiling: Gode sider/tuts for å plukke opp gode PHP vaner? Selv om f.eks wc3schools og tizag som jeg nevnte er genialt for å skjønne hvordan syntax fungerer og litt basics er det jo tydelig at jeg ikke kan skrive ordentlig PHP.

 

Eksisterer det noen ressurser for litt viderekomne eller er den eneste måten å bli bedre på erfaring + tips fra mer erfarne (ala denne tråden)?

Lenke til kommentar

Jeg har aldri "lært PHP", så jeg vet ikke om gode ressurser til læring fra bunnen av. Jeg har lært Java og så gått over til PHP etter at nødvendige deler var lært der. Så eneste jeg har trengt er php.net som jeg bruker 5-10 ganger dagen som referanse.

 

Hva med å lese eksisterende kode? F.eks laste ned Zend Framework og lese og forstå hva klasser der gjør? Ligg unna de mest avanserte klassene som de som har med database dog.. jeg tror det er mye magi der.

Endret av JohndoeMAKT
Lenke til kommentar

Dette er nå litt urelatert til orginaltittelen så jeg vil forandre på den, men jeg har fått et par nye problemer. Jeg skal prøve å forklare meg så presist som mulig.

 

Spørringen som du bidro med skal brukes på en memberside (bak login) og må derfor se slik ut:

"SELECT v.vareId, v.produktnavn, v.type, v.produsent, v.utlop, v.kategori, k.kategoriNavn FROM relasjon AS r LEFT JOIN varer AS v ON ( r.vareID = v.vareId ) JOIN kategori AS k ON ( v.kategori = k.kategoriID ) WHERE r.enhetID = '{$q}' AND r.brukerID = '{$brukerid}'"

 

 

 

Her har jeg et problem. Hvordan skal jeg sende brukerIDn sammen med formen uten å involvere brukeren( for å hindre muligheten for exploitation som selvfølgelig kommer med userinput).

 

En mulighet jeg ser er:

"SELECT brukerID FROM bruker WHERE userName='$username'"

også ON (r.brukerID = b.brukerID ) men jeg vet ikke hvordan jeg eventuelt ville fått det inn i spørringen fra JohndoeMAKT

 

JOIN, LEFT JOIN og RIGHT JOIN gjør meg en smule forvirret når det blir flere av dem på rad. Er ikke poenget med f.eks RIGHT JOIN at table_name2 skal selectes uansett om det matcher noe fra "left table (table_name1)"? Hvordan blir så dette når det plutselig er 4 tables etterhverandre?

 

 

Ps: Takk for tipset, skal ta en titt på Zend

Endret av TekniskFeil
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...