Hantera flera sökresultat i PHP

Tråden skapades och har fått 6 svar. Det senaste inlägget skrevs .
1
  • Oregistrerad
  • 2004-06-14 12:27

Om man i sin MySQL-databas får flera träffar med ett SELECT-anrop, hur hanteras detta i om man använder mysql_query() i PHP?

T.ex: $result = mysql_query("SELECT * FROM entabell WHERE 2 > 1");

Om man får många träffar, blir $result en vektor då innehållande alla träffar?

Eller hur får man ut de olika träffarna ur $result? mysql_fetch_array() fungerar väl enbart på en träff?

Har sökt i PHP-docsen utan att få några egentliga svar..

  • Medlem
  • Stockholm
  • 2004-06-14 12:42

Om du tittar noggrannare i php-dokumentationen ser du ett bra exempel redan på första sidan, http://se.php.net/mysql - kolla särskilt hur mysql_fetch_array() körs i en while-loop för att plocka ut rad för rad.

<?php
/* Connecting, selecting database */
$link = mysql_connect("mysql_host", "mysql_user", "mysql_password")
   or die("Could not connect : " . mysql_error());
echo "Connected successfully";
mysql_select_db("my_database") or die("Could not select database");

/* Performing SQL query */
$query = "SELECT * FROM my_table";
$result = mysql_query($query) or die("Query failed : " . mysql_error());

/* Printing results in HTML */
echo "<table>\n";
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
   echo "\t<tr>\n";
   foreach ($line as $col_value) {
       echo "\t\t<td>$col_value</td>\n";
   }
   echo "\t</tr>\n";
}
echo "</table>\n";

/* Free resultset */
mysql_free_result($result);

/* Closing connection */
mysql_close($link);
?> 
  • Oregistrerad
  • 2004-06-15 09:25

Intressant med foreach-satsen.. Inte stött på den i java som jag normalt handskas med.

Fick dock inte det till att fungera, den variabel som tilldelas i foreach-satsen ($col_value) kan jag endast använda som en sträng (där alla kolumnvärdena läggs efter varandra). Hade velat kunna indexera värdena i de olika kolumnerna..

Hittade en annan lösning då jag använder mig av funktionen mysql_fetch_row():

$result = mysql_query("SELECT * FROM mintabell");

while ($line = mysql_fetch_row($result)) {
    behandla resultatet..
}

Har också en annan fråga: Finns det någon systematisk metod för att gå igenom alla värden i en tabell "uppifrån och ner"? D.v.s. att man hämtar värdena från den rad som senast lades in i tabellen?

  • Oregistrerad
  • 2004-06-15 11:54
Ursprungligen av adlers:

Har också en annan fråga: Finns det någon systematisk metod för att gå igenom alla värden i en tabell "uppifrån och ner"? D.v.s. att man hämtar värdena från den rad som senast lades in i tabellen?

Vill du endast plocka ut senaste inlagda raden kan det nog finnas något specialkommando för det. Om du har en nyckel som alltid räknas upp kan du ju annars ta fram alla rader sorterade "ORDER BY nyckel ASC" på den nyckeln. DU kan också lägga in en LIMIT för att begränsa hur många rader du vill plocka ut. Då kan du t.ex. få endast den senaste raden.

Michael

  • Medlem
  • Stockholm
  • 2004-06-15 12:25
Ursprungligen av adlers:

Intressant med foreach-satsen.. Inte stött på den i java som jag normalt handskas med.

Fick dock inte det till att fungera, den variabel som tilldelas i foreach-satsen ($col_value) kan jag endast använda som en sträng (där alla kolumnvärdena läggs efter varandra). Hade velat kunna indexera värdena i de olika kolumnerna..

Det är ju precis vad foreach gör.
Säg att du har $line['index1'] och kör en

foreach($line AS $key => $value)

Så kommer ju $key innehålla nyckelnamnet och $value kommer innehålla värdet på motsvarande plats. Meningen med foreach är ju att stega igenom en array och för varje plats använda nyckelnamnet och värdet i variabelnamn som är desamma för varje loop.

Så här gör man samma sökning i Lasso och skjuter ut resultatet i en tabell. Inte för att någon frågade om det, men jag kan som vanligt inte låta bli att missionera för hur mycket trevligare det är på den "ljusa sidan". Hihi. "Join us! Don't be afraid!"

[Inline:
-Database='MySQL_Host',
-Table='MySQL_Table',
-Username='MySQL_User',
-Password='MySQL_Password',
-MaxRecords='All',
-FINDALL]

[If:(Found_Count)=='0']
<P>Hittar inget! Felkod: [Error_CurrentError]</P>
	[Else]<TABLE>
		[Records]
			<TR><TD>[Field:'Column1']</TD>
			<TD>[Field:'Column2']</TD></TR>
		[/Records]
	      </TABLE>
	[/If]
[/Inline]

Det som står mellan Records-taggarna upprepas en gång för varje träff i sökresultatet.

  • Medlem
  • Stockholm
  • 2004-06-15 13:13
Ursprungligen av Taz_1999:
[If:(Found_Count)=='0']
<P>Hittar inget! Felkod: [Error_CurrentError]</P>
	[Else]<TABLE>
		[Records]
			<TR><TD>[Field:'Column1']</TD>
			<TD>[Field:'Column2']</TD></TR>
		[/Records]
	      </TABLE>
	[/If]
[/Inline]

det kan ju inte skada att skriva motsvarande i php som han frågar efter också (även om det redan gjorts åvan, heh)

if(mysql_num_rows($query) == 0)
   echo "<p>Inga rader funna</p>";
else {
   echo "<table>";
   while($data = mysql_fetch_array($query)) {
      echo "<tr>"
         .   "<td>" . $data['column1'] . "</td>"
         .   "<td>" . $data['column2'] . "</td>"
         . "</tr>";
   }
   echo "</table>";
}
1
Bevaka tråden