WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   "pausa" en while-loop, och sen låta den fortsätta (https://www.wn.se/forum/showthread.php?t=1052732)

jonssondesign 2012-03-21 01:09

"pausa" en while-loop, och sen låta den fortsätta
 
Hejsan, jag sitter just nu och kodar min första sida i php och mysql, och har kommit en bit på vägen.

Jag har lärt mig allt på nätet, och kollat in en del tutorials, så mina kunskaper är inte de bästa..
Men jag ville göra en sida on my own, så jag lättare kan lära mig.

Jag tänkte jag skulle försöka mig på att skapa en webbshop (kanske lite överkurs, men det går bra hitils i alla fall.

Jag skulle dock vilja veta om det på något sätt går att lägga in en annons efter ett x antal rader.

exempel:


<ul>
<li>produkt 1</li>
<li>produkt 2</li>
<li>produkt 3</li>
<li>produkt 4</li>
<div>Annons</div>
<li>produkt 5</li>
<li>produkt 6</li>
<li>produkt 7</li>
<li>produkt 8</li>
</ul>

Förstår ni hur jag menar?

Jag använder mig av en vanlig while-loop för att lista produkterna.
Jag tänker mig att man på något sätt ska kunna stoppa loopen, utföra en kod (lägga in annonsen), och sen sätta igång loopen igen.

Eller om man kanske kan på något sätt kan räkna antalet <li>?

Kanske kan man använda sig av något annat?

Hoppas ni kan hjälpa mig, och om ni behöver veta mer så är det bara att säga till så fixar jag fram det begärda! :)

mvh,
Fredrik Jonsson

Jine 2012-03-21 01:32

Kod:

while($products as $product) {
  if($i == 5) {
      echo 'Annons!';
  } else {
      echo '<li>'.$product.'</li>';
  }
}

Alternativt kan du experimentera med modulus för att t.ex. visa en annons var N produkt.

jonny 2012-03-21 07:41

Lämpligen så räknar du antalet rader och kontrollerar om du är på rad X varvid du infogar annonsen.

Monkboll 2012-03-21 09:29

Skulle gjort precis som Jine föreslog.
Fast utan else satsen då så att den inte hoppar över 5an?

foks 2012-03-21 09:42

Citat:

Ursprungligen postat av Jine (Inlägg 20435525)
Kod:

while($products as $product) {
  if($i == 5) {
      echo 'Annons!';
  } else {
      echo '<li>'.$product.'</li>';
  }
}

Alternativt kan du experimentera med modulus för att t.ex. visa en annons var N produkt.

Glöm inte att lägga in $i++ någonstans. :)

jonssondesign 2012-03-21 10:08

Skulle någon vänlig själ vilja berätta för mig hur Jines kod fungerar? Vad ska variabeln "i" innehålla?

Jag kan skicka en pastebin kopia på min kod när jag kommer hem sen, så kan ni enklare bedömma om
Jine's kod är det bästa sättet. :)

Kekke 2012-03-21 10:32

Kod:

<?php
$i = 0;
while($row = mysql_fetch_array($result)) {
    if($i == 5) //Kolla om $i är 5 t.ex. i sådant fall skriv ut annons, $i är antal gånger loopen körts
        echo '<li>Annons</li>';
    //Skriv alltid ut varan
    echo '<li>' . $row['vara'] . '</li>';
   
    //Öka variabeln $i så att vi ser hur många gånger loopen har körts
    $i++;
}
?>


Monkboll 2012-03-21 10:33

Kör den så här borde den funka.
Eller hur ser din while loop ut?

$i = 0;
while($products as $product) {
if($i == 5) {
echo "<div>Annons</div>";
}
echo "<li>$product</li>";
$i++;
}

Fredrik-s 2012-03-21 11:50

Kan dra mitt strå till stacken i och förklara Monkboll's kod:

// Innan du påbörjar while-loopen definierar du en variabel till 0
$i = 0;
// Så länge det finns produkter att hämta ut så kör vi while satsen nedanför
while($products as $product) {
// Om variabel $i är lika med 5 så kör vi ut annonsen annars skippas denna if-sats eftersom uttrycket inte är sant
if($i == 5) {
echo "<div>Annons</div>";
}
// Vi skiver ut produkten
echo "<li>$product</li>";
// Nedan ökar vi $i variabeln med ett (++ betyder öka med ett) du skulle lika gärna kunna skriva $i = $i + 1; Men det blir mindre kod att skriva det som nedanför.
$i++;
}

Varje gång vi har kört ett varv i whilesatsen så kommer $i att öka med ett. Första varvet är $i 0, nästa varv är $i 1, därefter är $i 2 osv. När $i till slut kommer att bli 5 så blir det uttrycket vi har skrivit i if-satsen sant (eftersom $i == 5)och då kommer "<div>Annons</div>" skrivas ut.

tartareandesire 2012-03-21 12:18

Den överdrivna kommenteringen Fredrik-s använde ovan är då endast menad för din skull och inte lämpad till "riktig kod", bara så du vet :)

Variabeln $i kallas för iterator vilket är en variabel som används endast för att traversera genom någon form av behållare. Därav att du oftast ser bokstaven 'i' användas till detta. Du stoppar aldrig upp loopen utan gör bara olika saker inne i den beroende på olika villkor, i detta fall beroende på iteratorns värde.

Kretius 2012-03-21 15:32

Själv brukar jag använda modulus istället när jag vill skriva ut något vid givna intervall.
Så jag bidrar med mitt exempel.
Eftersom modulus (% i PHP) svarar med resten från en division så blir det 0 (false) när det är jämnt delbart. (6/2=3 0 i rest, 7/2=3 och 1 i rest) En division med 0 ger alltid en rest på 0 så därför startar jag med $i=1 istället.
Mitt exempel blir då:
Kod:

  $i=1;
  while ($products as $product) {
    echo "<li>$product</li>";
    if (!($i%5)) echo "<li>annons</li>"; // om $i % 5 inte blir 0 (false) är det inte delbart med 5
    $i++;   
  }


allstars 2012-03-21 15:34

Bara du inte kör DIV istället för LI bara. Då blir markup-gudarna arga på dig.

nosnaj 2012-03-21 15:39

Citat:

Ursprungligen postat av tartareandesire (Inlägg 20435555)
Den överdrivna kommenteringen Fredrik-s använde ovan är då endast menad för din skull och inte lämpad till "riktig kod", bara så du vet :)

Variabeln $i kallas för iterator vilket är en variabel som används endast för att traversera genom någon form av behållare. Därav att du oftast ser bokstaven 'i' användas till detta. Du stoppar aldrig upp loopen utan gör bara olika saker inne i den beroende på olika villkor, i detta fall beroende på iteratorns värde.

Det blir nog hemläxa för dig ;)
$products är snarare iteratorn, $i är ju bara en siffra och den kan du väl knappast iterera över.

Snyggare kod borde dessutom vara:

foreach($products as $counter => $product) {
//Do stuff
}

tartareandesire 2012-03-21 17:10

Citat:

Ursprungligen postat av nosnaj (Inlägg 20435573)
Det blir nog hemläxa för dig ;)
$products är snarare iteratorn, $i är ju bara en siffra och den kan du väl knappast iterera över.

Snyggare kod borde dessutom vara:

foreach($products as $counter => $product) {
//Do stuff
}

Naturligtvis har du rätt i det. Var lite snabb där, det enda jag egentligen ville kommentera var kommentarerna så att säga :) Iteration (= upprepning) bör det istället ha stått, alltså gällande vad i:et i variabelnamnet betyder.

Monkboll 2012-03-21 18:44

Kul att se så många olika lösningar på ett så pass relativt enkelt problem. =D

jonssondesign 2012-03-21 23:54

Jag tror jag förstår faktiskt! Tack så jätte mycket allihop!

För er som är intresserad av att se hur min while loop ser ut nu (utan att ha testat er teori), så ligger den här: http://pastebin.com/HFKVS9FS

Återkommer om jag får några problem!

Tack ännu en gång för er hjälp!

jonssondesign 2012-03-22 13:12

PHP-kod:

<?php //Listar produkterna
       
  
$query "SELECT * FROM products WHERE visible = 1 "// Välj alla kolumner från tabellen "products" där kolumnen visible "synbar" är lika med 1 "JA"
                       
  
if (isset($race_sort)) {
    if (
$race_sort == "kvinna") { $query .= "AND race = 'kvinna' "; } // visa bara produkter åt kvinnor
    
if ($race_sort == "man") { $query .= "AND race = 'man' "; } // visa bara produkter åt män
    
if ($race_sort == "barn") { $query .= "AND race = 'barn' "; } // visa bara produkter åt barn
  
}
                       
  if (isset(
$brand_sort)) {
    
$query .= "AND brand = '$brand_sort' "// visa bara produkter från ett specifikt märke (under produktens titel)
  
}
                       
  if (isset(
$post_brand)) {
    if (
$post_brand == "Alla") { }else {
      
$query .= "AND brand = '$post_brand' "// visa bara produkter från ett specifikt märke (tabellen)
    
}
  }

  
$query .= "AND price > 0 "// visa produkter med ett pris över 0 kr
  
$query .= "AND price < 5000 "// visa produkter med ett pris under 5000 kr
  
  
$query .= "ORDER BY price ASC"// sortera efter pris (billigast först)
  
  
if (isset($post_limit)) {
    
$query .= " LIMIT $post_limit"// sortera efter ett visst antal produkter
  
}
                       
  
$result mysql_query($query$connection) or die(mysql_error()); // Hämtar prdoukterna

Är detta ett bra sätt att lösa sorteringar på?

(Har inte inkluderat alla sorters sorteringar ännu dock...)

Monkboll 2012-03-22 13:21

Finns nog lita att ändra kanske.. Såg detta lite snabbt.
Kod:

if (isset($race_sort)) {
    if ($race_sort == "kvinna") { $query .= "AND race = 'kvinna' "; } // visa bara produkter åt kvinnor
    if ($race_sort == "man") { $query .= "AND race = 'man' "; } // visa bara produkter åt män
    if ($race_sort == "barn") { $query .= "AND race = 'barn' "; } // visa bara produkter åt barn
  }

Skulle jag göra så här.

Kod:

  if (isset($race_sort)) {
    $query .= "AND race = '$race_sort' "; }
  }

Lika på de andra

captaindoe 2012-03-22 13:48

Kod:

  if (isset($race_sort)) {
    $query .= "AND race = '$race_sort' "; }
  }

Detta är extremt farligt eftersom jonssondesign inte använder sig utav mysql_real_escape_string.

Monkboll 2012-03-22 15:04

Sant.
Kör mysql_real_escape_string($race_sort) istället då.
Ville mest pointera hans onödiga if satser..

captaindoe 2012-03-22 15:32

Absolut. Jag skulle föreslå följande:
PHP-kod:

$races = array('kvinna''man''barn');
if (isset(
$race_sort) && in_array($race_sort$races)) { 
    
$query .= "AND race = '" mysql_real_escape_string($race_sort) . "' ";


Eftersom man inte vill att queryn ska byggas upp av vilka textstränger som helst.

jonssondesign 2012-03-22 16:34

Läste lite på php.net om mysql_real_escape_string, men förstod inte speciellt mycket om det.

Känner någon att hen vill berätta för mig varför man skall använda den funktionen i denna?

captaindoe 2012-03-22 18:00

Låt oss säga att du har en sökfunktion och du hanterar den såhär:

PHP-kod:

mysql_query("SELECT * FROM search WHERE text='" $_GET['search'] . "'") or die(mysql_error()); 

Om en person skriver in:

Kod:

'; DROP TABLE search;
när de använder din sökfunktion kommer alltså din MySQL query att bli följande:

Kod:

SELECT * FROM search WHERE text=''; DROP TABLE search; '
Vilket är två stycken MySQL queries, den första queryen som hämtar all info från tabellen search, och den andra queryn raderar hela din tabell.

Om du använder
PHP-kod:

mysql_real_escape_string() 

så kommer frågan att se hur såhära:

Kod:

SELECT * FROM search WHERE text='\'; DROP TABLE search; '
Vilket betyder att MySQL endast kommer att se det som en fråga eftersom ' är "utkommenterat".

(Ber om ursäkt för min försvenskning av de engelska orden).

Jine 2012-03-22 18:15

Det captaindoe skrev fungerar dock inte i praktiken (iom att du inte kan köra dubbla queries i en mysql_query())

MEN!!!! Det är vääldigt viktigt att ALDRIG lita på NÅGOT användaren skriver, escape:a och rensa alltid, allt!

Enklaste sättet är att göra såhär:

$minvariabel = mysql_real_escape_string($_GET['var']);

På... allt :)

jonssondesign 2012-03-22 19:56

Jag förstår!

Det är med andra ord, väldigt dumt att inte använda mysql_real_escape! :P

Jake.Nu 2012-03-23 01:00

Ger man en normal klient rättigheter att köra "DROP TABLE" så är man nog fel ute på annat håll..
Använder man 'prepared statements' så är det säkert mot denna typen av injektioner i.a.f.

jonssondesign 2012-03-23 10:21

Jake, du förstår det att jag har hållit på med php i drygt 5 dagar nu, 3 dagar när jag först la ut tråden.

Så jag hoppas du förstår att mina kunskaper om hur allt fungerar, och vad som kan hända pga vissa saker, inte riktigt har trängt in i min hjärta ännu :P Men de kommer!

tartareandesire 2012-03-23 10:50

jonssondesign, du kan vara lugn. De flesta nybörjare gör det där misstaget och även många som sysslat med php betydligt längre än dig. En del anser uppenbarligen att man ska kunna allting redan innan man börjar koda :) Det är inte mycket att bry sig om, det är bra att du tar till dig saker och ting och försöker lära dig ordentligt.

Jawn 2012-03-23 12:05

Om du ska lära dig koda så börja leka med MYSQLI Prepare statements http://www.php.net/manual/en/mysqli.prepare.php

tartareandesire 2012-03-23 12:19

Citat:

Ursprungligen postat av Jawn (Inlägg 20435791)
Om du ska lära dig koda så börja leka med MYSQLI Prepare statements http://www.php.net/manual/en/mysqli.prepare.php

Man får nog en bättre förståelse för språket och programmering överlag om man lär sig vanliga "gamla" mysql-kommandon först tror jag. Beror väl lite på vilket syfte man har. Prepared statements är helt klart enklare om man vill undvika problem.

danjel 2012-03-23 13:18

Eller kör PDO om servern har det installerat, vilket de flesta har..
Så detta är tex säkert mot sql injection:

$dbh = new PDO(..);

$stmt = $dbh->prepare('SELECT * FROM users where username = :username');
$stmt->execute( array(':username' => $_POST['username']) );

jonssondesign 2012-03-24 01:37

Så fort jag ser dessa " => " fattar jag, negativt 1000... Du läste rätt, inte noll, utan negativt 1000! >.< :D

Jag tror jag får kolla runt på lite fler tutorials och kolla lite mer på php.net, sen kan jag nog lite till :) De är faktiskt roligt att koda!
Jag har tidigare bara gjort design och front-end kodning i typ 10 år. Kände att jag ville avancera lite och erbjuda mina kunder lite mer :) Det är egentligen därför som jag försöker lära mig php och mysql nu.

Får tacka er alla för den hjälp ni har gett mig. Just nu sitter jag och kodar på ett nytt (enkelt) projekt som jag tänkte att ni skulle få kommentera senare. Säger till när det börjar på att bli dags för lite feedback :D

tartareandesire 2012-03-24 12:48

Citat:

Ursprungligen postat av jonssondesign (Inlägg 20435847)
Så fort jag ser dessa " => " fattar jag, negativt 1000... Du läste rätt, inte noll, utan negativt 1000! >.< :D

Det innebär bara att du tilldelar värden i en array. '->' innebär att du försöker komma åt en variabel eller funktion i ett objekt.

jonssondesign 2012-03-24 15:01

Förstår fortfarande inte >.<

Vet att en array används när man vill lagra flera saker. typ, olika variablar? eller?

Typ:

$a = "Hejsan ";
$b = "Mitt efternamn ";
$c = "är ";

$x = array($a, $b, $c, jonsson);

Det där är väl en fungerande array? Or isn't it?

Ska man då kunna göra såhär:

echo $x -> 4;

Det betyder att den skriver ut "är " i ren html ?

*EDIT!

Antar att den börjar från 0? Alltså är $a = 0, $b = 1, $c = 2 och jonsson = 3?

Jine 2012-03-24 15:42

Kod:



$a = "Hejsan ";
$b = "Mitt efternamn ";
$c = "är ";

$x = array($a, $b, $c, 'jonsson');

Skapar absolut en array. Tänk arrayer som en bokhylla med olika hyllplan. Notera dock att du måste använda " eller ' om du ska lägga till strängar direkt i en array.

Du verkar dock blanda ihop arrayer och objekt tror jag, lite osäker på vad du menar med "->" iaf, det är inget giltigt syntax. Inte heller har HTML något med arrayens innehåll eller så att göra, den skriver ut det den har i sig, oavsett om det är binärdata eller text.


Du kan t.ex. använda echo för att printa värdet av variabeln på "plats" 4 genom:
echo $array[3]; // Och ja, mycket riktigt början den räkna på 0, så 0 = 1, 1 = 2, 2 = 3, 3 = 4 osv.

Läs mer om arrayer här: http://archive.64bits.se/guider/php-skola/index2.php

jonssondesign 2012-03-24 17:36

Okej, tror jag börjar på att förstår array lite faktiskt. Dock det här med objekt har jag inte fått kläm på riktigt än..

Kom och tänka på en sak som tas upp på sidan du länkade Jine.

Hen som skriver skriver sina array'er såhär:

$namn[0] = "Fredrik Jonsson";
$namn[1] = "Jessica hildenborg";
$namn[2] = "Rickard jonsson";

och sen om man vill visa "Rickard jonsson" som en text på en hemsida, så skriver man:

echo $namn[2]; Eller hur?

Men om man vill komprimera ovanstående kod, kan man lika gärna skriva:

$namn = array("Fredrik JOnsson", "Jessica hildenborg", "Rickard jonsson");

echo $namn[2];

Men om man vill namnge "facken" då?

Såg att hen tog upp detta:

$array['namn'] = "Fredrik Jonsson";
$array['alder'] = 22;
$array['stad'] = "Strängnäs";

kan man skriva såhär istället?:

$array = array('namn' -> "Fredrik Jonsson", 'alder' -> 2, 'stad' -> "Strängnäs");

och sen om man vill skriva ut Strängnäs, så skriver man:

echo $array[2];
echo $array['stad'];

Antar att båda går lika bra?

Detta var nämligen inget personen bakom 64bits skrev om..

Jine 2012-03-24 17:38

Kod:

$array = array('namn' => "Fredrik Jonsson", 'alder' => 2, 'stad' => "Strängnäs");
Ska det vara, annars helt korrekt.

Objekt tycker jag du kan strunta i atm, det är lite överkurs innan man lärt sig hantera array:er helt, iom att det är så mycket mer än en array.

jonssondesign 2012-03-24 18:08

Okej, så ett "lika med"-täcken alltså.. Ajaa, jag tar problemen när dom kommer ;)
De är ganska många elektroner som flyger runt i min hjärna och försöker spara så mycket information som möjligt just nu :P

Tack till er alla för all hjälp, återkommer om jag behöver mer hjälp! Ska läsa vidare på sidan du länkade Jine. Tack! :)

Conny Westh 2012-03-25 14:03

Jag tycker man ska börja med objekt så tidigt som möjligt. I synnerhet om man har komplexa strukturer med information som ett personobjekt som i detta fall. Jag kör inte PHP så just det språket kan jag inte hjälpa till med.

Varje element i en array bör helt enkelt vara ett komplett objekt så hela arrayen hanterar samma typ av objekt. Det blir enklare att hantera mentalt.

Objektorientering kan med fördel användas för att dölja komplexitet, dvs göra det enklare för den mänskliga hjärnan att hantera komplexa frågor.

jonssondesign 2012-03-25 14:14

Får ta och läsa på hur man utvecklar objekt helt enkelt :) Vill så klart lära mig så mycket som möjligt.

Jag anser att jag kan html och css nästan fullt ut nu, med tanke på att jag har jobbat med det i drygt 10 år (endast html och css).. Dags att vidareutveckla sig känner jag :P

Försöker lära mig php och mysql just nu, men sneglar en hel del på jquery också.


Alla tider är GMT +2. Klockan är nu 05:45.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson