webForumDet fria alternativet

PHP hjälp med variabler och databas

10 svar · 872 visningar · startad av Beat

BeatMedlem sedan okt. 200732 inlägg
#1

Jag visste inte riktigt vad jag skulle skriva på rubriken, men det jag undrar är om det går att på nåt lätt sätt ställa in en WHERE kod i sql frågan.

Jag visar hur jag menar med ett förklarat exempel.

Jag har en sida med alla recensioner på olika spel och det är alla olika format.
Wii, Xbox, PS 3 och så vidare. Men på sidan av alla recensioner har jag en liten meny där man kan välja Wii eller Xbox eller PS 3 och när man klickar på en av dessa så ska endast recensioner för det formatet visas. Så frågan är måste jag skapa en sida för varje WHERE kod så att när man klickar på PS 3 så hoppar så blir det en ny sida som heter exempelvis recensionsindexps3 eller går det på nåt sätt göra med en variabel eller så att jag slipper göra en sida för varje.

aasahMedlem sedan mars 20034 471 inlägg
#2

Beat skrev:

Men på sidan av alla recensioner har jag en liten meny där man kan välja Wii eller Xbox eller PS 3 och när man klickar på en av dessa så ska endast recensioner för det formatet visas. Så frågan är måste jag skapa en sida för varje WHERE kod så att när man klickar på PS 3 så hoppar så blir det en ny sida som heter exempelvis recensionsindexps3 eller går det på nåt sätt göra med en variabel eller så att jag slipper göra en sida för varje.

Visst kan du använda variabler, men hur beror lite på hur det ser ut. Säg att din meny ser ut något sånt här:

<a href="recension.php?type=1">Wii</a>
<a href="recension.php?type=2">Xbox</a>
<a href="recension.php?type=3">PS 3</a>

Då kan du komma åt vad användaren valde via $_GET["type"] på recension.php . Så alltså kan du skriva något i stil med:

//I recension.php 
$where = "";
if (!isSet($_GET["type"])) {
  //Vad du vill ska hända då
}
else if ($_GET["type"] == 1) 
   $where = " speltyp = 'wii' ";
else if ($_GET["type"] == 2) 
   $where = " speltyp = 'Xbox' ";
else if ($_GET["type"] == 3) 
   $where = " speltyp = 'PS 3' ";
else {
  //Vad du vill ska hända då
}

//Om du har andra villkor i SQL-frågan
if (strlen($where) > 0)
   $where = "AND ".$where;
$sql = "SELECT * FROM Recensioner WHERE <andra villkor> ".$where;

//Annars
if (strlen($where) > 0)
   $where = "WHERE ".$where;
$sql = "SELECT * FROM Recensioner ".$where;
BeatMedlem sedan okt. 200732 inlägg
#3

Okej. Jag vet inte men om du ser min koden kanske du kan förklara lite mer för jag förstod inte riktigt hur det funkade, jag har ganska nyligen börjar lära mig detta lite bättre nämligen så det här är första gången jag gör nåt för att hämta data från databas och så.

Min php kod ser ut så här för att hämta datan alltså.

<?php
$result2 = mysql_query("SELECT count(*) as count FROM game");
$fetch   = mysql_fetch_assoc($result2);
$allNews = $fetch['count'];
$newsPerPage = 5;
$maxPages = (int)($allNews/$newsPerPage)+1;

$page = $_GET['page']; // $page = 2;
if($page<1 || $page>$maxPages || !is_numeric($page)) {
    $page = 1;
}

$start = ($page-1)*$newsPerPage;
$limit = "LIMIT $start,$newsPerPage";
?>
<?php
$query = "SELECT * FROM game ORDER BY id DESC $limit";

$result = mysql_query($query);

echo "<center>";
for($i = 1; $i <= $maxPages; $i++) {
    if($i == $page) {
        echo "$i ";
    } else {
        echo "<a href=\"recensionsindex.php?page=$i\">$i</a>&nbsp;";
    }
}
echo "</center>";
while($row = mysql_fetch_assoc($result)) {
   // $row är en rad från tabellen, skriv ut nyheterna
    // en efter en
// start the tr counter value
echo "<table width='480' cellpadding='0' cellspacing='0'>";
// start the tr counter value
$trCounter =1;

while($row = mysql_fetch_assoc($result))
{

if($trCounter==1)

{
	echo"<tr height='28' bgcolor='#151515'>";

        echo "<td><span class=minklass><a href=\"recension.php?id=".$row['id']."\">".$row['game']."</a>"."</span>"."</td>";
	echo "<td width='160'>"."<center>".$row['format']."</center>"."</td>";
        echo "<td width='100'>"."<center>".$row['date']."</center>"."</td>";

	echo"</tr>";

}

	if($trCounter==2)

	{

	echo"<tr height='28' bgcolor='#333333'>";

        echo "<td><span class=minklass><a href=\"recension.php?id=".$row['id']."\">".$row['game']."</a>"."</span>"."</td>";
	echo "<td width='160'>"."<center>".$row['format']."</center>"."</td>";
        echo "<td width='100'>"."<center>".$row['date']."</center>"."</td>";

	echo"</tr>";
    // set to Zero and add one after the last loop
	$trCounter=0;

	}

// reset counter value for the next loop
$trCounter +=1;

}

}

echo "</table>";

echo "<center>";
for($i = 1; $i <= $maxPages; $i++) {
    if($i == $page) {
        echo "$i ";
    } else {
        echo "<a href=\"recensionsindex.php?page=$i\">$i</a>&nbsp;";
    }
}
echo "</center>";
mysql_close();
?>

Min meny ligger på sidan och den koden finns här

<ul id='menu'>
<li><a href='http://'>Alla</a></li>
<li><a href='http://'>PC</a></li>
<li><a href='http://'>PS 2</a></li>
<li><a href='http://'>PS 3</a></li>
<li><a href='http://'>PSP</a></li>
<li><a href='http://'>Nintendo DS</a></li>
<li><a href='http://'>Nintendo Wii</a></li>
<li><a href='http://'>Xbox 360</a></li>
</ul>
her0nMedlem sedan feb. 200230 inlägg
#4

Den där koden måste du nog se över aasah, den är riktigt dålig. Tyvär har jag inte ork att tillföra tråden något förutom att avråda er att använda den.

FuelMedlem sedan okt. 20001 285 inlägg
#5

her0n skrev:

Den där koden måste du nog se över aasah, den är riktigt dålig. Tyvär har jag inte ork att tillföra tråden något förutom att avråda er att använda den.

Ja det var ju en givande kommantar.

her0nMedlem sedan feb. 200230 inlägg
#6

Fuel skrev:

Ja det var ju en givande kommantar.

Ja den där också.

För att vara lite mer konkret så är den helt öppen för sql-injections (beroende på php-inställningar). De två sista if-satserna är likadana. Elseif är skrivet på fel sätt.

Nu tv, kod sen.

aasahMedlem sedan mars 20034 471 inlägg
#7

her0n skrev:

För att vara lite mer konkret så är den helt öppen för sql-injections (beroende på php-inställningar). De två sista if-satserna är likadana. Elseif är skrivet på fel sätt.

Jaså verkligen... då kanske du kan förklara var SQL Injektionen skulle komma in i så fall? Eftersom ingenting av det användaren väljer att skicka med på något sätt kommer in i den SQL som skickas till databasen, eftersom 100% av all SQL-kod är hårdkodad i sidan, bara med lite olika innehåll beroende på legala val, så får nog hackaren en del att göra för att få in de där injektionerna. Och nej, jag behöver inte länken för att veta vad en SQL Injection är, men du kanske skulle läsa på? Eller så skulle du läsa inläggen lite noggrannare innan du sågar dem.

De två sista if-satserna SKA VARA likadana, det intressanta är att innehållet I dem skiljer sig åt. Beroende på hur resten av hans SQL-fråga ser ut ska han använda den ena ELLER den andra. Självklart inte båda... :OO Om du hade bekvämat dig med att läsa kommentarerna ovanför dem och betraktat deras innehåll hade nog det hela klarnat.

Vad gäller elseif, visst det är det vanliga sättet att skriva, även om else if bör fungera. Men visst, det var/är ett skrivfel, dock knappast något som gör förslaget värdelöst.

aasahMedlem sedan mars 20034 471 inlägg
#8

Beat skrev:

Min meny ligger på sidan och den koden finns här

<ul id='menu'>
<li><a href='http://'>Alla</a></li>
<li><a href='http://'>PC</a></li>
<li><a href='http://'>PS 2</a></li>
<li><a href='http://'>PS 3</a></li>
<li><a href='http://'>PSP</a></li>
<li><a href='http://'>Nintendo DS</a></li>
<li><a href='http://'>Nintendo Wii</a></li>
<li><a href='http://'>Xbox 360</a></li>
</ul>

Det där fungerar inte. Du måste på något sätt tala om för din sida vilket av alternativen du har valt. ETT (av många) sätt att göra det på, som är enkelt, är att slänga på den extra infon i URL:n.

Sedan betvivlar jag att dina länkar funkar. (Såvida du inte har någon inställning någonstans som hänger på en URL efter 'http://' så bör de inte leda någonstans.) Jag antar att du vill ladda samma sida om igen? I så fall ändrar du din meny till följande:

<?php 
$me = $_SERVER['PHP_SELF'];?>
<ul id='menu'>
<li><a href="<?php echo $me; ?>">Alla</a></li>
<li><a href="<?php echo $me."?type=1"; ?>">PC</a></li>
<li><a href="<?php echo $me."?type=2"; ?>">PS 2</a></li>
<!--- osv -->
<li><a href="<?php echo $me."?type=7"; ?>">Xbox 360</a></li>
</ul>

Om man nu väljer Alla så sätts inget värde på type, men i alla andra fall görs det. Värdena 1-7 på type är legala värden från menyn, allt annat är skräp som någon användare skrivit dit.

Sedan vet jag inte riktigt vad som är vad i din kod? Plockar du ut recensionerna här?

$query = "SELECT * FROM game ORDER BY id DESC $limit";

Eller var?

I så fall lägger du kollen enligt ovan högst upp i den filen, dock beror det exakta utseendet på din WHERE-sats på hur din tabell är definierad. Men i princip.

$where = ""; 
if (!isSet($_GET["type"])) { //Du valde "Alla" i menyn
  $where = ""; //kan vara ett blankt alternativ också, men du vill 
                   //fånga detta fall för att veta att type är satt nedan, 
                   //annars kan du få problem.
}
elseif ($_GET["type"] == 1) 
   $where = " speltyp = 'PC' ";  
elseif ($_GET["type"] == 2) 
   $where = " speltyp = 'PS 2' ";
//elseif på övriga ryper ner till... 
else if ($_GET["type"] == 7) 
   $where = " speltyp = 'Xbox 360' "; 
else { 
  //Vad du vill ska hända då - 
  //tex att resultatet blir som för "alla" eller ett felmeddelande eller...?
} 

//OM det är frågan ovan som gäller har du inga andra WHERE villkor, så... 
if (strlen($where) > 0) 
   $where = "WHERE ".$where; 
$sql = "SELECT * FROM game $where ORDER BY id DESC $limit";

Om du valde alla är $where fortfarande "" och påverkar inte frågan alls, annars har du fått in villkoret som begränsar till aktuell typ i frågan.

BeatMedlem sedan okt. 200732 inlägg
#9

Tack för hjälpen med scriptet men jag får det inte att funka riktigt. När jag klickar på exempelvis Xbox 360 så får jag detta felmeddelande.

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in D:\Wamp\wamp\www\databas\sa\recensionsindex.php on line 105.

Jag vet inte vad jag ska göra åt det men om jag sedan klickar på alla så fungerar det. Det är endast när jag endast vill komma åt någon av dom speciella recensionerna eller vad man ska säga.

nkrantzMedlem sedan apr. 2002830 inlägg
#10

mysql_num_rows(): tyder på att din sql-fråga inte returnerar något.
Skriv ut din sql med echo $sql; och kör den sedan i phpMyAdmin eller något för att se var du har fel.

aasahMedlem sedan mars 20034 471 inlägg
#11

Beat skrev:

Tack för hjälpen med scriptet men jag får det inte att funka riktigt. ... Jag vet inte vad jag ska göra åt det men om jag sedan klickar på alla så fungerar det. Det är endast när jag endast vill komma åt någon av dom speciella recensionerna eller vad man ska säga.

Alltså... du kan med största sannolikhet inte skriva av mina $where tilldelningar rakt av. Visst har du anpassat dem så att de funkar med din databasstruktur? :q Med tanke på att tabellen heter 'game' verkar det inte helt troligt att du har en kolumn som heter 'speltyp' just. Du måste naturligtvis ersätta 'speltyp' med vad den kolumn som håller i speltyperna heter i game... Och på samma sätt får du ev. anpassa värdet på kolumnen om det inte ges i klartext i tabellen. Det väsentliga är att du sätter den kolumn som anger speltyp till det värde som motsvarar de resp. systemen.

Om det här låter som grekiska får du tala om vad kolumnerna heter i game, och vilken typ av värden som lagras i dem.

Beat skrev:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in D:\Wamp\wamp\www\databas\sa\recensionsindex.php on line 105.

För övrigt: Vad står det på rad 105 och raderna omedelbart före?

133 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)